Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: pylib/gyp/generator/ninja.py

Issue 208113002: silly hack for basic mixed-toolchain cross builds on mac Base URL: http://gyp.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2013 Google Inc. All rights reserved. 1 # Copyright (c) 2013 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 import collections 5 import collections
6 import copy 6 import copy
7 import hashlib 7 import hashlib
8 import json 8 import json
9 import multiprocessing 9 import multiprocessing
10 import os.path 10 import os.path
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 def WriteSpec(self, spec, config_name, generator_flags): 368 def WriteSpec(self, spec, config_name, generator_flags):
369 """The main entry point for NinjaWriter: write the build rules for a spec. 369 """The main entry point for NinjaWriter: write the build rules for a spec.
370 370
371 Returns a Target object, which represents the output paths for this spec. 371 Returns a Target object, which represents the output paths for this spec.
372 Returns None if there are no outputs (e.g. a settings-only 'none' type 372 Returns None if there are no outputs (e.g. a settings-only 'none' type
373 target).""" 373 target)."""
374 374
375 self.config_name = config_name 375 self.config_name = config_name
376 self.name = spec['target_name'] 376 self.name = spec['target_name']
377 self.toolset = spec['toolset'] 377 self.toolset = spec['toolset']
378
379 if self.toolset == 'target' and generator_supports_multiple_toolsets:
380 self.flavor = 'linux' # lol
381
378 config = spec['configurations'][config_name] 382 config = spec['configurations'][config_name]
379 self.target = Target(spec['type']) 383 self.target = Target(spec['type'])
380 self.is_standalone_static_library = bool( 384 self.is_standalone_static_library = bool(
381 spec.get('standalone_static_library', 0)) 385 spec.get('standalone_static_library', 0))
382 # Track if this target contains any C++ files, to decide if gcc or g++ 386 # Track if this target contains any C++ files, to decide if gcc or g++
383 # should be used for linking. 387 # should be used for linking.
384 self.uses_cpp = False 388 self.uses_cpp = False
385 389
386 self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec) 390 self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
387 self.xcode_settings = self.msvs_settings = None 391 self.xcode_settings = self.msvs_settings = None
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 input = self.GypPathToNinja(source) 940 input = self.GypPathToNinja(source)
937 output = self.GypPathToUniqueOutput(filename + obj_ext) 941 output = self.GypPathToUniqueOutput(filename + obj_ext)
938 if arch is not None: 942 if arch is not None:
939 output = AddArch(output, arch) 943 output = AddArch(output, arch)
940 implicit = precompiled_header.GetObjDependencies([input], [output], arch) 944 implicit = precompiled_header.GetObjDependencies([input], [output], arch)
941 variables = [] 945 variables = []
942 if self.flavor == 'win': 946 if self.flavor == 'win':
943 variables, output, implicit = precompiled_header.GetFlagsModifications( 947 variables, output, implicit = precompiled_header.GetFlagsModifications(
944 input, output, implicit, command, cflags_c, cflags_cc, 948 input, output, implicit, command, cflags_c, cflags_cc,
945 self.ExpandSpecial) 949 self.ExpandSpecial)
950 # hosting on win will need this too:
951 #if self.toolset == 'host':
952 #command += '_host'
946 ninja_file.build(output, command, input, 953 ninja_file.build(output, command, input,
947 implicit=[gch for _, _, gch in implicit], 954 implicit=[gch for _, _, gch in implicit],
948 order_only=predepends, variables=variables) 955 order_only=predepends, variables=variables)
949 outputs.append(output) 956 outputs.append(output)
950 957
951 if has_rc_source: 958 if has_rc_source:
952 resource_include_dirs = config.get('resource_include_dirs', include_dirs) 959 resource_include_dirs = config.get('resource_include_dirs', include_dirs)
953 self.WriteVariableList(ninja_file, 'resource_includes', 960 self.WriteVariableList(ninja_file, 'resource_includes',
954 [QuoteShellArgument('-I' + self.GypPathToNinja(i, env), self.flavor) 961 [QuoteShellArgument('-I' + self.GypPathToNinja(i, env), self.flavor)
955 for i in resource_include_dirs]) 962 for i in resource_include_dirs])
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
996 def WriteLinkForArch(self, ninja_file, spec, config_name, config, 1003 def WriteLinkForArch(self, ninja_file, spec, config_name, config,
997 link_deps, arch=None): 1004 link_deps, arch=None):
998 """Write out a link step. Fills out target.binary. """ 1005 """Write out a link step. Fills out target.binary. """
999 command = { 1006 command = {
1000 'executable': 'link', 1007 'executable': 'link',
1001 'loadable_module': 'solink_module', 1008 'loadable_module': 'solink_module',
1002 'shared_library': 'solink', 1009 'shared_library': 'solink',
1003 }[spec['type']] 1010 }[spec['type']]
1004 command_suffix = '' 1011 command_suffix = ''
1005 1012
1013 if self.toolset == 'host':
1014 # This is on command_suffix instead of command_suffix so that notoc
1015 # versions become solink_notoc_host, not solink_host_notoc.
1016 command_suffix += '_host'
1017
1006 implicit_deps = set() 1018 implicit_deps = set()
1007 solibs = set() 1019 solibs = set()
1008 1020
1009 if 'dependencies' in spec: 1021 if 'dependencies' in spec:
1010 # Two kinds of dependencies: 1022 # Two kinds of dependencies:
1011 # - Linkable dependencies (like a .a or a .so): add them to the link line. 1023 # - Linkable dependencies (like a .a or a .so): add them to the link line.
1012 # - Non-linkable dependencies (like a rule that generates a file 1024 # - Non-linkable dependencies (like a rule that generates a file
1013 # and writes a stamp file): add them to implicit_deps 1025 # and writes a stamp file): add them to implicit_deps
1014 extra_link_deps = set() 1026 extra_link_deps = set()
1015 for dep in spec['dependencies']: 1027 for dep in spec['dependencies']:
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 self.ninja.newline() 1502 self.ninja.newline()
1491 1503
1492 return rule_name, args 1504 return rule_name, args
1493 1505
1494 1506
1495 def CalculateVariables(default_variables, params): 1507 def CalculateVariables(default_variables, params):
1496 """Calculate additional variables for use in the build (called by gyp).""" 1508 """Calculate additional variables for use in the build (called by gyp)."""
1497 global generator_additional_non_configuration_keys 1509 global generator_additional_non_configuration_keys
1498 global generator_additional_path_sections 1510 global generator_additional_path_sections
1499 flavor = gyp.common.GetFlavor(params) 1511 flavor = gyp.common.GetFlavor(params)
1500 if flavor == 'mac': 1512 # Bleh, SHARED_LIB_SUFFIX is per-toolset; gyp doesn't expect that as of yet.
1513 if False and flavor == 'mac':
1501 default_variables.setdefault('OS', 'mac') 1514 default_variables.setdefault('OS', 'mac')
1502 default_variables.setdefault('SHARED_LIB_SUFFIX', '.dylib') 1515 default_variables.setdefault('SHARED_LIB_SUFFIX', '.dylib')
1503 default_variables.setdefault('SHARED_LIB_DIR', 1516 default_variables.setdefault('SHARED_LIB_DIR',
1504 generator_default_variables['PRODUCT_DIR']) 1517 generator_default_variables['PRODUCT_DIR'])
1505 default_variables.setdefault('LIB_DIR', 1518 default_variables.setdefault('LIB_DIR',
1506 generator_default_variables['PRODUCT_DIR']) 1519 generator_default_variables['PRODUCT_DIR'])
1507 1520
1508 # Copy additional generator configuration data from Xcode, which is shared 1521 # Copy additional generator configuration data from Xcode, which is shared
1509 # by the Mac Ninja generator. 1522 # by the Mac Ninja generator.
1510 import gyp.generator.xcode as xcode_generator 1523 import gyp.generator.xcode as xcode_generator
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1912 command=('%s gyp-win-tool rc-wrapper ' 1925 command=('%s gyp-win-tool rc-wrapper '
1913 '$arch $rc $defines $resource_includes $rcflags /fo$out $in' % 1926 '$arch $rc $defines $resource_includes $rcflags /fo$out $in' %
1914 sys.executable)) 1927 sys.executable))
1915 master_ninja.rule( 1928 master_ninja.rule(
1916 'asm', 1929 'asm',
1917 description='ASM $out', 1930 description='ASM $out',
1918 command=('%s gyp-win-tool asm-wrapper ' 1931 command=('%s gyp-win-tool asm-wrapper '
1919 '$arch $asm $defines $includes $asmflags /c /Fo $out $in' % 1932 '$arch $asm $defines $includes $asmflags /c /Fo $out $in' %
1920 sys.executable)) 1933 sys.executable))
1921 1934
1922 if flavor != 'mac' and flavor != 'win': 1935 if True or flavor != 'mac' and flavor != 'win':
1923 master_ninja.rule( 1936 master_ninja.rule(
1924 'alink', 1937 'alink',
1925 description='AR $out', 1938 description='AR $out',
1926 command='rm -f $out && $ar rcs $out $in') 1939 command='rm -f $out && $ar rcs $out $in')
1927 master_ninja.rule( 1940 master_ninja.rule(
1928 'alink_thin', 1941 'alink_thin',
1929 description='AR $out', 1942 description='AR $out',
1930 command='rm -f $out && $ar rcsT $out $in') 1943 command='rm -f $out && $ar rcsT $out $in')
1931 1944
1932 # This allows targets that only need to depend on $lib's API to declare an 1945 # This allows targets that only need to depend on $lib's API to declare an
(...skipping 29 matching lines...) Expand all
1962 command=mtime_preserving_solink_base % {'suffix': '@$link_file_list'}, 1975 command=mtime_preserving_solink_base % {'suffix': '@$link_file_list'},
1963 rspfile='$link_file_list', 1976 rspfile='$link_file_list',
1964 rspfile_content='-Wl,--start-group $in -Wl,--end-group $solibs $libs', 1977 rspfile_content='-Wl,--start-group $in -Wl,--end-group $solibs $libs',
1965 pool='link_pool') 1978 pool='link_pool')
1966 master_ninja.rule( 1979 master_ninja.rule(
1967 'link', 1980 'link',
1968 description='LINK $out', 1981 description='LINK $out',
1969 command=('$ld $ldflags -o $out ' 1982 command=('$ld $ldflags -o $out '
1970 '-Wl,--start-group $in -Wl,--end-group $solibs $libs'), 1983 '-Wl,--start-group $in -Wl,--end-group $solibs $libs'),
1971 pool='link_pool') 1984 pool='link_pool')
1972 elif flavor == 'win': 1985
1986 if flavor == 'win':
1973 master_ninja.rule( 1987 master_ninja.rule(
1974 'alink', 1988 'alink',
1975 description='LIB $out', 1989 description='LIB $out',
1976 command=('%s gyp-win-tool link-wrapper $arch False ' 1990 command=('%s gyp-win-tool link-wrapper $arch False '
1977 '$ar /nologo /ignore:4221 /OUT:$out @$out.rsp' % 1991 '$ar /nologo /ignore:4221 /OUT:$out @$out.rsp' %
1978 sys.executable), 1992 sys.executable),
1979 rspfile='$out.rsp', 1993 rspfile='$out.rsp',
1980 rspfile_content='$in_newline $libflags') 1994 rspfile_content='$in_newline $libflags')
1981 _AddWinLinkRules(master_ninja, embed_manifest=True) 1995 _AddWinLinkRules(master_ninja, embed_manifest=True)
1982 _AddWinLinkRules(master_ninja, embed_manifest=False) 1996 _AddWinLinkRules(master_ninja, embed_manifest=False)
1983 else: 1997 elif flavor == 'mac':
1984 master_ninja.rule( 1998 master_ninja.rule(
1985 'objc', 1999 'objc',
1986 description='OBJC $out', 2000 description='OBJC $out',
1987 command=('$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc ' 2001 command=('$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc '
1988 '$cflags_pch_objc -c $in -o $out'), 2002 '$cflags_pch_objc -c $in -o $out'),
1989 depfile='$out.d', 2003 depfile='$out.d',
1990 deps=deps) 2004 deps=deps)
1991 master_ninja.rule( 2005 master_ninja.rule(
1992 'objcxx', 2006 'objcxx',
1993 description='OBJCXX $out', 2007 description='OBJCXX $out',
1994 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc ' 2008 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc '
1995 '$cflags_pch_objcc -c $in -o $out'), 2009 '$cflags_pch_objcc -c $in -o $out'),
1996 depfile='$out.d', 2010 depfile='$out.d',
1997 deps=deps) 2011 deps=deps)
1998 master_ninja.rule( 2012 master_ninja.rule(
1999 'alink', 2013 'alink_host',
2000 description='LIBTOOL-STATIC $out, POSTBUILDS', 2014 description='LIBTOOL-STATIC $out, POSTBUILDS',
2001 command='rm -f $out && ' 2015 command='rm -f $out && '
2002 './gyp-mac-tool filter-libtool libtool $libtool_flags ' 2016 './gyp-mac-tool filter-libtool libtool $libtool_flags '
2003 '-static -o $out $in' 2017 '-static -o $out $in'
2004 '$postbuilds') 2018 '$postbuilds')
2005 master_ninja.rule( 2019 master_ninja.rule(
2006 'lipo', 2020 'lipo_host',
2007 description='LIPO $out, POSTBUILDS', 2021 description='LIPO $out, POSTBUILDS',
2008 command='rm -f $out && lipo -create $in -output $out$postbuilds') 2022 command='rm -f $out && lipo -create $in -output $out$postbuilds')
2009 2023
2010 # Record the public interface of $lib in $lib.TOC. See the corresponding 2024 # Record the public interface of $lib in $lib.TOC. See the corresponding
2011 # comment in the posix section above for details. 2025 # comment in the posix section above for details.
2012 solink_base = '$ld %(type)s $ldflags -o $lib %(suffix)s' 2026 solink_base = '$ld %(type)s $ldflags -o $lib %(suffix)s'
2013 mtime_preserving_solink_base = ( 2027 mtime_preserving_solink_base = (
2014 'if [ ! -e $lib -o ! -e $lib.TOC ] || ' 2028 'if [ ! -e $lib -o ! -e $lib.TOC ] || '
2015 # Always force dependent targets to relink if this library 2029 # Always force dependent targets to relink if this library
2016 # reexports something. Handling this correctly would require 2030 # reexports something. Handling this correctly would require
2017 # recursive TOC dumping but this is rare in practice, so punt. 2031 # recursive TOC dumping but this is rare in practice, so punt.
2018 'otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then ' 2032 'otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then '
2019 '%(solink)s && %(extract_toc)s > $lib.TOC; ' 2033 '%(solink)s && %(extract_toc)s > $lib.TOC; '
2020 'else ' 2034 'else '
2021 '%(solink)s && %(extract_toc)s > $lib.tmp && ' 2035 '%(solink)s && %(extract_toc)s > $lib.tmp && '
2022 'if ! cmp -s $lib.tmp $lib.TOC; then ' 2036 'if ! cmp -s $lib.tmp $lib.TOC; then '
2023 'mv $lib.tmp $lib.TOC ; ' 2037 'mv $lib.tmp $lib.TOC ; '
2024 'fi; ' 2038 'fi; '
2025 'fi' 2039 'fi'
2026 % { 'solink': solink_base, 2040 % { 'solink': solink_base,
2027 'extract_toc': 2041 'extract_toc':
2028 '{ otool -l $lib | grep LC_ID_DYLIB -A 5; ' 2042 '{ otool -l $lib | grep LC_ID_DYLIB -A 5; '
2029 'nm -gP $lib | cut -f1-2 -d\' \' | grep -v U$$; true; }'}) 2043 'nm -gP $lib | cut -f1-2 -d\' \' | grep -v U$$; true; }'})
2030 2044
2031 2045
2032 solink_suffix = '@$link_file_list$postbuilds' 2046 solink_suffix = '@$link_file_list$postbuilds'
2033 master_ninja.rule( 2047 master_ninja.rule(
2034 'solink', 2048 'solink_host',
2035 description='SOLINK $lib, POSTBUILDS', 2049 description='SOLINK $lib, POSTBUILDS',
2036 restat=True, 2050 restat=True,
2037 command=mtime_preserving_solink_base % {'suffix': solink_suffix, 2051 command=mtime_preserving_solink_base % {'suffix': solink_suffix,
2038 'type': '-shared'}, 2052 'type': '-shared'},
2039 rspfile='$link_file_list', 2053 rspfile='$link_file_list',
2040 rspfile_content='$in $solibs $libs', 2054 rspfile_content='$in $solibs $libs',
2041 pool='link_pool') 2055 pool='link_pool')
2042 master_ninja.rule( 2056 master_ninja.rule(
2043 'solink_notoc', 2057 'solink_notoc_host',
2044 description='SOLINK $lib, POSTBUILDS', 2058 description='SOLINK $lib, POSTBUILDS',
2045 restat=True, 2059 restat=True,
2046 command=solink_base % {'suffix':solink_suffix, 'type': '-shared'}, 2060 command=solink_base % {'suffix':solink_suffix, 'type': '-shared'},
2047 rspfile='$link_file_list', 2061 rspfile='$link_file_list',
2048 rspfile_content='$in $solibs $libs', 2062 rspfile_content='$in $solibs $libs',
2049 pool='link_pool') 2063 pool='link_pool')
2050 2064
2051 master_ninja.rule( 2065 master_ninja.rule(
2052 'solink_module', 2066 'solink_module_host',
2053 description='SOLINK(module) $lib, POSTBUILDS', 2067 description='SOLINK(module) $lib, POSTBUILDS',
2054 restat=True, 2068 restat=True,
2055 command=mtime_preserving_solink_base % {'suffix': solink_suffix, 2069 command=mtime_preserving_solink_base % {'suffix': solink_suffix,
2056 'type': '-bundle'}, 2070 'type': '-bundle'},
2057 rspfile='$link_file_list', 2071 rspfile='$link_file_list',
2058 rspfile_content='$in $solibs $libs', 2072 rspfile_content='$in $solibs $libs',
2059 pool='link_pool') 2073 pool='link_pool')
2060 master_ninja.rule( 2074 master_ninja.rule(
2061 'solink_module_notoc', 2075 'solink_module_notoc_host',
2062 description='SOLINK(module) $lib, POSTBUILDS', 2076 description='SOLINK(module) $lib, POSTBUILDS',
2063 restat=True, 2077 restat=True,
2064 command=solink_base % {'suffix': solink_suffix, 'type': '-bundle'}, 2078 command=solink_base % {'suffix': solink_suffix, 'type': '-bundle'},
2065 rspfile='$link_file_list', 2079 rspfile='$link_file_list',
2066 rspfile_content='$in $solibs $libs', 2080 rspfile_content='$in $solibs $libs',
2067 pool='link_pool') 2081 pool='link_pool')
2068 2082
2069 master_ninja.rule( 2083 master_ninja.rule(
2070 'link', 2084 'link_host',
2071 description='LINK $out, POSTBUILDS', 2085 description='LINK $out, POSTBUILDS',
2072 command=('$ld $ldflags -o $out ' 2086 command=('$ld $ldflags -o $out '
2073 '$in $solibs $libs$postbuilds'), 2087 '$in $solibs $libs$postbuilds'),
2074 pool='link_pool') 2088 pool='link_pool')
2089
2075 master_ninja.rule( 2090 master_ninja.rule(
2076 'preprocess_infoplist', 2091 'preprocess_infoplist',
2077 description='PREPROCESS INFOPLIST $out', 2092 description='PREPROCESS INFOPLIST $out',
2078 command=('$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && ' 2093 command=('$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && '
2079 'plutil -convert xml1 $out $out')) 2094 'plutil -convert xml1 $out $out'))
2080 master_ninja.rule( 2095 master_ninja.rule(
2081 'copy_infoplist', 2096 'copy_infoplist',
2082 description='COPY INFOPLIST $in', 2097 description='COPY INFOPLIST $in',
2083 command='$env ./gyp-mac-tool copy-info-plist $in $out $keys') 2098 command='$env ./gyp-mac-tool copy-info-plist $in $out $keys')
2084 master_ninja.rule( 2099 master_ninja.rule(
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2228 arglists.append( 2243 arglists.append(
2229 (target_list, target_dicts, data, params, config_name)) 2244 (target_list, target_dicts, data, params, config_name))
2230 pool.map(CallGenerateOutputForConfig, arglists) 2245 pool.map(CallGenerateOutputForConfig, arglists)
2231 except KeyboardInterrupt, e: 2246 except KeyboardInterrupt, e:
2232 pool.terminate() 2247 pool.terminate()
2233 raise e 2248 raise e
2234 else: 2249 else:
2235 for config_name in config_names: 2250 for config_name in config_names:
2236 GenerateOutputForConfig(target_list, target_dicts, data, params, 2251 GenerateOutputForConfig(target_list, target_dicts, data, params,
2237 config_name) 2252 config_name)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698