mirror of
https://github.com/oasislinux/oasis.git
synced 2026-05-12 21:34:47 +02:00
efd997922b
This will facilitate the addition of architectures like riscv64 which use the generic crti.c and crtn.c.
133 lines
3.7 KiB
Lua
133 lines
3.7 KiB
Lua
local arch = config.target.platform:match('[^-]*')
|
|
set('cflags_auto', {
|
|
'-fomit-frame-pointer',
|
|
'-fno-unwind-tables',
|
|
'-fno-asynchronous-unwind-tables',
|
|
'-ffunction-sections',
|
|
'-fdata-sections',
|
|
})
|
|
set('cflags_c99fse', {
|
|
'-std=c99',
|
|
'-nostdinc',
|
|
'-ffreestanding',
|
|
'-fexcess-precision=standard',
|
|
'-frounding-math',
|
|
'-Wa,--noexecstack',
|
|
})
|
|
set('cflags_nossp', '-fno-stack-protector')
|
|
set('cflags_memops', '-fno-tree-loop-distribute-patterns')
|
|
cflags{
|
|
'$cflags_auto',
|
|
'$cflags_c99fse',
|
|
'-Wno-return-local-addr',
|
|
'-fPIC',
|
|
'-D _XOPEN_SOURCE=700',
|
|
'-I $srcdir/arch/'..arch,
|
|
'-I $srcdir/arch/generic',
|
|
'-I $outdir',
|
|
'-I $srcdir/src/include',
|
|
'-I $srcdir/src/internal',
|
|
'-I $outdir/include',
|
|
}
|
|
set('ldflags', {
|
|
'$ldflags',
|
|
'-Wl,--sort-section,alignment',
|
|
'-Wl,--sort-common',
|
|
'-Wl,--gc-sections',
|
|
'-Wl,--hash-style=both',
|
|
'-Wl,--no-undefined',
|
|
'-Wl,--exclude-libs=ALL',
|
|
'-Wl,--dynamic-list=$srcdir/dynamic.list',
|
|
})
|
|
|
|
local basefiles = load('base.lua')
|
|
local archfiles = load(arch..'.lua')
|
|
|
|
local bits = {}
|
|
for _, hdr in ipairs(archfiles.bits) do
|
|
archfiles.bits[hdr] = true
|
|
end
|
|
for _, hdr in ipairs(basefiles.bits) do
|
|
if not archfiles.bits[hdr] then
|
|
table.insert(bits, hdr)
|
|
end
|
|
end
|
|
|
|
pkg.hdrs = {
|
|
copy('$outdir/include', '$srcdir/include', basefiles.hdrs),
|
|
copy('$outdir/include/bits', '$srcdir/arch/'..arch..'/bits', archfiles.bits),
|
|
copy('$outdir/include/bits', '$srcdir/arch/generic/bits', bits),
|
|
'$outdir/include/bits/alltypes.h',
|
|
'$outdir/include/bits/syscall.h',
|
|
install=true,
|
|
}
|
|
pkg.deps = {
|
|
'$gendir/headers',
|
|
'$outdir/version.h',
|
|
}
|
|
|
|
build('sed', '$outdir/include/bits/alltypes.h', {
|
|
'$srcdir/arch/'..arch..'/bits/alltypes.h.in',
|
|
'$srcdir/include/alltypes.h.in',
|
|
'|', '$srcdir/tools/mkalltypes.sed',
|
|
}, {expr='-f $srcdir/tools/mkalltypes.sed'})
|
|
|
|
build('sed', '$outdir/include/bits/syscall.h', {'$srcdir/arch/'..arch..'/bits/syscall.h.in'}, {
|
|
expr=[[-n -e 'p;s,__NR_,SYS_,p']],
|
|
})
|
|
|
|
build('awk', '$outdir/version.h', '$dir/ver', {expr=[['{printf "#define VERSION \"%s\"\n", $$1}']]})
|
|
|
|
local srcs, objs = {}, {}
|
|
for src in iterstrings{basefiles.srcs, archfiles.srcs} do
|
|
srcs[src:match('(.*)%.'):gsub('/'..arch..'/', '/', 1)] = src
|
|
end
|
|
local specialcflags = {
|
|
-- src/Makefile:/^MEMOPS_OBJS
|
|
-- src/Makefile:/^NOSSP_OBJS
|
|
__init_tls='$cflags $cflags_nossp',
|
|
__libc_start_main='$cflags $cflags_nossp',
|
|
__set_thread_area='$cflags $cflags_nossp',
|
|
__stack_chk_fail='$cflags $cflags_nossp',
|
|
memcpy='$cflags $cflags_memops $cflags_nossp',
|
|
memmove='$cflags $cflags_memops',
|
|
memset='$cflags $cflags_memops $cflags_nossp',
|
|
memcmp='$cflags $cflags_memops',
|
|
}
|
|
for _, src in pairs(srcs) do
|
|
table.insert(objs, cc(src, nil, {cflags=specialcflags[src:match('([^/]*)%.[^/.]*$')]}))
|
|
end
|
|
table.sort(objs)
|
|
|
|
ar('libc.a', objs)
|
|
file('lib/libc.a', '644', '$outdir/libc.a')
|
|
exe('libc.so', {'ldso/dlstart.c', 'ldso/dynlink.c', objs}, nil, {
|
|
cflags='$cflags $cflags_nossp',
|
|
ldflags='$ldflags -nostdlib -shared -Wl,-e,_dlstart',
|
|
ldlibs='-lgcc',
|
|
})
|
|
file('lib/libc.so', '755', '$outdir/libc.so')
|
|
sym('lib/ld-musl-'..arch..'.so.1', 'libc.so')
|
|
sym('bin/ldd', '../lib/libc.so')
|
|
|
|
for _, lib in ipairs{'libm.a', 'librt.a', 'libpthread.a', 'libcrypt.a', 'libutil.a', 'libxnet.a', 'libresolv.a', 'libdl.a'} do
|
|
ar(lib, {})
|
|
file('lib/'..lib, '644', '$outdir/'..lib)
|
|
end
|
|
|
|
local startfiles = {'$outdir/libc.a'}
|
|
local crts = {}
|
|
for src in iterstrings{basefiles.crts, archfiles.crts} do
|
|
crts[src:match('(.*)%.'):gsub('/'..arch..'/', '/', 1)] = src
|
|
end
|
|
for _, src in pairs(crts) do
|
|
local obj = src:gsub('.-(%w*)%.[cs]$', '%1.o')
|
|
local out = '$outdir/'..obj
|
|
build('cc', out, {'$srcdir/'..src, '|', '$gendir/deps'}, {cflags='$cflags $cflags_nossp'})
|
|
file('lib/'..obj, '644', out)
|
|
table.insert(startfiles, out)
|
|
end
|
|
phony('startfiles', startfiles)
|
|
|
|
fetch 'git'
|