master hovercats/oakiss / pkg / binutils / gen.lua
  1local targets = {
  2	-- when adding a new target, check that archs[1] matches gas cpu_type
  3	x86_64={
  4		vecs={'x86_64_elf64_vec', 'i386_elf32_vec'},
  5		archs={'i386'},
  6		emuls={'elf_x86_64', 'elf_i386'},
  7	},
  8	aarch64={
  9		vecs={'aarch64_elf64_le_vec'},
 10		archs={'aarch64'},
 11		emuls={'aarch64elf', 'aarch64linux', 'aarch64elfb'},
 12	}
 13}
 14local arch = config.target.platform:match('[^-]*')
 15local targ = targets[arch]
 16if not targ then
 17	return
 18end
 19
 20local version = {2, 46, 0}
 21local emuls = targets[arch].emuls
 22local selarchs = {}
 23for _, a in pairs(targets[arch].archs) do selarchs[a] = true end
 24
 25cflags{
 26	'-std=c99', '-Wall', '-Wno-return-local-addr', '-Wno-stringop-truncation',
 27	'-D _POSIX_C_SOURCE=200809L',
 28	'-D HAVE_CONFIG_H',
 29	'-I $srcdir/include',
 30	'-I $outdir/bfd',
 31	'-I $srcdir/bfd',
 32	'-isystem $builddir/pkg/zlib/include',
 33}
 34
 35pkg.deps = {
 36	'pkg/zlib/headers',
 37	'$outdir/bfd/bfd.h',
 38	'$outdir/bfd/bfdver.h',
 39	'$outdir/bfd/bfd_stdint.h',
 40}
 41
 42sub('libiberty.ninja', function()
 43	cflags{'-I $dir/libiberty'}
 44	-- src/libiberty/Makefile.in:/^REQUIRED_OFILES
 45	lib('libiberty.a', [[libiberty/(
 46		regex.c cplus-dem.c cp-demangle.c
 47		md5.c sha1.c alloca.c
 48		argv.c
 49		choose-temp.c concat.c
 50		cp-demint.c crc32.c d-demangle.c
 51		dwarfnames.c dyn-string.c
 52		fdmatch.c fibheap.c
 53		filedescriptor.c
 54		filename_cmp.c floatformat.c
 55		fnmatch.c fopen_unlocked.c
 56		getopt.c getopt1.c getpwd.c
 57		getruntime.c hashtab.c hex.c
 58		lbasename.c ldirname.c lrealpath.c
 59		make-relative-prefix.c make-temp-file.c
 60		objalloc.c
 61		obstack.c
 62		partition.c pexecute.c physmem.c
 63		pex-common.c pex-one.c
 64		pex-unix.c
 65		rust-demangle.c
 66		safe-ctype.c
 67		simple-object.c simple-object-coff.c
 68		simple-object-elf.c simple-object-mach-o.c
 69		simple-object-xcoff.c
 70		sort.c spaces.c
 71		splay-tree.c stack-limit.c
 72		strerror.c strsignal.c
 73		timeval-utils.c unlink-if-ordinary.c
 74		xasprintf.c xatexit.c xexit.c
 75		xmalloc.c xmemdup.c xstrdup.c
 76		xstrerror.c xstrndup.c
 77		xvasprintf.c
 78	)]])
 79end)
 80
 81sub('libsframe.ninja', function()
 82	cflags{
 83		'-I $dir/libsframe',
 84		'-I $srcdir/libctf',  -- for swap.h
 85	}
 86	lib('libsframe.a', 'libsframe/(sframe.c sframe-dump.c sframe-error.c)')
 87end)
 88
 89sub('bfd.ninja', function()
 90	cflags{
 91		'-D OBJ_MAYBE_ELF',
 92		'-I $dir/bfd',
 93	}
 94	build('sed', '$outdir/bfd/bfd.h', '$srcdir/bfd/bfd-in2.h', {expr={
 95		'-e s,@supports_plugins@,0,',
 96		'-e s,@wordsize@,64,',
 97		'-e s,@bfd_default_target_size@,64,',
 98		[[-e 's,@BFD_INT64_FMT@,__PRI64,']],
 99		'-e s,@bfd_file_ptr@,int64_t,',
100		'-e s,@bfd_ufile_ptr@,uint64_t,',
101	}})
102	build('sed', '$outdir/bfd/bfdver.h', '$srcdir/bfd/version.h', {expr={
103		string.format('-e s,@bfd_version@,%d%02d%02d,', version[1], version[2], version[3]),
104		string.format([[-e 's,@bfd_version_string@,"%s",']], table.concat(version, '.')),
105		[[-e 's,@bfd_version_package@,"(GNU Binutils) ",']],
106		[[-e 's,@report_bugs_to@,"<http://www.sourceware.org/bugzilla/>",']],
107	}})
108	build('printf', '$outdir/bfd/bfd_stdint.h', nil, {args=[['#include <stdint.h>\n']]})
109	build('sed', '$outdir/bfd/targmatch.h', {'$srcdir/bfd/config.bfd', '|', '$srcdir/bfd/targmatch.sed'}, {
110		expr='-f $srcdir/bfd/targmatch.sed',
111	})
112	build('sed', '$outdir/bfd/elf32-target.h', '$srcdir/bfd/elfxx-target.h', {expr='-e s,NN,32,g'})
113	build('sed', '$outdir/bfd/elf64-target.h', '$srcdir/bfd/elfxx-target.h', {expr='-e s,NN,64,g'})
114	build('sed', '$outdir/bfd/pex64igen.c', '$srcdir/bfd/peXXigen.c', {expr='-e s,XX,pex64,g'})
115	build('sed', '$outdir/bfd/peigen.c', '$srcdir/bfd/peXXigen.c', {expr='-e s,XX,pe,g'})
116	build('sed', '$outdir/bfd/elf64-aarch64.c', '$srcdir/bfd/elfnn-aarch64.c', {expr='-e s,NN,64,g'})
117
118	-- src/bfd/config.bfd
119	local selvecs = {}
120	for _, vec in ipairs(targets[arch].vecs) do
121		selvecs[vec] = true
122		if vec:find('elf64') or vec:find('mips_elf32_n') then
123			selvecs.elf64_le_vec = true
124			selvecs.elf64_be_vec = true
125		end
126		if vec:find('elf32') or vec:find('elf64') or vec:find('mips_elf32_n') then
127			selvecs.elf32_le_vec = true
128			selvecs.elf32_be_vec = true
129		end
130		if vec:find('iamcu_elf32') then
131			selarchs.iamcu = true
132		end
133	end
134	local srcs = {}
135	local special = {
136		['dwarf2.c']='bfd/dwarf2.c.o',
137		['peigen.c']='$outdir/bfd/peigen.c',
138		['pex64igen.c']='$outdir/bfd/pex64igen.c',
139		['elf64-aarch64.c']='$outdir/bfd/elf64-aarch64.c',
140	}
141	for vec, vecsrcs in pairs(load 'vec.lua') do
142		if selvecs[vec] then
143			for src in iterstrings(vecsrcs) do
144				srcs[special[src] or 'bfd/'..src] = true
145			end
146		end
147	end
148	for arch in pairs(selarchs) do
149		srcs['bfd/cpu-'..arch..'.c'] = true
150	end
151	local deps = {
152		'$gendir/deps',
153		'$outdir/bfd/targmatch.h',
154		'$outdir/bfd/elf32-target.h',
155		'$outdir/bfd/elf64-target.h',
156	}
157	local selvecnames = table.keys(selvecs)
158	cc('bfd/targets.c', nil, {cflags={
159		'$cflags',
160		'-D DEFAULT_VECTOR='..selvecnames[1],
161		'-D HAVE_'..table.concat(selvecnames, ' -D HAVE_'),
162		string.format([[-D 'SELECT_VECS=&%s']], table.concat(selvecnames, ',&')),
163	}})
164	cc('bfd/archures.c', nil, {cflags={
165		'$cflags',
166		string.format([[-D 'SELECT_ARCHITECTURES=&bfd_%s_arch']], table.concat(table.keys(selarchs), '_arch,&bfd_')),
167	}})
168	cc('bfd/dwarf2.c', nil, {cflags={'$cflags', string.format([[-D 'DEBUGDIR="%s/lib/debug"']], config.prefix)}})
169	lib('libbfd.a', {
170		-- src/bfd/Makefile.am:/^BFD32_LIBS_CFILES
171		-- src/bfd/Makefile.am:/^BFD64_LIBS_CFILES
172		paths[[bfd/(
173			archive.c archures.c.o bfd.c bfdio.c cache.c
174			coff-bfd.c compress.c corefile.c format.c
175			hash.c libbfd.c linker.c merge.c opncls.c reloc.c
176			section.c simple.c stab-syms.c stabs.c syms.c targets.c.o
177			binary.c ihex.c srec.c tekhex.c verilog.c
178
179			archive64.c
180		)]],
181		table.keys(srcs),
182		'libsframe.a',
183		'libiberty.a',
184		'$builddir/pkg/zlib/libz.a',
185	}, deps)
186end)
187
188sub('opcodes.ninja', function()
189	cflags{'-I $dir/opcodes'}
190	local srcs = {}
191	for arch, archsrcs in pairs(load 'arch.lua') do
192		if selarchs[arch] then
193			for src in iterstrings(archsrcs) do
194				srcs['opcodes/'..src] = true
195			end
196		end
197	end
198	cc('opcodes/disassemble.c', nil, {cflags={
199		'$cflags', '-D ARCH_'..table.concat(table.keys(selarchs), ' -D ARCH_'),
200	}})
201	lib('libopcodes.a', {
202		paths[[opcodes/(dis-buf.c disassemble.c.o dis-init.c)]],
203		table.keys(srcs),
204	})
205end)
206
207sub('binutils.ninja', function()
208	cflags{
209		string.format([[-D 'LOCALEDIR="%s/share/locale"']], config.prefix),
210		string.format([[-D 'TARGET="%s-unknown-linux-musl"']], arch),
211		'-D bin_dummy_emulation=bin_vanilla_emulation',
212		'-I $dir/binutils',
213		'-I $srcdir/binutils',
214	}
215	lib('libcommon.a', [[
216		binutils/(
217			bucomm.c version.c filemode.c rename.c
218			elfcomm.c
219			rddbg.c debug.c stabs.c rdcoff.c wrstabs.c
220			dwarf.c demanguse.c
221		)
222		libbfd.a.d
223		libiberty.a
224	]])
225
226	cc('binutils/objdump.c', nil, {cflags='$cflags -D OBJDUMP_PRIVATE_VECTORS='})
227	exe('bin/size',    [[binutils/size.c                    libcommon.a.d]])
228	exe('bin/objcopy', [[binutils/not-strip.c               libcommon.a.d]])
229	exe('bin/strings', [[binutils/strings.c                 libcommon.a.d]])
230	exe('bin/readelf', [[binutils/(readelf.c unwind-ia64.c) libcommon.a.d]])
231	exe('bin/elfedit', [[binutils/elfedit.c                 libcommon.a.d]])
232	exe('bin/strip',   [[binutils/is-strip.c                libcommon.a.d]])
233	exe('bin/nm',      [[binutils/nm.c                      libcommon.a.d]])
234	exe('bin/objdump', [[binutils/(objdump.c.o prdbg.c)     libcommon.a.d libopcodes.a]])
235	exe('bin/addr2line', [[binutils/addr2line.c             libcommon.a.d]])
236
237	local arobjs = objects[[
238		binutils/(
239			arparse.c arlex.c arsup.c binemul.c
240			emul_vanilla.c
241		)
242		libcommon.a.d
243	]]
244	exe('bin/ar', {arobjs, 'binutils/not-ranlib.c'})
245	exe('bin/ranlib', {arobjs, 'binutils/is-ranlib.c'})
246
247	for _, tool in ipairs{'size', 'objcopy', 'strings', 'readelf', 'elfedit', 'strip', 'nm', 'objdump', 'addr2line', 'ar', 'ranlib'} do
248		file('bin/'..tool, '755', '$outdir/bin/'..tool)
249		man{'binutils/doc/'..tool..'.1'}
250		sym(string.format('bin/%s-%s', config.target.platform, tool), tool)
251	end
252end)
253
254sub('gas.ninja', function()
255
256	cflags{
257		'-I $dir/gas',
258		'-I $outdir/gas',
259		'-I $srcdir/gas',
260		'-I $srcdir/gas/config',
261		'-I $srcdir',
262		string.format([[-D 'DEFAULT_ARCH="%s"']], arch),
263		string.format([[-D 'DEFAULT_EMULATION="%s"']], emuls[1]),
264		string.format([[-D 'EMULATIONS=&%s,']], table.concat(emuls, ',&')),
265		string.format([[-D 'TARGET_ALIAS="%s-linux-musl"']], arch),
266		string.format([[-D 'TARGET_CANONICAL="%s-unknown-linux-musl"']], arch),
267		string.format([[-D 'TARGET_CPU="%s"']], arch),
268	}
269	build('copy', '$outdir/gas/targ-cpu.h', '$srcdir/gas/config/tc-'..targ.archs[1]..'.h')
270	build('copy', '$outdir/gas/targ-env.h', '$srcdir/gas/config/te-linux.h')
271	build('copy', '$outdir/gas/obj-format.h', '$srcdir/gas/config/obj-elf.h')
272
273	local deps = {
274		'$gendir/deps',
275		'$outdir/gas/targ-cpu.h',
276		'$outdir/gas/targ-env.h',
277		'$outdir/gas/obj-format.h',
278	}
279	-- src/gas/Makefile.am:/^GAS_CFILES
280	local srcs = paths[[
281		gas/(
282			app.c
283			as.c
284			atof-generic.c
285			codeview.c
286			compress-debug.c
287			cond.c
288			depend.c
289			dwarf2dbg.c
290			dw2gencfi.c
291			ecoff.c
292			ehopt.c
293			expr.c
294			flonum-copy.c
295			flonum-konst.c
296			flonum-mult.c
297			frags.c
298			gen-sframe.c
299			ginsn.c
300			hash.c
301			input-file.c
302			input-scrub.c
303			listing.c
304			literal.c
305			macro.c
306			messages.c
307			output-file.c
308			read.c
309			remap.c
310			sb.c
311			scfidw2gen.c
312			scfi.c
313			sframe-opt.c
314			stabs.c
315			subsegs.c
316			symbols.c
317			write.c
318
319			config/(obj-elf.c atof-ieee.c)
320		)
321	]]
322	if arch == 'aarch64' then
323		table.insert(srcs, 'gas/config/obj-elf-attr.c')
324	end
325	exe('bin/as', {
326		srcs,
327		'gas/config/tc-'..targ.archs[1]..'.c',
328		'libopcodes.a',
329		'libbfd.a.d',
330	}, deps)
331	file('bin/as', '755', '$outdir/bin/as')
332	sym(string.format('bin/%s-as', config.target.platform), 'as')
333	man{'gas/doc/as.1'}
334end)
335
336sub('ld.ninja', function()
337	cflags{
338		'-D ELF_LIST_OPTIONS=true',
339		'-D ELF_SHLIB_LIST_OPTIONS=true',
340		'-D ELF_PLT_UNWIND_LIST_OPTIONS=true',
341		'-D ELF_SFRAME_LIST_OPTIONS=true',
342		string.format([[-D 'BINDIR="%s/bin"']], config.prefix),
343		string.format([[-D 'SCRIPTDIR="%s/%s/lib"']], config.prefix, config.target.platform),
344		string.format([[-D 'TOOLBINDIR="%s/%s/bin"']], config.prefix, config.target.platform),
345		'-I $dir/ld',
346		'-I $outdir/ld',
347		'-I $srcdir/ld',
348	}
349	local deps = {
350		'$gendir/deps',
351		'$outdir/ld/ldemul-list.h',
352	}
353
354	rule('ldemul', 'sh $dir/ldemul.sh $emuls >$out')
355	build('ldemul', '$outdir/ld/ldemul-list.h', {'|', '$dir/ldemul.sh'}, {emuls=emuls})
356
357	rule('genscripts', string.format([[cd $outdir/ld && mkdir -p ldscripts && LIB_PATH= sh $$OLDPWD/$srcdir/ld/genscripts.sh $$OLDPWD/$srcdir/ld /lib '' '' %s %s %s '' /lib '%s' /lib no yes $emul %s]], config.target.platform, config.target.platform, config.target.platform, table.concat(emuls, ' '), config.target.platform))
358	local srcs = {}
359	for _, emul in ipairs(emuls) do
360		local out = string.format('$outdir/ld/e%s.c', emul)
361		table.insert(srcs, out)
362		build('genscripts', string.format('$outdir/ld/e%s.c', emul), {'|', '$srcdir/ld/genscripts.sh'}, {emul=emul})
363	end
364
365	cc('ld/ldmain.c', nil, {cflags={
366		'$cflags',
367		string.format([[-D 'DEFAULT_EMULATION="%s"']], emuls[1]),
368		string.format([[-D 'TARGET="%s-unknown-linux-musl"']], arch)
369	}})
370	exe('bin/ld', {
371		-- src/ld/Makefile.am:/^ld_new_SOURCES
372		-- src/ld/configure.tgt:/^targ_extra_ofiles
373		paths[[
374			ld/(
375				ldgram.c ldlex-wrapper.c lexsup.c ldlang.c mri.c ldctor.c ldmain.c.o
376				ldwrite.c ldexp.c ldemul.c ldver.c ldmisc.c ldfile.c ldcref.c plugin.c
377				ldbuildid.c
378
379				ldelf.c ldelfgen.c
380			)
381			libbfd.a.d
382		]],
383		srcs,
384	}, deps)
385	file('bin/ld', '755', '$outdir/bin/ld')
386	sym(string.format('bin/%s-ld', config.target.platform), 'ld')
387	man{'ld/ld.1'}
388end)
389
390fetch 'curl'