1local arch = config.target.platform:match('[^-]*')
2set('cflags_auto', {
3 '-fomit-frame-pointer',
4 '-fno-unwind-tables',
5 '-fno-asynchronous-unwind-tables',
6 '-ffunction-sections',
7 '-fdata-sections',
8})
9set('cflags_c99fse', {
10 '-std=c99',
11 '-nostdinc',
12 '-ffreestanding',
13 '-fexcess-precision=standard',
14 '-frounding-math',
15 '-Wa,--noexecstack',
16})
17set('cflags_nossp', '-fno-stack-protector')
18set('cflags_memops', '-fno-tree-loop-distribute-patterns')
19cflags{
20 '$cflags_auto',
21 '$cflags_c99fse',
22 '-Wno-return-local-addr',
23 '-fPIC',
24 '-D _XOPEN_SOURCE=700',
25 '-I $srcdir/arch/'..arch,
26 '-I $srcdir/arch/generic',
27 '-I $outdir',
28 '-I $srcdir/src/include',
29 '-I $srcdir/src/internal',
30 '-I $outdir/include',
31}
32set('ldflags', {
33 '$ldflags',
34 '-Wl,--sort-section,alignment',
35 '-Wl,--sort-common',
36 '-Wl,--gc-sections',
37 '-Wl,--hash-style=both',
38 '-Wl,--no-undefined',
39 '-Wl,--exclude-libs=ALL',
40 '-Wl,--dynamic-list=$srcdir/dynamic.list',
41})
42
43local basefiles = load('base.lua')
44local archfiles = load(arch..'.lua')
45
46local bits = {}
47for _, hdr in ipairs(archfiles.bits) do
48 archfiles.bits[hdr] = true
49end
50for _, hdr in ipairs(basefiles.bits) do
51 if not archfiles.bits[hdr] then
52 table.insert(bits, hdr)
53 end
54end
55
56pkg.hdrs = {
57 copy('$outdir/include', '$srcdir/include', basefiles.hdrs),
58 copy('$outdir/include/bits', '$srcdir/arch/'..arch..'/bits', archfiles.bits),
59 copy('$outdir/include/bits', '$srcdir/arch/generic/bits', bits),
60 '$outdir/include/bits/alltypes.h',
61 '$outdir/include/bits/syscall.h',
62 install=true,
63}
64pkg.deps = {
65 '$gendir/headers',
66 '$outdir/version.h',
67}
68
69build('sed', '$outdir/include/bits/alltypes.h', {
70 '$srcdir/arch/'..arch..'/bits/alltypes.h.in',
71 '$srcdir/include/alltypes.h.in',
72 '|', '$srcdir/tools/mkalltypes.sed',
73}, {expr='-f $srcdir/tools/mkalltypes.sed'})
74
75build('sed', '$outdir/include/bits/syscall.h', {'$srcdir/arch/'..arch..'/bits/syscall.h.in'}, {
76 expr=[[-n -e 'p;s,__NR_,SYS_,p']],
77})
78
79build('awk', '$outdir/version.h', '$dir/ver', {expr=[['{printf "#define VERSION \"%s\"\n", $$1}']]})
80
81local srcs, objs = {}, {}
82for src in iterstrings{basefiles.srcs, archfiles.srcs} do
83 srcs[src:match('(.*)%.'):gsub('/'..arch..'/', '/', 1)] = src
84end
85local specialcflags = {
86 -- src/Makefile:/^MEMOPS_OBJS
87 -- src/Makefile:/^NOSSP_OBJS
88 __init_tls='$cflags $cflags_nossp',
89 __libc_start_main='$cflags $cflags_nossp',
90 __set_thread_area='$cflags $cflags_nossp',
91 __stack_chk_fail='$cflags $cflags_nossp',
92 memcpy='$cflags $cflags_memops $cflags_nossp',
93 memmove='$cflags $cflags_memops',
94 memset='$cflags $cflags_memops $cflags_nossp',
95 memcmp='$cflags $cflags_memops',
96}
97for _, src in pairs(srcs) do
98 table.insert(objs, cc(src, nil, {cflags=specialcflags[src:match('([^/]*)%.[^/.]*$')]}))
99end
100table.sort(objs)
101
102ar('libc.a', objs)
103file('lib/libc.a', '644', '$outdir/libc.a')
104exe('libc.so', {'ldso/dlstart.c', 'ldso/dynlink.c', objs}, nil, {
105 cflags='$cflags $cflags_nossp',
106 ldflags='$ldflags -nostdlib -shared -Wl,-e,_dlstart',
107 ldlibs='-lgcc',
108})
109file('lib/libc.so', '755', '$outdir/libc.so')
110sym('lib/ld-musl-'..arch..'.so.1', 'libc.so')
111sym('bin/ldd', '../lib/libc.so')
112
113for _, lib in ipairs{'libm.a', 'librt.a', 'libpthread.a', 'libcrypt.a', 'libutil.a', 'libxnet.a', 'libresolv.a', 'libdl.a'} do
114 ar(lib, {})
115 file('lib/'..lib, '644', '$outdir/'..lib)
116end
117
118local startfiles = {'$outdir/libc.a'}
119local crts = {}
120for src in iterstrings{basefiles.crts, archfiles.crts} do
121 crts[src:match('(.*)%.'):gsub('/'..arch..'/', '/', 1)] = src
122end
123for _, src in pairs(crts) do
124 local obj = src:gsub('.-(%w*)%.[cs]$', '%1.o')
125 local out = '$outdir/'..obj
126 build('cc', out, {'$srcdir/'..src, '|', '$gendir/deps'}, {cflags='$cflags $cflags_nossp'})
127 file('lib/'..obj, '644', out)
128 table.insert(startfiles, out)
129end
130phony('startfiles', startfiles)
131
132fetch 'git'