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 # |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 for rule_source in rule.get('rule_sources', []): | 943 for rule_source in rule.get('rule_sources', []): |
944 dirs = set() | 944 dirs = set() |
945 (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) | 945 (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) |
946 (rule_source_root, rule_source_ext) = \ | 946 (rule_source_root, rule_source_ext) = \ |
947 os.path.splitext(rule_source_basename) | 947 os.path.splitext(rule_source_basename) |
948 | 948 |
949 outputs = [self.ExpandInputRoot(out, rule_source_root, | 949 outputs = [self.ExpandInputRoot(out, rule_source_root, |
950 rule_source_dirname) | 950 rule_source_dirname) |
951 for out in rule['outputs']] | 951 for out in rule['outputs']] |
952 | 952 |
953 # If an output is just the file name, turn it into a path so | |
954 # FixupArgPath() will know to Absolutify() it. | |
955 outputs = map( | |
956 lambda x : os.path.dirname(x) and x or os.path.join('.', x), | |
957 outputs) | |
958 | |
959 for out in outputs: | 953 for out in outputs: |
960 dir = os.path.dirname(out) | 954 dir = os.path.dirname(out) |
961 if dir: | 955 if dir: |
962 dirs.add(dir) | 956 dirs.add(dir) |
963 if int(rule.get('process_outputs_as_sources', False)): | 957 if int(rule.get('process_outputs_as_sources', False)): |
964 extra_sources += outputs | 958 extra_sources += outputs |
965 if int(rule.get('process_outputs_as_mac_bundle_resources', False)): | 959 if int(rule.get('process_outputs_as_mac_bundle_resources', False)): |
966 extra_mac_bundle_resources += outputs | 960 extra_mac_bundle_resources += outputs |
967 all_outputs += outputs | |
968 inputs = map(Sourceify, map(self.Absolutify, [rule_source] + | 961 inputs = map(Sourceify, map(self.Absolutify, [rule_source] + |
969 rule.get('inputs', []))) | 962 rule.get('inputs', []))) |
970 actions = ['$(call do_cmd,%s_%d)' % (name, count)] | 963 actions = ['$(call do_cmd,%s_%d)' % (name, count)] |
971 | 964 |
972 if name == 'resources_grit': | 965 if name == 'resources_grit': |
973 # HACK: This is ugly. Grit intentionally doesn't touch the | 966 # HACK: This is ugly. Grit intentionally doesn't touch the |
974 # timestamp of its output file when the file doesn't change, | 967 # timestamp of its output file when the file doesn't change, |
975 # which is fine in hash-based dependency systems like scons | 968 # which is fine in hash-based dependency systems like scons |
976 # and forge, but not kosher in the make world. After some | 969 # and forge, but not kosher in the make world. After some |
977 # discussion, hacking around it here seems like the least | 970 # discussion, hacking around it here seems like the least |
978 # amount of pain. | 971 # amount of pain. |
979 actions += ['@touch --no-create $@'] | 972 actions += ['@touch --no-create $@'] |
980 | 973 |
| 974 outputs = map(self.Absolutify, outputs) |
| 975 all_outputs += outputs |
981 # Only write the 'obj' and 'builddir' rules for the "primary" output | 976 # Only write the 'obj' and 'builddir' rules for the "primary" output |
982 # (:1); it's superfluous for the "extra outputs", and this avoids | 977 # (:1); it's superfluous for the "extra outputs", and this avoids |
983 # accidentally writing duplicate dummy rules for those outputs. | 978 # accidentally writing duplicate dummy rules for those outputs. |
984 self.WriteLn('%s: obj := $(abs_obj)' % outputs[0]) | 979 self.WriteLn('%s: obj := $(abs_obj)' % outputs[0]) |
985 self.WriteLn('%s: builddir := $(abs_builddir)' % outputs[0]) | 980 self.WriteLn('%s: builddir := $(abs_builddir)' % outputs[0]) |
986 self.WriteMakeRule(outputs, inputs + ['FORCE_DO_CMD'], actions) | 981 self.WriteMakeRule(outputs, inputs + ['FORCE_DO_CMD'], actions) |
987 for output in outputs: | 982 for output in outputs: |
988 assert ' ' not in output, ( | 983 assert ' ' not in output, ( |
989 "Spaces in rule filenames not yet supported (%s)" % output) | 984 "Spaces in rule filenames not yet supported (%s)" % output) |
990 self.WriteLn('all_deps += %s' % ' '.join(outputs)) | 985 self.WriteLn('all_deps += %s' % ' '.join(outputs)) |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1831 def Absolutify(self, path): | 1826 def Absolutify(self, path): |
1832 """Convert a subdirectory-relative path into a base-relative path. | 1827 """Convert a subdirectory-relative path into a base-relative path. |
1833 Skips over paths that contain variables.""" | 1828 Skips over paths that contain variables.""" |
1834 if '$(' in path: | 1829 if '$(' in path: |
1835 # path is no existing file in this case, but calling normpath is still | 1830 # path is no existing file in this case, but calling normpath is still |
1836 # important for trimming trailing slashes. | 1831 # important for trimming trailing slashes. |
1837 return os.path.normpath(path) | 1832 return os.path.normpath(path) |
1838 return os.path.normpath(os.path.join(self.path, path)) | 1833 return os.path.normpath(os.path.join(self.path, path)) |
1839 | 1834 |
1840 | 1835 |
1841 def FixupArgPath(self, arg): | |
1842 if '/' in arg or '.h.' in arg: | |
1843 return self.Absolutify(arg) | |
1844 return arg | |
1845 | |
1846 | |
1847 def ExpandInputRoot(self, template, expansion, dirname): | 1836 def ExpandInputRoot(self, template, expansion, dirname): |
1848 if '%(INPUT_ROOT)s' not in template and '%(INPUT_DIRNAME)s' not in template: | 1837 if '%(INPUT_ROOT)s' not in template and '%(INPUT_DIRNAME)s' not in template: |
1849 return template | 1838 return template |
1850 path = template % { | 1839 path = template % { |
1851 'INPUT_ROOT': expansion, | 1840 'INPUT_ROOT': expansion, |
1852 'INPUT_DIRNAME': dirname, | 1841 'INPUT_DIRNAME': dirname, |
1853 } | 1842 } |
1854 return path | 1843 return path |
1855 | 1844 |
1856 | 1845 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2132 root_makefile.write(" include " + include_file + "\n") | 2121 root_makefile.write(" include " + include_file + "\n") |
2133 root_makefile.write("endif\n") | 2122 root_makefile.write("endif\n") |
2134 root_makefile.write('\n') | 2123 root_makefile.write('\n') |
2135 | 2124 |
2136 if generator_flags.get('auto_regeneration', True): | 2125 if generator_flags.get('auto_regeneration', True): |
2137 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) | 2126 WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) |
2138 | 2127 |
2139 root_makefile.write(SHARED_FOOTER) | 2128 root_makefile.write(SHARED_FOOTER) |
2140 | 2129 |
2141 root_makefile.close() | 2130 root_makefile.close() |
OLD | NEW |