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'