1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 # The yasm build process creates a slew of small C subprograms that 6 # dynamically generate files at various point in the build process. This makes 7 # the build integration moderately complex. 8 # 9 # There are three classes of dynamically generated files: 10 # 1) C source files that should be included in the build (eg., lc3bid.c) 11 # 2) C source files that are #included by static C sources (eg., license.c) 12 # 3) Intermediate files that are used as input by other subprograms to 13 # further generate files in category #1 or #2. (eg., version.mac) 14 # 15 # This structure is represented with the following targets: 16 # 1) yasm -- Sources, flags for the main yasm executable. Also has most of 17 # of the actions and rules that invoke the subprograms. 18 # 2) config_sources -- Checked in version of files generated by manually 19 # running configure that are used by all binaries. 20 # 3) generate_files -- Actions and rules for files of type #3. 21 # 4) genperf_libs -- Object files shared between yasm and the genperf 22 # subprogram. 23 # 5) genmacro, genmodule, etc. -- One executable target for each subprogram. 24 # 25 # You will notice that a lot of the action targets seem very similar -- 26 # especially for genmacro invocations. This makes it seem like they should 27 # be a rule. The problem is that the correct invocation cannot be inferred 28 # purely from the file name, or extension. Nor is it obvious whether the 29 # output should be processed as a source or not. Thus, we are left with a 30 # large amount of repetitive code. 31 32 { 33 'variables': { 34 'yasm_include_dirs': [ 35 'source/config/<(OS)', 36 'source/patched-yasm', 37 ], 38 39 # The cflags used by any target that will be directly linked into yasm. 40 # These are specifically not used when building the subprograms. While 41 # it would probably be safe to use these flags there as well, the 42 # ./configure based build does not use the same flags between the main 43 # yasm executable, and its subprograms. 44 'yasm_defines': ['HAVE_CONFIG_H'], 45 'yasm_cflags': [ 46 '-std=gnu99', 47 '-ansi', 48 '-pedantic', 49 ], 50 51 # Locations for various generated artifacts. 52 'shared_generated_dir': '<(SHARED_INTERMEDIATE_DIR)/third_party/yasm', 53 'generated_dir': '<(INTERMEDIATE_DIR)/third_party/yasm', 54 55 # Various files referenced by multiple targets. 56 'version_file': 'version.mac', # Generated by genversion. 57 'genmodule_source': 'genmodule_outfile.c', 58 }, 59 'targets': [ 60 { 61 'target_name': 'yasm', 62 'type': 'executable', 63 'toolsets': ['host'], 64 'dependencies': [ 65 'config_sources', 66 'genmacro', 67 'genmodule', 68 'genperf', 69 'genperf_libs', 70 'generate_files', # Needed to generate gperf and instruction files. 71 'genstring', 72 're2c', 73 ], 74 'sources': [ 75 'source/patched-yasm/frontends/yasm/yasm-options.c', 76 'source/patched-yasm/frontends/yasm/yasm.c', 77 'source/patched-yasm/libyasm/assocdat.c', 78 'source/patched-yasm/libyasm/bc-align.c', 79 'source/patched-yasm/libyasm/bc-data.c', 80 'source/patched-yasm/libyasm/bc-incbin.c', 81 'source/patched-yasm/libyasm/bc-org.c', 82 'source/patched-yasm/libyasm/bc-reserve.c', 83 'source/patched-yasm/libyasm/bitvect.c', 84 'source/patched-yasm/libyasm/bytecode.c', 85 'source/patched-yasm/libyasm/errwarn.c', 86 'source/patched-yasm/libyasm/expr.c', 87 'source/patched-yasm/libyasm/file.c', 88 'source/patched-yasm/libyasm/floatnum.c', 89 'source/patched-yasm/libyasm/hamt.c', 90 'source/patched-yasm/libyasm/insn.c', 91 'source/patched-yasm/libyasm/intnum.c', 92 'source/patched-yasm/libyasm/inttree.c', 93 'source/patched-yasm/libyasm/linemap.c', 94 'source/patched-yasm/libyasm/md5.c', 95 'source/patched-yasm/libyasm/mergesort.c', 96 'source/patched-yasm/libyasm/section.c', 97 'source/patched-yasm/libyasm/strcasecmp.c', 98 'source/patched-yasm/libyasm/strsep.c', 99 'source/patched-yasm/libyasm/symrec.c', 100 'source/patched-yasm/libyasm/valparam.c', 101 'source/patched-yasm/libyasm/value.c', 102 'source/patched-yasm/modules/arch/lc3b/lc3barch.c', 103 'source/patched-yasm/modules/arch/lc3b/lc3bbc.c', 104 'source/patched-yasm/modules/arch/x86/x86arch.c', 105 'source/patched-yasm/modules/arch/x86/x86bc.c', 106 'source/patched-yasm/modules/arch/x86/x86expr.c', 107 'source/patched-yasm/modules/arch/x86/x86id.c', 108 'source/patched-yasm/modules/dbgfmts/codeview/cv-dbgfmt.c', 109 'source/patched-yasm/modules/dbgfmts/codeview/cv-symline.c', 110 'source/patched-yasm/modules/dbgfmts/codeview/cv-type.c', 111 'source/patched-yasm/modules/dbgfmts/dwarf2/dwarf2-aranges.c', 112 'source/patched-yasm/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c', 113 'source/patched-yasm/modules/dbgfmts/dwarf2/dwarf2-info.c', 114 'source/patched-yasm/modules/dbgfmts/dwarf2/dwarf2-line.c', 115 'source/patched-yasm/modules/dbgfmts/null/null-dbgfmt.c', 116 'source/patched-yasm/modules/dbgfmts/stabs/stabs-dbgfmt.c', 117 'source/patched-yasm/modules/listfmts/nasm/nasm-listfmt.c', 118 'source/patched-yasm/modules/objfmts/bin/bin-objfmt.c', 119 'source/patched-yasm/modules/objfmts/coff/coff-objfmt.c', 120 'source/patched-yasm/modules/objfmts/coff/win64-except.c', 121 'source/patched-yasm/modules/objfmts/dbg/dbg-objfmt.c', 122 'source/patched-yasm/modules/objfmts/elf/elf-objfmt.c', 123 'source/patched-yasm/modules/objfmts/elf/elf-x86-amd64.c', 124 'source/patched-yasm/modules/objfmts/elf/elf-x86-x86.c', 125 'source/patched-yasm/modules/objfmts/elf/elf.c', 126 'source/patched-yasm/modules/objfmts/macho/macho-objfmt.c', 127 'source/patched-yasm/modules/objfmts/rdf/rdf-objfmt.c', 128 'source/patched-yasm/modules/objfmts/xdf/xdf-objfmt.c', 129 'source/patched-yasm/modules/parsers/gas/gas-parse.c', 130 'source/patched-yasm/modules/parsers/gas/gas-parse-intel.c', 131 'source/patched-yasm/modules/parsers/gas/gas-parser.c', 132 'source/patched-yasm/modules/parsers/nasm/nasm-parse.c', 133 'source/patched-yasm/modules/parsers/nasm/nasm-parser.c', 134 'source/patched-yasm/modules/preprocs/cpp/cpp-preproc.c', 135 'source/patched-yasm/modules/preprocs/nasm/nasm-eval.c', 136 'source/patched-yasm/modules/preprocs/nasm/nasm-pp.c', 137 'source/patched-yasm/modules/preprocs/nasm/nasm-preproc.c', 138 'source/patched-yasm/modules/preprocs/nasm/nasmlib.c', 139 'source/patched-yasm/modules/preprocs/raw/raw-preproc.c', 140 141 # Sources needed by re2c. 142 'source/patched-yasm/modules/parsers/gas/gas-token.re', 143 'source/patched-yasm/modules/parsers/nasm/nasm-token.re', 144 145 # Sources needed by genperf. Make sure the generated gperf files 146 # (the ones in shared_generated_dir) are synced with the outputs 147 # for the related generate_*_insn actions in the generate_files 148 # target below. 149 '<(shared_generated_dir)/x86insn_nasm.gperf', 150 '<(shared_generated_dir)/x86insn_gas.gperf', 151 '<(shared_generated_dir)/x86cpu.c', 152 '<(shared_generated_dir)/x86regtmod.c', 153 ], 154 'include_dirs': [ 155 '<@(yasm_include_dirs)', 156 '<(shared_generated_dir)', 157 '<(generated_dir)', 158 ], 159 'defines': [ '<@(yasm_defines)' ], 160 'cflags': [ '<@(yasm_cflags)', ], 161 'conditions': [ 162 ['clang==1', { 163 'xcode_settings': { 164 'WARNING_CFLAGS': [ 165 # yasm passes a `const elf_machine_sym*` through `void*`. 166 '-Wno-incompatible-pointer-types', 167 ], 168 }, 169 'cflags': [ 170 '-Wno-incompatible-pointer-types', 171 ], 172 }], 173 ], 174 'msvs_disabled_warnings': [ 4267 ], 175 'rules': [ 176 { 177 'rule_name': 'generate_gperf', 178 'extension': 'gperf', 179 'inputs': [ '<(PRODUCT_DIR)/' 180 '<(EXECUTABLE_PREFIX)genperf<(EXECUTABLE_SUFFIX)' ], 181 'outputs': [ 182 '<(generated_dir)/<(RULE_INPUT_ROOT).c', 183 ], 184 'action': ['<(PRODUCT_DIR)/genperf', 185 '<(RULE_INPUT_PATH)', 186 '<(generated_dir)/<(RULE_INPUT_ROOT).c', 187 ], 188 # These files are #included, so do not treat them as sources. 189 'process_outputs_as_sources': 0, 190 'message': 'yasm gperf for <(RULE_INPUT_PATH)', 191 }, 192 { 193 'rule_name': 'generate_re2c', 194 'extension': 're', 195 'inputs': [ '<(PRODUCT_DIR)/' 196 '<(EXECUTABLE_PREFIX)re2c<(EXECUTABLE_SUFFIX)' ], 197 'outputs': [ '<(generated_dir)/<(RULE_INPUT_ROOT).c', ], 198 'action': [ 199 '<(PRODUCT_DIR)/re2c', 200 '-b', 201 '-o', 202 '<(generated_dir)/<(RULE_INPUT_ROOT).c', 203 '<(RULE_INPUT_PATH)', 204 ], 205 'process_outputs_as_sources': 1, 206 'message': 'yasm re2c for <(RULE_INPUT_PATH)', 207 }, 208 ], 209 'actions': [ 210 ### 211 ### genmacro calls. 212 ### 213 { 214 'action_name': 'generate_nasm_macros', 215 'variables': { 216 'infile': 'source/patched-yasm/modules/parsers/nasm/nasm-std.mac', 217 'varname': 'nasm_standard_mac', 218 'outfile': '<(generated_dir)/nasm-macros.c', 219 }, 220 'inputs': [ '<(PRODUCT_DIR)/' 221 '<(EXECUTABLE_PREFIX)genmacro<(EXECUTABLE_SUFFIX)', 222 '<(infile)', ], 223 'outputs': [ '<(outfile)', ], 224 'action': ['<(PRODUCT_DIR)/genmacro', 225 '<(outfile)', '<(varname)', '<(infile)', ], 226 # Not a direct source because this is #included by 227 # source/patched-yasm/modules/parsers/nasm/nasm-parser.c 228 'process_outputs_as_sources': 1, 229 'message': 'yasm genmacro for <(infile)', 230 }, 231 { 232 'action_name': 'generate_nasm_version', 233 'variables': { 234 'infile': '<(shared_generated_dir)/<(version_file)', 235 'varname': 'nasm_version_mac', 236 'outfile': '<(generated_dir)/nasm-version.c', 237 }, 238 'inputs': [ '<(PRODUCT_DIR)/' 239 '<(EXECUTABLE_PREFIX)genmacro<(EXECUTABLE_SUFFIX)', 240 '<(infile)', ], 241 'outputs': [ '<(outfile)', ], 242 'action': ['<(PRODUCT_DIR)/genmacro', 243 '<(outfile)', '<(varname)', '<(infile)', 244 ], 245 # Not a direct source because this is #included by 246 # source/patched-yasm/modules/preprocs/nasm/nasm-preproc.c 247 'process_outputs_as_sources': 0, 248 'message': 'yasm genmacro for <(infile)', 249 }, 250 { 251 'action_name': 'generate_win64_gas', 252 'variables': { 253 'infile': 'source/patched-yasm/modules/objfmts/coff/win64-gas.mac', 254 'varname': 'win64_gas_stdmac', 255 'outfile': '<(generated_dir)/win64-gas.c', 256 }, 257 'inputs': [ '<(PRODUCT_DIR)/' 258 '<(EXECUTABLE_PREFIX)genmacro<(EXECUTABLE_SUFFIX)', 259 '<(infile)', ], 260 'outputs': [ '<(outfile)', ], 261 'action': ['<(PRODUCT_DIR)/genmacro', 262 '<(outfile)', '<(varname)', '<(infile)', 263 ], 264 # Not a direct source because this is #included by 265 # source/patched-yasm/modules/objfmts/coff/coff-objfmt.c 266 'process_outputs_as_sources': 0, 267 'message': 'yasm genmacro for <(infile)', 268 }, 269 { 270 'action_name': 'generate_win64_nasm', 271 'variables': { 272 'infile': 'source/patched-yasm/modules/objfmts/coff/win64-nasm.mac', 273 'varname': 'win64_nasm_stdmac', 274 'outfile': '<(generated_dir)/win64-nasm.c', 275 }, 276 'inputs': [ '<(PRODUCT_DIR)/' 277 '<(EXECUTABLE_PREFIX)genmacro<(EXECUTABLE_SUFFIX)', 278 '<(infile)', ], 279 'outputs': [ '<(outfile)', ], 280 'action': ['<(PRODUCT_DIR)/genmacro', 281 '<(outfile)', 282 '<(varname)', 283 '<(infile)', 284 ], 285 # Not a direct source because this is #included by 286 # source/patched-yasm/modules/objfmts/coff/coff-objfmt.c 287 'process_outputs_as_sources': 0, 288 'message': 'yasm genmacro for <(infile)', 289 }, 290 291 ### 292 ### genstring call. 293 ### 294 { 295 'action_name': 'generate_license', 296 'variables': { 297 'infile': 'source/patched-yasm/COPYING', 298 'varname': 'license_msg', 299 'outfile': '<(generated_dir)/license.c', 300 }, 301 'inputs': [ '<(PRODUCT_DIR)/' 302 '<(EXECUTABLE_PREFIX)genstring<(EXECUTABLE_SUFFIX)', 303 '<(infile)', ], 304 'outputs': [ '<(outfile)', ], 305 'action': ['<(PRODUCT_DIR)/genstring', 306 '<(varname)', 307 '<(outfile)', 308 '<(infile)', 309 ], 310 # Not a direct source because this is #included by 311 # source/patched-yasm/frontends/yasm/yasm.c 312 'process_outputs_as_sources': 0, 313 'message': 'Generating yasm embeddable license', 314 }, 315 316 ### 317 ### A re2c call that doesn't fit into the rule below. 318 ### 319 { 320 'action_name': 'generate_lc3b_token', 321 'variables': { 322 'infile': 'source/patched-yasm/modules/arch/lc3b/lc3bid.re', 323 # The license file is #included by yasm.c. 324 'outfile': '<(generated_dir)/lc3bid.c', 325 }, 326 'inputs': [ '<(PRODUCT_DIR)/' 327 '<(EXECUTABLE_PREFIX)re2c<(EXECUTABLE_SUFFIX)', 328 '<(infile)', ], 329 'outputs': [ '<(outfile)', ], 330 'action': [ 331 '<(PRODUCT_DIR)/re2c', 332 '-s', 333 '-o', '<(outfile)', 334 '<(infile)' 335 ], 336 'process_outputs_as_sources': 1, 337 'message': 'Generating yasm tokens for lc3b', 338 }, 339 340 ### 341 ### genmodule call. 342 ### 343 { 344 'action_name': 'generate_module', 345 'variables': { 346 'makefile': 'source/config/<(OS)/Makefile', 347 'module_in': 'source/patched-yasm/libyasm/module.in', 348 'outfile': '<(generated_dir)/module.c', 349 }, 350 'inputs': [ 351 '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)genmodule<(EXECUTABLE_SUFFIX)', 352 '<(module_in)', 353 '<(makefile)' 354 ], 355 'outputs': [ '<(generated_dir)/module.c' ], 356 'action': [ 357 '<(PRODUCT_DIR)/genmodule', 358 '<(module_in)', 359 '<(makefile)', 360 '<(outfile)' 361 ], 362 'process_outputs_as_sources': 1, 363 'message': 'Generating yasm module information', 364 }, 365 ], 366 }, 367 { 368 'target_name': 'config_sources', 369 'type': 'none', 370 'toolsets': ['host'], 371 'sources': [ 372 'source/config/<(OS)/Makefile', 373 'source/config/<(OS)/config.h', 374 'source/config/<(OS)/libyasm-stdint.h', 375 ], 376 }, 377 { 378 'target_name': 'generate_files', 379 'type': 'none', 380 'toolsets': ['host'], 381 'dependencies': [ 382 'genperf', 383 'genversion', 384 ], 385 'sources': [ 386 'source/patched-yasm/modules/arch/x86/x86cpu.gperf', 387 'source/patched-yasm/modules/arch/x86/x86regtmod.gperf', 388 ], 389 'rules': [ 390 { 391 'rule_name': 'generate_gperf', 392 'extension': 'gperf', 393 'inputs': [ '<(PRODUCT_DIR)/' 394 '<(EXECUTABLE_PREFIX)genperf<(EXECUTABLE_SUFFIX)' ], 395 'outputs': [ '<(shared_generated_dir)/<(RULE_INPUT_ROOT).c', ], 396 'action': [ 397 '<(PRODUCT_DIR)/genperf', 398 '<(RULE_INPUT_PATH)', 399 '<(shared_generated_dir)/<(RULE_INPUT_ROOT).c', 400 ], 401 'process_outputs_as_sources': 0, 402 'message': 'yasm genperf for <(RULE_INPUT_PATH)', 403 }, 404 ], 405 'actions': [ 406 { 407 'action_name': 'generate_x86_insn', 408 'variables': { 409 'gen_insn_path': 410 'source/patched-yasm/modules/arch/x86/gen_x86_insn.py', 411 }, 412 'inputs': [ '<(gen_insn_path)', ], 413 'outputs': [ 414 '<(shared_generated_dir)/x86insns.c', 415 '<(shared_generated_dir)/x86insn_gas.gperf', 416 '<(shared_generated_dir)/x86insn_nasm.gperf', 417 ], 418 'action': [ 419 'python', 420 '<(gen_insn_path)', 421 '<(shared_generated_dir)', 422 ], 423 'message': 'Running <(gen_insn_path)', 424 'process_outputs_as_sources': 0, 425 }, 426 { 427 'action_name': 'generate_version', 428 'inputs': [ '<(PRODUCT_DIR)/' 429 '<(EXECUTABLE_PREFIX)genversion<(EXECUTABLE_SUFFIX)' ], 430 'outputs': [ '<(shared_generated_dir)/<(version_file)', ], 431 'action': [ 432 '<(PRODUCT_DIR)/genversion', 433 '<(shared_generated_dir)/<(version_file)' 434 ], 435 'message': 'Generating yasm version file: ' 436 '<(shared_generated_dir)/<(version_file)', 437 'process_outputs_as_sources': 0, 438 }, 439 ], 440 }, 441 { 442 'target_name': 'genperf_libs', 443 'type': 'static_library', 444 'toolsets': ['host'], 445 'dependencies': [ 'config_sources', ], 446 'sources': [ 447 'source/patched-yasm/libyasm/phash.c', 448 'source/patched-yasm/libyasm/xmalloc.c', 449 'source/patched-yasm/libyasm/xstrdup.c', 450 ], 451 'include_dirs': [ 452 '<@(yasm_include_dirs)', 453 ], 454 'defines': [ '<@(yasm_defines)' ], 455 'cflags': [ 456 '<@(yasm_cflags)', 457 ], 458 }, 459 { 460 'target_name': 'genstring', 461 'type': 'executable', 462 'toolsets': ['host'], 463 'dependencies': [ 'config_sources', ], 464 'sources': [ 465 'source/patched-yasm/genstring.c', 466 ], 467 'include_dirs': [ 468 '<@(yasm_include_dirs)', 469 ], 470 'cflags': [ 471 '-std=gnu99', 472 ], 473 }, 474 { 475 'target_name': 'genperf', 476 'type': 'executable', 477 'toolsets': ['host'], 478 'dependencies': [ 479 'genperf_libs', 480 ], 481 'sources': [ 482 'source/patched-yasm/tools/genperf/genperf.c', 483 'source/patched-yasm/tools/genperf/perfect.c', 484 ], 485 'include_dirs': [ 486 '<@(yasm_include_dirs)', 487 ], 488 'cflags': [ 489 '-std=gnu99', 490 ], 491 }, 492 { 493 'target_name': 'genmacro', 494 'type': 'executable', 495 'toolsets': ['host'], 496 'dependencies': [ 'config_sources', ], 497 'sources': [ 498 'source/patched-yasm/tools/genmacro/genmacro.c', 499 ], 500 'include_dirs': [ 501 '<@(yasm_include_dirs)', 502 ], 503 'cflags': [ 504 '-std=gnu99', 505 ], 506 }, 507 { 508 'target_name': 'genversion', 509 'type': 'executable', 510 'toolsets': ['host'], 511 'dependencies': [ 'config_sources', ], 512 'sources': [ 513 'source/patched-yasm/modules/preprocs/nasm/genversion.c', 514 ], 515 'include_dirs': [ 516 '<@(yasm_include_dirs)', 517 ], 518 'cflags': [ 519 '-std=gnu99', 520 ], 521 }, 522 { 523 'target_name': 're2c', 524 'type': 'executable', 525 'toolsets': ['host'], 526 'dependencies': [ 'config_sources', ], 527 'sources': [ 528 'source/patched-yasm/tools/re2c/main.c', 529 'source/patched-yasm/tools/re2c/code.c', 530 'source/patched-yasm/tools/re2c/dfa.c', 531 'source/patched-yasm/tools/re2c/parser.c', 532 'source/patched-yasm/tools/re2c/actions.c', 533 'source/patched-yasm/tools/re2c/scanner.c', 534 'source/patched-yasm/tools/re2c/mbo_getopt.c', 535 'source/patched-yasm/tools/re2c/substr.c', 536 'source/patched-yasm/tools/re2c/translate.c', 537 ], 538 'include_dirs': [ 539 '<@(yasm_include_dirs)', 540 ], 541 'cflags': [ 542 '-std=gnu99', 543 ], 544 'conditions': [ 545 ['clang==1', { 546 'xcode_settings': { 547 'WARNING_CFLAGS': [ 548 # re2c is missing CLOSEVOP from one switch. 549 '-Wno-switch', 550 ], 551 }, 552 'cflags': [ 553 '-Wno-switch', 554 ], 555 }], 556 ], 557 'msvs_disabled_warnings': [ 4267 ], 558 }, 559 { 560 'target_name': 'genmodule', 561 'type': 'executable', 562 'toolsets': ['host'], 563 'dependencies': [ 564 'config_sources', 565 ], 566 'sources': [ 567 'source/patched-yasm/libyasm/genmodule.c', 568 ], 569 'include_dirs': [ 570 '<@(yasm_include_dirs)', 571 572 ], 573 'cflags': [ 574 '-std=gnu99', 575 ], 576 }, 577 ], 578 } 579