| OLD | NEW |
| 1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 Google Inc. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 # Notes: | 5 # Notes: |
| 6 # | 6 # |
| 7 # This is all roughly based on the Makefile system used by the Linux | 7 # This is all roughly based on the Makefile system used by the Linux |
| 8 # kernel, but is a non-recursive make -- we put the entire dependency | 8 # kernel, but is a non-recursive make -- we put the entire dependency |
| 9 # graph in front of make and let it figure it out. | 9 # graph in front of make and let it figure it out. |
| 10 # | 10 # |
| 11 # The code below generates a separate .mk file for each target, but | 11 # The code below generates a separate .mk file for each target, but |
| 12 # all are sourced by the top-level Makefile. This means that all | 12 # all are sourced by the top-level Makefile. This means that all |
| 13 # variables in .mk-files clobber one another. Be careful to use := | 13 # variables in .mk-files clobber one another. Be careful to use := |
| 14 # where appropriate for immediate evaluation, and similarly to watch | 14 # where appropriate for immediate evaluation, and similarly to watch |
| 15 # that you're not relying on a variable value to last beween different | 15 # that you're not relying on a variable value to last beween different |
| 16 # .mk files. | 16 # .mk files. |
| 17 # | 17 # |
| 18 # TODOs: | 18 # TODOs: |
| 19 # | 19 # |
| 20 # Global settings and utility functions are currently stuffed in the | 20 # Global settings and utility functions are currently stuffed in the |
| 21 # toplevel Makefile. It may make sense to generate some .mk files on | 21 # toplevel Makefile. It may make sense to generate some .mk files on |
| 22 # the side to keep the the files readable. | 22 # the side to keep the the files readable. |
| 23 | 23 |
| 24 import os | 24 import os |
| 25 import re | 25 import re |
| 26 import sys | 26 import sys |
| 27 import subprocess | 27 import subprocess |
| 28 import gyp | 28 import gyp |
| 29 import gyp.common | 29 import gyp.common |
| 30 import gyp.system_test | |
| 31 import gyp.xcode_emulation | 30 import gyp.xcode_emulation |
| 32 from gyp.common import GetEnvironFallback | 31 from gyp.common import GetEnvironFallback |
| 33 | 32 |
| 34 generator_default_variables = { | 33 generator_default_variables = { |
| 35 'EXECUTABLE_PREFIX': '', | 34 'EXECUTABLE_PREFIX': '', |
| 36 'EXECUTABLE_SUFFIX': '', | 35 'EXECUTABLE_SUFFIX': '', |
| 37 'STATIC_LIB_PREFIX': 'lib', | 36 'STATIC_LIB_PREFIX': 'lib', |
| 38 'SHARED_LIB_PREFIX': 'lib', | 37 'SHARED_LIB_PREFIX': 'lib', |
| 39 'STATIC_LIB_SUFFIX': '.a', | 38 'STATIC_LIB_SUFFIX': '.a', |
| 40 'INTERMEDIATE_DIR': '$(obj).$(TOOLSET)/$(TARGET)/geni', | 39 'INTERMEDIATE_DIR': '$(obj).$(TOOLSET)/$(TARGET)/geni', |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 # file for | 118 # file for |
| 120 # Chromium\ Framework.framework/foo | 119 # Chromium\ Framework.framework/foo |
| 121 # is for example | 120 # is for example |
| 122 # out/Release/.deps/out/Release/Chromium?Framework.framework/foo | 121 # out/Release/.deps/out/Release/Chromium?Framework.framework/foo |
| 123 # This is the replacement character. | 122 # This is the replacement character. |
| 124 SPACE_REPLACEMENT = '?' | 123 SPACE_REPLACEMENT = '?' |
| 125 | 124 |
| 126 | 125 |
| 127 LINK_COMMANDS_LINUX = """\ | 126 LINK_COMMANDS_LINUX = """\ |
| 128 quiet_cmd_alink = AR($(TOOLSET)) $@ | 127 quiet_cmd_alink = AR($(TOOLSET)) $@ |
| 129 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) $(ARFLAGS.$(TOOLSET)) $@ $(filter %.o,$
^) | 128 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) |
| 130 | 129 |
| 131 # Due to circular dependencies between libraries :(, we wrap the | 130 # Due to circular dependencies between libraries :(, we wrap the |
| 132 # special "figure out circular dependencies" flags around the entire | 131 # special "figure out circular dependencies" flags around the entire |
| 133 # input list during linking. | 132 # input list during linking. |
| 134 quiet_cmd_link = LINK($(TOOLSET)) $@ | 133 quiet_cmd_link = LINK($(TOOLSET)) $@ |
| 135 cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--s
tart-group $(LD_INPUTS) -Wl,--end-group $(LIBS) | 134 cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--s
tart-group $(LD_INPUTS) -Wl,--end-group $(LIBS) |
| 136 | 135 |
| 137 # We support two kinds of shared objects (.so): | 136 # We support two kinds of shared objects (.so): |
| 138 # 1) shared_library, which is just bundling together many dependent libraries | 137 # 1) shared_library, which is just bundling together many dependent libraries |
| 139 # into a link line. | 138 # into a link line. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 170 cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o
"$@" $(LD_INPUTS) $(LIBS) | 169 cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o
"$@" $(LD_INPUTS) $(LIBS) |
| 171 | 170 |
| 172 # TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass | 171 # TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass |
| 173 # -bundle -single_module here (for osmesa.so). | 172 # -bundle -single_module here (for osmesa.so). |
| 174 quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ | 173 quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ |
| 175 cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSE
T)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) | 174 cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSE
T)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) |
| 176 """ | 175 """ |
| 177 | 176 |
| 178 LINK_COMMANDS_ANDROID = """\ | 177 LINK_COMMANDS_ANDROID = """\ |
| 179 quiet_cmd_alink = AR($(TOOLSET)) $@ | 178 quiet_cmd_alink = AR($(TOOLSET)) $@ |
| 180 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) $(ARFLAGS.$(TOOLSET)) $@ $(filter %.o,$
^) | 179 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) |
| 181 | 180 |
| 182 # Due to circular dependencies between libraries :(, we wrap the | 181 # Due to circular dependencies between libraries :(, we wrap the |
| 183 # special "figure out circular dependencies" flags around the entire | 182 # special "figure out circular dependencies" flags around the entire |
| 184 # input list during linking. | 183 # input list during linking. |
| 185 quiet_cmd_link = LINK($(TOOLSET)) $@ | 184 quiet_cmd_link = LINK($(TOOLSET)) $@ |
| 186 quiet_cmd_link_host = LINK($(TOOLSET)) $@ | 185 quiet_cmd_link_host = LINK($(TOOLSET)) $@ |
| 187 cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--s
tart-group $(LD_INPUTS) -Wl,--end-group $(LIBS) | 186 cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--s
tart-group $(LD_INPUTS) -Wl,--end-group $(LIBS) |
| 188 cmd_link_host = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(
LD_INPUTS) $(LIBS) | 187 cmd_link_host = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(
LD_INPUTS) $(LIBS) |
| 189 | 188 |
| 190 # Other shared-object link notes: | 189 # Other shared-object link notes: |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 # This will allow make to invoke N linker processes as specified in -jN. | 255 # This will allow make to invoke N linker processes as specified in -jN. |
| 257 LINK ?= %(flock)s $(builddir)/linker.lock $(CXX) | 256 LINK ?= %(flock)s $(builddir)/linker.lock $(CXX) |
| 258 | 257 |
| 259 CC.target ?= %(CC.target)s | 258 CC.target ?= %(CC.target)s |
| 260 CFLAGS.target ?= $(CFLAGS) | 259 CFLAGS.target ?= $(CFLAGS) |
| 261 CXX.target ?= %(CXX.target)s | 260 CXX.target ?= %(CXX.target)s |
| 262 CXXFLAGS.target ?= $(CXXFLAGS) | 261 CXXFLAGS.target ?= $(CXXFLAGS) |
| 263 LINK.target ?= %(LINK.target)s | 262 LINK.target ?= %(LINK.target)s |
| 264 LDFLAGS.target ?= $(LDFLAGS) | 263 LDFLAGS.target ?= $(LDFLAGS) |
| 265 AR.target ?= $(AR) | 264 AR.target ?= $(AR) |
| 266 ARFLAGS.target ?= %(ARFLAGS.target)s | |
| 267 | 265 |
| 268 # N.B.: the logic of which commands to run should match the computation done | |
| 269 # in gyp's make.py where ARFLAGS.host etc. is computed. | |
| 270 # TODO(evan): move all cross-compilation logic to gyp-time so we don't need | 266 # TODO(evan): move all cross-compilation logic to gyp-time so we don't need |
| 271 # to replicate this environment fallback in make as well. | 267 # to replicate this environment fallback in make as well. |
| 272 CC.host ?= %(CC.host)s | 268 CC.host ?= %(CC.host)s |
| 273 CFLAGS.host ?= | 269 CFLAGS.host ?= |
| 274 CXX.host ?= %(CXX.host)s | 270 CXX.host ?= %(CXX.host)s |
| 275 CXXFLAGS.host ?= | 271 CXXFLAGS.host ?= |
| 276 LINK.host ?= %(LINK.host)s | 272 LINK.host ?= %(LINK.host)s |
| 277 LDFLAGS.host ?= | 273 LDFLAGS.host ?= |
| 278 AR.host ?= %(AR.host)s | 274 AR.host ?= %(AR.host)s |
| 279 ARFLAGS.host := %(ARFLAGS.host)s | |
| 280 | 275 |
| 281 # Define a dir function that can handle spaces. | 276 # Define a dir function that can handle spaces. |
| 282 # http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions | 277 # http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions |
| 283 # "leading spaces cannot appear in the text of the first argument as written. | 278 # "leading spaces cannot appear in the text of the first argument as written. |
| 284 # These characters can be put into the argument value by variable substitution." | 279 # These characters can be put into the argument value by variable substitution." |
| 285 empty := | 280 empty := |
| 286 space := $(empty) $(empty) | 281 space := $(empty) $(empty) |
| 287 | 282 |
| 288 # http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-
with-spaces | 283 # http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-
with-spaces |
| 289 replace_spaces = $(subst $(space),""" + SPACE_REPLACEMENT + """,$1) | 284 replace_spaces = $(subst $(space),""" + SPACE_REPLACEMENT + """,$1) |
| (...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1895 "%(makefile_name)s: %(deps)s\n" | 1890 "%(makefile_name)s: %(deps)s\n" |
| 1896 "\t$(call do_cmd,regen_makefile)\n\n" % { | 1891 "\t$(call do_cmd,regen_makefile)\n\n" % { |
| 1897 'makefile_name': makefile_name, | 1892 'makefile_name': makefile_name, |
| 1898 'deps': ' '.join(map(Sourceify, build_files)), | 1893 'deps': ' '.join(map(Sourceify, build_files)), |
| 1899 'cmd': gyp.common.EncodePOSIXShellList( | 1894 'cmd': gyp.common.EncodePOSIXShellList( |
| 1900 [gyp_binary, '-fmake'] + | 1895 [gyp_binary, '-fmake'] + |
| 1901 gyp.RegenerateFlags(options) + | 1896 gyp.RegenerateFlags(options) + |
| 1902 build_files_args)}) | 1897 build_files_args)}) |
| 1903 | 1898 |
| 1904 | 1899 |
| 1905 def RunSystemTests(flavor): | |
| 1906 """Run tests against the system to compute default settings for commands. | |
| 1907 | |
| 1908 Returns: | |
| 1909 dictionary of settings matching the block of command-lines used in | |
| 1910 SHARED_HEADER. E.g. the dictionary will contain a ARFLAGS.target | |
| 1911 key for the default ARFLAGS for the target ar command. | |
| 1912 """ | |
| 1913 # Compute flags used for building static archives. | |
| 1914 # N.B.: this fallback logic should match the logic in SHARED_HEADER. | |
| 1915 # See comment there for more details. | |
| 1916 ar_target = GetEnvironFallback(('AR_target', 'AR'), 'ar') | |
| 1917 cc_target = GetEnvironFallback(('CC_target', 'CC'), 'cc') | |
| 1918 arflags_target = 'crs' | |
| 1919 # ar -T enables thin archives on Linux. OS X's ar supports a -T flag, but it | |
| 1920 # does something useless (it limits filenames in the archive to 15 chars). | |
| 1921 if flavor != 'mac' and gyp.system_test.TestArSupportsT(ar_command=ar_target, | |
| 1922 cc_command=cc_target): | |
| 1923 arflags_target = 'crsT' | |
| 1924 | |
| 1925 ar_host = os.environ.get('AR_host', 'ar') | |
| 1926 cc_host = os.environ.get('CC_host', 'gcc') | |
| 1927 arflags_host = 'crs' | |
| 1928 # It feels redundant to compute this again given that most builds aren't | |
| 1929 # cross-compiles, but due to quirks of history CC_host defaults to 'gcc' | |
| 1930 # while CC_target defaults to 'cc', so the commands really are different | |
| 1931 # even though they're nearly guaranteed to run the same code underneath. | |
| 1932 if flavor != 'mac' and gyp.system_test.TestArSupportsT(ar_command=ar_host, | |
| 1933 cc_command=cc_host): | |
| 1934 arflags_host = 'crsT' | |
| 1935 | |
| 1936 return { 'ARFLAGS.target': arflags_target, | |
| 1937 'ARFLAGS.host': arflags_host } | |
| 1938 | |
| 1939 | |
| 1940 def PerformBuild(data, configurations, params): | 1900 def PerformBuild(data, configurations, params): |
| 1941 options = params['options'] | 1901 options = params['options'] |
| 1942 for config in configurations: | 1902 for config in configurations: |
| 1943 arguments = ['make'] | 1903 arguments = ['make'] |
| 1944 if options.toplevel_dir and options.toplevel_dir != '.': | 1904 if options.toplevel_dir and options.toplevel_dir != '.': |
| 1945 arguments += '-C', options.toplevel_dir | 1905 arguments += '-C', options.toplevel_dir |
| 1946 arguments.append('BUILDTYPE=' + config) | 1906 arguments.append('BUILDTYPE=' + config) |
| 1947 print 'Building [%s]: %s' % (config, arguments) | 1907 print 'Building [%s]: %s' % (config, arguments) |
| 1948 subprocess.check_call(arguments) | 1908 subprocess.check_call(arguments) |
| 1949 | 1909 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2021 header_params.update({ | 1981 header_params.update({ |
| 2022 'flock': './gyp-sun-tool flock', | 1982 'flock': './gyp-sun-tool flock', |
| 2023 'flock_index': 2, | 1983 'flock_index': 2, |
| 2024 'extra_commands': SHARED_HEADER_SUN_COMMANDS, | 1984 'extra_commands': SHARED_HEADER_SUN_COMMANDS, |
| 2025 }) | 1985 }) |
| 2026 elif flavor == 'freebsd': | 1986 elif flavor == 'freebsd': |
| 2027 header_params.update({ | 1987 header_params.update({ |
| 2028 'flock': 'lockf', | 1988 'flock': 'lockf', |
| 2029 }) | 1989 }) |
| 2030 | 1990 |
| 2031 header_params.update(RunSystemTests(flavor)) | |
| 2032 header_params.update({ | 1991 header_params.update({ |
| 2033 'CC.target': GetEnvironFallback(('CC_target', 'CC'), '$(CC)'), | 1992 'CC.target': GetEnvironFallback(('CC_target', 'CC'), '$(CC)'), |
| 2034 'AR.target': GetEnvironFallback(('AR_target', 'AR'), '$(AR)'), | 1993 'AR.target': GetEnvironFallback(('AR_target', 'AR'), '$(AR)'), |
| 2035 'CXX.target': GetEnvironFallback(('CXX_target', 'CXX'), '$(CXX)'), | 1994 'CXX.target': GetEnvironFallback(('CXX_target', 'CXX'), '$(CXX)'), |
| 2036 'LINK.target': GetEnvironFallback(('LD_target', 'LD'), '$(LINK)'), | 1995 'LINK.target': GetEnvironFallback(('LD_target', 'LD'), '$(LINK)'), |
| 2037 'CC.host': GetEnvironFallback(('CC_host',), 'gcc'), | 1996 'CC.host': GetEnvironFallback(('CC_host',), 'gcc'), |
| 2038 'AR.host': GetEnvironFallback(('AR_host',), 'ar'), | 1997 'AR.host': GetEnvironFallback(('AR_host',), 'ar'), |
| 2039 'CXX.host': GetEnvironFallback(('CXX_host',), 'g++'), | 1998 'CXX.host': GetEnvironFallback(('CXX_host',), 'g++'), |
| 2040 'LINK.host': GetEnvironFallback(('LD_host',), 'g++'), | 1999 'LINK.host': GetEnvironFallback(('LD_host',), 'g++'), |
| 2041 }) | 2000 }) |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2168 root_makefile.write("endif\n") | 2127 root_makefile.write("endif\n") |
| 2169 root_makefile.write('\n') | 2128 root_makefile.write('\n') |
| 2170 | 2129 |
| 2171 if (not generator_flags.get('standalone') | 2130 if (not generator_flags.get('standalone') |
| 2172 and generator_flags.get('auto_regeneration', True)): | 2131 and generator_flags.get('auto_regeneration', True)): |
| 2173 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) | 2132 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) |
| 2174 | 2133 |
| 2175 root_makefile.write(SHARED_FOOTER) | 2134 root_makefile.write(SHARED_FOOTER) |
| 2176 | 2135 |
| 2177 root_makefile.close() | 2136 root_makefile.close() |
| OLD | NEW |