master hovercats/oakiss / pkg / musl / gen.lua
  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'