logo

oasis

Own branch of Oasis Linux (upstream: <https://git.sr.ht/~mcf/oasis/>) git clone https://anongit.hacktivis.me/git/oasis.git

gen.lua (11479B)


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