| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2009 Google Inc. All rights reserved. | 3 # Copyright (c) 2009 Google Inc. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 # Notes: | 7 # Notes: |
| 8 # | 8 # |
| 9 # This is all roughly based on the Makefile system used by the Linux | 9 # This is all roughly based on the Makefile system used by the Linux |
| 10 # kernel, but is a non-recursive make -- we put the entire dependency | 10 # kernel, but is a non-recursive make -- we put the entire dependency |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 # This should go into the build tree, but it's easier to keep it here for now. | 65 # This should go into the build tree, but it's easier to keep it here for now. |
| 66 SHARED_HEADER = ("""\ | 66 SHARED_HEADER = ("""\ |
| 67 # We borrow heavily from the kernel build setup, though we are simpler since | 67 # We borrow heavily from the kernel build setup, though we are simpler since |
| 68 # we don't have Kconfig tweaking settings on us. | 68 # we don't have Kconfig tweaking settings on us. |
| 69 | 69 |
| 70 # The implicit make rules have it looking for RCS files, among other things. | 70 # The implicit make rules have it looking for RCS files, among other things. |
| 71 # We instead explicitly write all the rules we care about. | 71 # We instead explicitly write all the rules we care about. |
| 72 # It's even quicker (saves ~200ms) to pass -r on the command line. | 72 # It's even quicker (saves ~200ms) to pass -r on the command line. |
| 73 MAKEFLAGS=-r | 73 MAKEFLAGS=-r |
| 74 | 74 |
| 75 # The source directory tree. |
| 76 srcdir := %(srcdir)s |
| 77 |
| 78 # The name of the builddir. |
| 79 builddir_name ?= %(builddir)s |
| 80 |
| 75 # The V=1 flag on command line makes us verbosely print command lines. | 81 # The V=1 flag on command line makes us verbosely print command lines. |
| 76 ifdef V | 82 ifdef V |
| 77 quiet= | 83 quiet= |
| 78 else | 84 else |
| 79 quiet=quiet_ | 85 quiet=quiet_ |
| 80 endif | 86 endif |
| 81 | 87 |
| 82 # Specify BUILDTYPE=Release on the command line for a release build. | 88 # Specify BUILDTYPE=Release on the command line for a release build. |
| 83 BUILDTYPE ?= __default_configuration__ | 89 BUILDTYPE ?= %(default_configuration)s |
| 84 | 90 |
| 85 # Directory all our build output goes into. | 91 # Directory all our build output goes into. |
| 86 # Note that this must be two directories beneath src/ for unit tests to pass, | 92 # Note that this must be two directories beneath src/ for unit tests to pass, |
| 87 # as they reach into the src/ directory for data with relative paths. | 93 # as they reach into the src/ directory for data with relative paths. |
| 88 builddir ?= $(builddir_name)/$(BUILDTYPE) | 94 builddir ?= $(builddir_name)/$(BUILDTYPE) |
| 89 abs_builddir := $(abspath $(builddir)) | 95 abs_builddir := $(abspath $(builddir)) |
| 90 depsdir := $(builddir)/.deps | 96 depsdir := $(builddir)/.deps |
| 91 | 97 |
| 92 # Object output directory. | 98 # Object output directory. |
| 93 obj := $(builddir)/obj | 99 obj := $(builddir)/obj |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 # - cmd_foo is the actual command to run; | 215 # - cmd_foo is the actual command to run; |
| 210 # - quiet_cmd_foo is the brief-output summary of the command. | 216 # - quiet_cmd_foo is the brief-output summary of the command. |
| 211 | 217 |
| 212 quiet_cmd_cc = CC($(TOOLSET)) $@ | 218 quiet_cmd_cc = CC($(TOOLSET)) $@ |
| 213 cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $
@ $< | 219 cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $
@ $< |
| 214 | 220 |
| 215 quiet_cmd_cxx = CXX($(TOOLSET)) $@ | 221 quiet_cmd_cxx = CXX($(TOOLSET)) $@ |
| 216 cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -
c -o $@ $< | 222 cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -
c -o $@ $< |
| 217 | 223 |
| 218 quiet_cmd_alink = AR($(TOOLSET)) $@ | 224 quiet_cmd_alink = AR($(TOOLSET)) $@ |
| 219 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) $(ARFLAGS.$(TOOLSET)) $@ $(filter %.o,$
^) | 225 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) $(ARFLAGS.$(TOOLSET)) $@ $(filter %%.o,
$^) |
| 220 | 226 |
| 221 quiet_cmd_touch = TOUCH $@ | 227 quiet_cmd_touch = TOUCH $@ |
| 222 cmd_touch = touch $@ | 228 cmd_touch = touch $@ |
| 223 | 229 |
| 224 quiet_cmd_copy = COPY $@ | 230 quiet_cmd_copy = COPY $@ |
| 225 # send stderr to /dev/null to ignore messages when linking directories. | 231 # send stderr to /dev/null to ignore messages when linking directories. |
| 226 cmd_copy = ln -f $< $@ 2>/dev/null || cp -af $< $@ | 232 cmd_copy = ln -f $< $@ 2>/dev/null || cp -af $< $@ |
| 227 | 233 |
| 228 # Due to circular dependencies between libraries :(, we wrap the | 234 # Due to circular dependencies between libraries :(, we wrap the |
| 229 # special "figure out circular dependencies" flags around the entire | 235 # special "figure out circular dependencies" flags around the entire |
| (...skipping 15 matching lines...) Expand all Loading... |
| 245 escape_quotes = $(subst ','\'',$(1)) | 251 escape_quotes = $(subst ','\'',$(1)) |
| 246 # This comment is here just to include a ' to unconfuse syntax highlighting. | 252 # This comment is here just to include a ' to unconfuse syntax highlighting. |
| 247 # Define an escape_vars function to escape '$' variable syntax. | 253 # Define an escape_vars function to escape '$' variable syntax. |
| 248 # This allows us to read/write command lines with shell variables (e.g. | 254 # This allows us to read/write command lines with shell variables (e.g. |
| 249 # $LD_LIBRARY_PATH), without triggering make substitution. | 255 # $LD_LIBRARY_PATH), without triggering make substitution. |
| 250 escape_vars = $(subst $$,$$$$,$(1)) | 256 escape_vars = $(subst $$,$$$$,$(1)) |
| 251 # Helper that expands to a shell command to echo a string exactly as it is in | 257 # Helper that expands to a shell command to echo a string exactly as it is in |
| 252 # make. This uses printf instead of echo because printf's behaviour with respect | 258 # make. This uses printf instead of echo because printf's behaviour with respect |
| 253 # to escape sequences is more portable than echo's across different shells | 259 # to escape sequences is more portable than echo's across different shells |
| 254 # (e.g., dash, bash). | 260 # (e.g., dash, bash). |
| 255 exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' | 261 exact_echo = printf '%%s\n' '$(call escape_quotes,$(1))' |
| 256 """ | 262 """ |
| 257 """ | 263 """ |
| 258 # Helper to compare the command we're about to run against the command | 264 # Helper to compare the command we're about to run against the command |
| 259 # we logged the last time we ran the command. Produces an empty | 265 # we logged the last time we ran the command. Produces an empty |
| 260 # string (false) when the commands match. | 266 # string (false) when the commands match. |
| 261 # Tricky point: Make has no string-equality test function. | 267 # Tricky point: Make has no string-equality test function. |
| 262 # The kernel uses the following, but it seems like it would have false | 268 # The kernel uses the following, but it seems like it would have false |
| 263 # positives, where one string reordered its arguments. | 269 # positives, where one string reordered its arguments. |
| 264 # arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \\ | 270 # arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \\ |
| 265 # $(filter-out $(cmd_$@), $(cmd_$(1)))) | 271 # $(filter-out $(cmd_$@), $(cmd_$(1)))) |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 } | 415 } |
| 410 | 416 |
| 411 SHARED_HEADER_SUFFIX_RULES = ( | 417 SHARED_HEADER_SUFFIX_RULES = ( |
| 412 SHARED_HEADER_SUFFIX_RULES_COMMENT1 + | 418 SHARED_HEADER_SUFFIX_RULES_COMMENT1 + |
| 413 ''.join(SHARED_HEADER_SUFFIX_RULES_SRCDIR.values()) + | 419 ''.join(SHARED_HEADER_SUFFIX_RULES_SRCDIR.values()) + |
| 414 SHARED_HEADER_SUFFIX_RULES_COMMENT2 + | 420 SHARED_HEADER_SUFFIX_RULES_COMMENT2 + |
| 415 ''.join(SHARED_HEADER_SUFFIX_RULES_OBJDIR1.values()) + | 421 ''.join(SHARED_HEADER_SUFFIX_RULES_OBJDIR1.values()) + |
| 416 ''.join(SHARED_HEADER_SUFFIX_RULES_OBJDIR2.values()) | 422 ''.join(SHARED_HEADER_SUFFIX_RULES_OBJDIR2.values()) |
| 417 ) | 423 ) |
| 418 | 424 |
| 419 # This gets added to the very beginning of the Makefile. | |
| 420 SHARED_HEADER_SRCDIR = ("""\ | |
| 421 # The source directory tree. | |
| 422 srcdir := %s | |
| 423 | |
| 424 """) | |
| 425 | |
| 426 SHARED_HEADER_BUILDDIR_NAME = ("""\ | |
| 427 # The name of the builddir. | |
| 428 builddir_name ?= %s | |
| 429 | |
| 430 """) | |
| 431 | |
| 432 SHARED_FOOTER = """\ | 425 SHARED_FOOTER = """\ |
| 433 # "all" is a concatenation of the "all" targets from all the included | 426 # "all" is a concatenation of the "all" targets from all the included |
| 434 # sub-makefiles. This is just here to clarify. | 427 # sub-makefiles. This is just here to clarify. |
| 435 all: | 428 all: |
| 436 | 429 |
| 437 # Add in dependency-tracking rules. $(all_deps) is the list of every single | 430 # Add in dependency-tracking rules. $(all_deps) is the list of every single |
| 438 # target in our tree. First, only consider targets that already have been | 431 # target in our tree. First, only consider targets that already have been |
| 439 # built, as unbuilt targets will be built regardless of dependency info: | 432 # built, as unbuilt targets will be built regardless of dependency info: |
| 440 all_deps := $(wildcard $(sort $(all_deps))) | 433 all_deps := $(wildcard $(sort $(all_deps))) |
| 441 # Of those, only consider the ones with .d (dependency) info: | 434 # Of those, only consider the ones with .d (dependency) info: |
| (...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 srcdir = '.' | 1281 srcdir = '.' |
| 1289 makefile_name = 'Makefile' + options.suffix | 1282 makefile_name = 'Makefile' + options.suffix |
| 1290 makefile_path = os.path.join(options.toplevel_dir, makefile_name) | 1283 makefile_path = os.path.join(options.toplevel_dir, makefile_name) |
| 1291 if options.generator_output: | 1284 if options.generator_output: |
| 1292 global srcdir_prefix | 1285 global srcdir_prefix |
| 1293 makefile_path = os.path.join(options.generator_output, makefile_path) | 1286 makefile_path = os.path.join(options.generator_output, makefile_path) |
| 1294 srcdir = gyp.common.RelativePath(srcdir, options.generator_output) | 1287 srcdir = gyp.common.RelativePath(srcdir, options.generator_output) |
| 1295 srcdir_prefix = '$(srcdir)/' | 1288 srcdir_prefix = '$(srcdir)/' |
| 1296 ensure_directory_exists(makefile_path) | 1289 ensure_directory_exists(makefile_path) |
| 1297 root_makefile = open(makefile_path, 'w') | 1290 root_makefile = open(makefile_path, 'w') |
| 1298 root_makefile.write(SHARED_HEADER_SRCDIR % srcdir) | 1291 root_makefile.write(SHARED_HEADER % { |
| 1299 root_makefile.write(SHARED_HEADER_BUILDDIR_NAME % builddir_name) | 1292 'srcdir': srcdir, |
| 1300 root_makefile.write(SHARED_HEADER.replace('__default_configuration__', | 1293 'builddir': builddir_name, |
| 1301 default_configuration)) | 1294 'default_configuration': default_configuration |
| 1295 }) |
| 1302 for toolset in toolsets: | 1296 for toolset in toolsets: |
| 1303 root_makefile.write('TOOLSET := %s\n' % toolset) | 1297 root_makefile.write('TOOLSET := %s\n' % toolset) |
| 1304 root_makefile.write(ROOT_HEADER_SUFFIX_RULES) | 1298 root_makefile.write(ROOT_HEADER_SUFFIX_RULES) |
| 1305 | 1299 |
| 1306 # Find the list of targets that derive from the gyp file(s) being built. | 1300 # Find the list of targets that derive from the gyp file(s) being built. |
| 1307 needed_targets = set() | 1301 needed_targets = set() |
| 1308 for build_file in params['build_files']: | 1302 for build_file in params['build_files']: |
| 1309 for target in gyp.common.AllTargets(target_list, target_dicts, build_file): | 1303 for target in gyp.common.AllTargets(target_list, target_dicts, build_file): |
| 1310 needed_targets.add(target) | 1304 needed_targets.add(target) |
| 1311 | 1305 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 # Add a check to make sure we tried to process all the .d files. | 1395 # Add a check to make sure we tried to process all the .d files. |
| 1402 all_deps += """ | 1396 all_deps += """ |
| 1403 ifneq ($(word %(last)d,$(d_files)),) | 1397 ifneq ($(word %(last)d,$(d_files)),) |
| 1404 $(error Found unprocessed dependency files (gyp didn't generate enough rules
!)) | 1398 $(error Found unprocessed dependency files (gyp didn't generate enough rules
!)) |
| 1405 endif | 1399 endif |
| 1406 """ % { 'last': ((num_outputs / 1000) + 1) * 1000 + 1 } | 1400 """ % { 'last': ((num_outputs / 1000) + 1) * 1000 + 1 } |
| 1407 | 1401 |
| 1408 root_makefile.write(SHARED_FOOTER % { 'generate_all_deps': all_deps }) | 1402 root_makefile.write(SHARED_FOOTER % { 'generate_all_deps': all_deps }) |
| 1409 | 1403 |
| 1410 root_makefile.close() | 1404 root_makefile.close() |
| OLD | NEW |