OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
| 6 import os |
| 7 |
6 | 8 |
7 # | 9 # |
8 # Default macros for various platforms. | 10 # Default macros for various platforms. |
9 # | 11 # |
10 NEWLIB_DEFAULTS = """ | 12 NEWLIB_DEFAULTS = """ |
11 NEWLIB_CC?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-gcc -c | 13 NEWLIB_CC?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-gcc -c |
12 NEWLIB_CXX?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -c -std=gnu++98 | 14 NEWLIB_CXX?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -c -std=gnu++98 |
13 NEWLIB_LINK?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -Wl,-as-needed | 15 NEWLIB_LINK?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -Wl,-as-needed |
14 NEWLIB_LIB?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-ar r | 16 NEWLIB_LIB?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-ar r |
15 NEWLIB_DUMP?=$(TC_PATH)/$(OSNAME)_x86_newlib/x86_64-nacl/bin/objdump | 17 NEWLIB_DUMP?=$(TC_PATH)/$(OSNAME)_x86_newlib/x86_64-nacl/bin/objdump |
16 NEWLIB_CCFLAGS?=-O0 -MMD -g -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT
)/include | 18 NEWLIB_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/inclu
de |
17 NEWLIB_LDFLAGS?=-g -pthread | 19 NEWLIB_LDFLAGS?=-pthread |
18 """ | 20 """ |
19 | 21 |
20 GLIBC_DEFAULTS = """ | 22 GLIBC_DEFAULTS = """ |
21 GLIBC_CC?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-gcc -c | 23 GLIBC_CC?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-gcc -c |
22 GLIBC_CXX?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -c -std=gnu++98 | 24 GLIBC_CXX?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -c -std=gnu++98 |
23 GLIBC_LINK?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -Wl,-as-needed | 25 GLIBC_LINK?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -Wl,-as-needed |
24 GLIBC_LIB?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-ar r | 26 GLIBC_LIB?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-ar r |
25 GLIBC_DUMP?=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump | 27 GLIBC_DUMP?=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump |
26 GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32 | 28 GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32 |
27 GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib | 29 GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib |
28 GLIBC_CCFLAGS?=-O0 -MMD -g -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)
/include | 30 GLIBC_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/includ
e |
29 GLIBC_LDFLAGS?=-g -pthread | 31 GLIBC_LDFLAGS?=-pthread |
30 """ | 32 """ |
31 | 33 |
32 PNACL_DEFAULTS = """ | 34 PNACL_DEFAULTS = """ |
33 PNACL_CC?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang -c | 35 PNACL_CC?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang -c |
34 PNACL_CXX?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang++ -c -std=gnu++
98 | 36 PNACL_CXX?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang++ -c -std=gnu++
98 |
35 PNACL_LINK?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang++ | 37 PNACL_LINK?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-clang++ |
36 PNACL_LIB?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-ar r | 38 PNACL_LIB?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-ar r |
37 PNACL_DUMP?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/objdump | 39 PNACL_DUMP?=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/objdump |
38 PNACL_CCFLAGS?=-O0 -MMD -g -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)
/include | 40 PNACL_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/includ
e |
39 PNACL_LDFLAGS?=-g -pthread | 41 PNACL_LDFLAGS?=-pthread |
40 TRANSLATE:=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-translate | 42 TRANSLATE:=$(TC_PATH)/$(OSNAME)_x86_pnacl/newlib/bin/pnacl-translate |
41 """ | 43 """ |
42 | 44 |
43 WIN_DEFAULTS = """ | 45 WIN_DEFAULTS = """ |
44 WIN_CC?=cl.exe | 46 WIN_CC?=cl.exe /nologo |
45 WIN_CXX?=cl.exe | 47 WIN_CXX?=cl.exe /nologo |
46 WIN_LINK?=link.exe | 48 WIN_LINK?=link.exe /nologo |
47 WIN_LIB?=lib.exe | 49 WIN_LIB?=lib.exe /nologo |
48 WIN_CCFLAGS=/I$(NACL_SDK_ROOT)/include /I$(NACL_SDK_ROOT)/include/win -D WIN32 -
D _WIN32 | 50 WIN_CCFLAGS=/I$(NACL_SDK_ROOT)/include /I$(NACL_SDK_ROOT)/include/win -D WIN32 -
D _WIN32 |
49 WIN_LDFLAGS=/LIBPATH:$(NACL_SDK_ROOT)/lib/win_x86_32_host | |
50 """ | 51 """ |
51 | 52 |
52 # | 53 # |
53 # Compile rules for various platforms. | 54 # Compile rules for various platforms. |
54 # | 55 # |
55 NACL_CC_RULE = """ | 56 CC_RULE = '<tc>/<config>/<name>_<ARCH>.o : %.<ext> $(THIS_MAKE) | <tc>/<config>' |
56 <OBJS>:=$(patsubst %.<ext>, <tc>/%_<ARCH>.o,$(<PROJ>_<EXT>)) | 57 NACL_CC_RULES = { |
57 DEPFILES+=$(<OBJS>:.o=.d) | 58 'Debug': '<TAB>$(<CC>) -o $@ $< -g -O0 <MACH> $(<PROJ>_<EXT>FLAGS) -DTCNAME=<t
c> $(<TC>_CCFLAGS) <DEFLIST> <INCLIST>', |
58 $(<OBJS>) : <tc>/%_<ARCH>.o : %.<ext> $(THIS_MAKE) | <tc> | 59 'Release': '<TAB>$(<CC>) -o $@ $< -O2 <MACH> $(<PROJ>_<EXT>FLAGS) -DTCNAME=<tc
> $(<TC>_CCFLAGS) <DEFLIST> <INCLIST>', |
59 <TAB>$(<CC>) -o $@ $< <MACH> -DTCNAME=<tc> $(<TC>_CCFLAGS) $(<PROJ>_<EXT>FLAGS)
<DEFLIST> <INCLUDELIST> | 60 } |
60 """ | |
61 | 61 |
62 SO_CC_RULE = """ | 62 SO_CC_RULES = { |
63 <OBJS>:=$(patsubst %.<ext>, <tc>/%_<ARCH>.o,$(<PROJ>_<EXT>)) | 63 'Debug': '<TAB>$(<CC>) -o $@ $< -g -O0 <MACH> -fPIC $(<PROJ>_<EXT>FLAGS) -DTCN
AME=<tc> $(<TC>_CCFLAGS) <DEFLIST> <INCLIST>', |
64 DEPFILES+=$(<OBJS>:.o=.d) | 64 'Release': '<TAB>$(<CC>) -o $@ $< -02 <MACH> -fPIC $(<PROJ>_<EXT>FLAGS) -DTCNA
ME=<tc> $(<TC>_CCFLAGS) <DEFLIST> <INCLIST>' |
65 $(<OBJS>) : <tc>/%_<ARCH>.o : %.<ext> $(THIS_MAKE) | <tc> | 65 } |
66 <TAB>$(<CC>) -o $@ $< <MACH> -fPIC -DTCNAME=<tc> $(<TC>_CCFLAGS) $(<PROJ>_<EXT>F
LAGS) <DEFLIST> <INCLUDELIST> | |
67 """ | |
68 | 66 |
69 WIN_CC_RULE = """ | 67 WIN_CC_RULES = { |
70 <OBJS>:=$(patsubst %.<ext>, <tc>/%.obj,$(<PROJ>_<EXT>)) | 68 'Debug': '<TAB>$(<CC>) /Od /Fo$@ /MTd /c $< -DTCNAME=host $(WIN_CCFLAGS) <DEFL
IST> <INCLIST>', |
71 $(<OBJS>) : <tc>/%.obj : %.<ext> $(THIS_MAKE) | <tc> | 69 'Release': '<TAB>$(<CC>) /O2 /Fo$@ /MT /c $< -DTCNAME=host $(WIN_CCFLAGS) <DEF
LIST> <INCLIST>' |
72 <TAB>$(<CC>) /Fo$@ /c $< -DTCNAME=host $(WIN_CCFLAGS) <DEFLIST> <INCLUDELIST> | 70 } |
73 """ | |
74 | 71 |
75 # | 72 # |
76 # Link rules for various platforms. | 73 # Link rules for various platforms. |
77 # | 74 # |
78 NEXE_LINK_RULE = """ | 75 NEXE_LINK_RULES = { |
79 <tc>/<proj>_<ARCH>.nexe : <OBJS> | 76 'Debug': '<TAB>$(<LINK>) -o $@ $^ -g <MACH> $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS)
<LIBLIST>', |
80 <TAB>$(<LINK>) -o $@ $^ <MACH> $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS) <LIBLIST> | 77 'Release': '<TAB>$(<LINK>) -o $@ $^ <MACH> $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS) <
LIBLIST>' |
81 <TC>_NMF+=<tc>/<proj>_<ARCH>.nexe | 78 } |
82 """ | |
83 | 79 |
84 PEXE_LINK_RULE = """ | 80 SO_LINK_RULES = { |
85 <tc>/<proj>.pexe : <OBJS> | 81 'Debug': '<TAB>$(<LINK>) -o $@ $^ -g <MACH> -shared $(<PROJ>_LDFLAGS) <LIBLIST
>', |
86 <TAB>$(<LINK>) -o $@ $^ $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS) <LIBLIST> | 82 'Release': '<TAB>$(<LINK>) -o $@ $^ <MACH> -shared $(<PROJ>_LDFLAGS) <LIBLIST>
', |
| 83 } |
87 | 84 |
88 <tc>/<proj>_x86_32.nexe : <tc>/<proj>.pexe | 85 PEXE_TRANSLATE_RULE = """ |
89 <TAB>$(TRANSLATE) -arch x86-32 $< -o $@ | 86 <tc>/<config>/<proj>_x86_32.nexe : <tc>/<config>/<proj>.pexe |
| 87 <TAB>$(TRANSLATE) -arch x86-32 $< -o $@ |
90 | 88 |
91 <tc>/<proj>_x86_64.nexe : <tc>/<proj>.pexe | 89 <tc>/<config>/<proj>_x86_64.nexe : <tc>/<config>/<proj>.pexe |
92 <TAB>$(TRANSLATE) -arch x86-64 $< -o $@ | 90 <TAB>$(TRANSLATE) -arch x86-64 $< -o $@ |
93 | 91 |
94 <tc>/<proj>_arm.nexe : <tc>/<proj>.pexe | 92 <tc>/<config>/<proj>_arm.nexe : <tc>/<config>/<proj>.pexe |
95 <TAB>$(TRANSLATE) -arch arm $< -o $@ | 93 <TAB>$(TRANSLATE) -arch arm $< -o $@""" |
96 PNACL_NMF:=<tc>/<proj>_x86_32.nexe <tc>/<proj>_x86_64.nexe <tc>/<proj>_arm.nexe | |
97 """ | |
98 | 94 |
99 SO_LINK_RULE = """ | 95 PEXE_LINK_RULES = { |
100 <tc>/<proj>_<ARCH>.so : <OBJS> | 96 'Debug': '<TAB>$(<LINK>) -o $@ $^ -g $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS) <LIBLIS
T>\n' + PEXE_TRANSLATE_RULE, |
101 <TAB>$(<LINK>) -o $@ $^ <MACH> -shared $(<PROJ>_LDFLAGS) <LIBLIST> | 97 'Release': '<TAB>$(<LINK>) -o $@ $^ $(<PROJ>_LDFLAGS) $(<TC>_LDFLAGS) <LIBLIST
>\n' + PEXE_TRANSLATE_RULE, |
102 GLIBC_REMAP+= -n <proj>_<ARCH>.so,<proj>.so | 98 } |
103 <TC>_NMF+=<tc>/<proj>_<ARCH>.so | |
104 """ | |
105 | 99 |
106 WIN_LINK_RULE = """ | 100 WIN_LINK_RULES = { |
107 win/<proj>.dll : <OBJS> | 101 'Debug': '<TAB>$(<LINK>) /DLL /OUT:$@ $(<PROJ>_LDFLAGS) /LIBPATH:$(NACL_SDK_RO
OT)/lib/win_x86_32_host/Debug $^ <LIBLIST> $(WIN_LDFLAGS)', |
108 <TAB>$(<LINK>) /DLL /OUT:$@ $(<PROJ>_<EXT>FLAGS) /LIBPATH:$(NACL_SDK_ROOT)/lib $
^ <LIBLIST> $(WIN_LDFLAGS) | 102 'Release': '<TAB>$(<LINK>) /DLL /OUT:$@ $(<PROJ>_LDFLAGS) /LIBPATH:$(NACL_SDK_
ROOT)/lib/win_x86_32_host/Release $^ <LIBLIST> $(WIN_LDFLAGS)' |
109 <TC>_NMF+=<tc>/<proj>.dll | 103 } |
110 | 104 |
| 105 WIN_LAUNCH_RULES = """ |
111 HOST_ARGS:=--register-pepper-plugins=$(abspath win/<proj>.dll);application/x-nac
l | 106 HOST_ARGS:=--register-pepper-plugins=$(abspath win/<proj>.dll);application/x-nac
l |
112 LAUNCH_HOST: CHECK_FOR_CHROME all | 107 LAUNCH_HOST: CHECK_FOR_CHROME all |
113 <TAB>$(CHROME_PATH) $(HOST_ARGS) "localhost:5103/index_win.html" | 108 <TAB>$(CHROME_PATH) $(HOST_ARGS) "localhost:5103/index_win.html" |
114 """ | 109 """ |
115 | 110 |
116 # | 111 # |
117 # Lib rules for various platforms. | 112 # Lib rules for various platforms. |
118 # | 113 # |
119 POSIX_LIB_RULE = """ | 114 POSIX_LIB_RULES = { |
120 $(NACL_SDK_ROOT)/lib/$(OSNAME)_<ARCH>_<tc>/lib<proj>.a : <OBJS> | 115 'Debug': |
121 <TAB>$(MKDIR) -p $(dir $@) | 116 '<TAB>$(MKDIR) -p $(dir $@)\n' |
122 <TAB>$(<LIB>) $@ $^ | 117 '<TAB>$(<LIB>) $@ $^', |
123 """ | 118 'Release': |
| 119 '<TAB>$(MKDIR) -p $(dir $@)\n' |
| 120 '<TAB>$(<LIB>) $@ $^', |
| 121 } |
124 | 122 |
125 WIN_LIB_RULE = """ | 123 WIN_LIB_RULES = { |
126 $(NACL_SDK_ROOT)/lib/win_<ARCH>_host/<proj>.lib : <OBJS> | 124 'Debug': '<TAB>$(<LIB>) /OUT:$@ $^ $(WIN_LDFLAGS) <LIBLIST>', |
127 <TAB>$(<LIB>) /OUT:$@ $^ $(<PROJ>_<EXT>FLAGS) <LIBLIST> | 125 'Release': '<TAB>$(<LIB>) /OUT:$@ $^ $(WIN_LDFLAGS) <LIBLIST>' |
128 """ | 126 } |
129 | 127 |
130 | 128 |
131 | 129 # |
| 130 # NMF rules for various platforms. |
| 131 # |
132 NMF_RULE = """ | 132 NMF_RULE = """ |
133 <tc>/<proj>.nmf : $(<TC>_NMF) | 133 <tc>/<config>/<proj>.nmf : <NMF_TARGETS> |
134 <TAB>$(NMF) -D $(<DUMP>) -o $@ $^ -t <tc> -s <tc> | 134 <TAB>$(NMF) -D $(<DUMP>) -o $@ $^ -t <tc> -s <tc>/<config> |
135 """ | 135 """ |
136 | 136 |
137 NMF_EMPTY = """ | 137 NMF_EMPTY = """ |
138 <tc>/<proj>.nmf : $(<TC>_NMF) | <tc> | 138 <tc>/<config>/<proj>.nmf : <NMF_TARGETS> | <tc>/<config> |
139 <TAB>echo {} > $@ | 139 <TAB>echo {} > $@ |
140 """ | 140 """ |
141 | 141 |
142 GLIBC_NMF_RULE = """ | 142 GLIBC_NMF_RULE = """ |
143 <tc>/<proj>.nmf : $(<TC>_NMF) | 143 <tc>/<config>/<proj>.nmf : <NMF_TARGETS> |
144 <TAB>$(NMF) -D $(<DUMP>) -o $@ $(GLIBC_PATHS) $^ -t <tc> -s <tc> $(<TC>_REMAP) | 144 <TAB>$(NMF) -D $(<DUMP>) -o $@ $(GLIBC_PATHS) $^ -t <tc> -s <tc>/<config> $(GLIB
C_REMAP) |
145 """ | 145 """ |
146 | 146 |
147 | |
148 EXT_MAP = { | 147 EXT_MAP = { |
149 'c': 'CC', | 148 'c': 'CC', |
150 'cc': 'CXX' | 149 'cc': 'CXX' |
151 } | 150 } |
152 | 151 |
153 WIN_TOOL = { | 152 WIN_TOOL = { |
154 'DEFINE': '-D%s', | 153 'DEFINE': '-D%s', |
155 'INCLUDE': '/I%s', | 154 'INCLUDE': '/I%s', |
156 'LIBRARY': '%s.lib', | 155 'LIBRARY': '%s.lib', |
157 'main': '<tc>/<proj>.dll', | 156 'MAIN': '<tc>/<config>/<proj>.dll', |
158 'nmf': '<tc>/<proj>.nmf', | 157 'NMFMAIN': '<tc>/<config>/<proj>.dll', |
159 'so': None, | 158 'SO': None, |
160 'lib': '$(NACL_SDK_ROOT)/lib/win_<ARCH>_host/<proj>.lib', | 159 'LIB': '$(NACL_SDK_ROOT)/lib/win_<ARCH>_host/<config>/<proj>.lib', |
161 } | 160 } |
162 | 161 |
163 NACL_TOOL = { | 162 NACL_TOOL = { |
164 'DEFINE': '-D%s', | 163 'DEFINE': '-D%s', |
165 'INCLUDE': '-I%s', | 164 'INCLUDE': '-I%s', |
166 'LIBRARY': '-l%s', | 165 'LIBRARY': '-l%s', |
167 'main': '<tc>/<proj>_<ARCH>.nexe', | 166 'MAIN': '<tc>/<config>/<proj>_<ARCH>.nexe', |
168 'nmf': '<tc>/<proj>.nmf', | 167 'NMFMAIN': '<tc>/<config>/<proj>_<ARCH>.nexe', |
169 'so': '<tc>/<proj>_<ARCH>.so', | 168 'SO': '<tc>/<config>/<proj>_<ARCH>.so', |
170 'lib': '$(NACL_SDK_ROOT)/lib/$(OSNAME)_<ARCH>_<tc>/lib<proj>.a', | 169 'LIB': '$(NACL_SDK_ROOT)/lib/$(OSNAME)_<ARCH>_<tc>/<config>/lib<proj>.a', |
| 170 } |
| 171 |
| 172 PNACL_TOOL = { |
| 173 'DEFINE': '-D%s', |
| 174 'INCLUDE': '-I%s', |
| 175 'LIBRARY': '-l%s', |
| 176 'MAIN': '<tc>/<config>/<proj>.pexe', |
| 177 'NMFMAIN': |
| 178 '<tc>/<config>/<proj>_x86_32.nexe ' |
| 179 '<tc>/<config>/<proj>_x86_64.nexe ' |
| 180 '<tc>/<config>/<proj>_arm.nexe', |
| 181 'SO': None, |
| 182 'LIB': '$(NACL_SDK_ROOT)/lib/$(OSNAME)_<ARCH>_<tc>/<config>/lib<proj>.a', |
171 } | 183 } |
172 | 184 |
173 | 185 |
174 # | 186 # |
175 # Various Architectures | 187 # Various Architectures |
176 # | 188 # |
177 NACL_X86_32 = { | 189 NACL_X86_32 = { |
178 '<arch>': '32', | 190 '<arch>': '32', |
179 '<ARCH>': 'x86_32', | 191 '<ARCH>': 'x86_32', |
180 '<MACH>': '-m32', | 192 '<MACH>': '-m32', |
(...skipping 12 matching lines...) Expand all Loading... |
193 '<arch>': '', | 205 '<arch>': '', |
194 '<ARCH>': 'x86_32', | 206 '<ARCH>': 'x86_32', |
195 '<MACH>': '', | 207 '<MACH>': '', |
196 } | 208 } |
197 | 209 |
198 | 210 |
199 BUILD_RULES = { | 211 BUILD_RULES = { |
200 'newlib' : { | 212 'newlib' : { |
201 'ARCHES': [NACL_X86_32, NACL_X86_64], | 213 'ARCHES': [NACL_X86_32, NACL_X86_64], |
202 'DEFS': NEWLIB_DEFAULTS, | 214 'DEFS': NEWLIB_DEFAULTS, |
203 'CC' : NACL_CC_RULE, | 215 'CC' : NACL_CC_RULES, |
204 'CXX' : NACL_CC_RULE, | 216 'CXX' : NACL_CC_RULES, |
205 'NMF' : NMF_RULE, | 217 'NMF' : NMF_RULE, |
206 'MAIN': NEXE_LINK_RULE, | 218 'MAIN': NEXE_LINK_RULES, |
207 'LIB': POSIX_LIB_RULE, | 219 'LIB': POSIX_LIB_RULES, |
208 'SO' : None, | 220 'SO' : None, |
209 'TOOL': NACL_TOOL, | 221 'TOOL': NACL_TOOL, |
210 }, | 222 }, |
211 'glibc' : { | 223 'glibc' : { |
212 'ARCHES': [NACL_X86_32, NACL_X86_64], | 224 'ARCHES': [NACL_X86_32, NACL_X86_64], |
213 'DEFS': GLIBC_DEFAULTS, | 225 'DEFS': GLIBC_DEFAULTS, |
214 'CC': NACL_CC_RULE, | 226 'CC': NACL_CC_RULES, |
215 'CXX': NACL_CC_RULE, | 227 'CXX': NACL_CC_RULES, |
216 'NMF' : GLIBC_NMF_RULE, | 228 'NMF' : GLIBC_NMF_RULE, |
217 'MAIN': NEXE_LINK_RULE, | 229 'MAIN': NEXE_LINK_RULES, |
218 'LIB': POSIX_LIB_RULE, | 230 'LIB': POSIX_LIB_RULES, |
219 'SO': SO_LINK_RULE, | 231 'SO': SO_LINK_RULES, |
220 'TOOL': NACL_TOOL, | 232 'TOOL': NACL_TOOL, |
221 }, | 233 }, |
222 'pnacl' : { | 234 'pnacl' : { |
223 'ARCHES': [NACL_PNACL], | 235 'ARCHES': [NACL_PNACL], |
224 'DEFS': PNACL_DEFAULTS, | 236 'DEFS': PNACL_DEFAULTS, |
225 'CC': NACL_CC_RULE, | 237 'CC': NACL_CC_RULES, |
226 'CXX': NACL_CC_RULE, | 238 'CXX': NACL_CC_RULES, |
227 'NMF' : NMF_RULE, | 239 'NMF' : NMF_RULE, |
228 'MAIN': PEXE_LINK_RULE, | 240 'MAIN': PEXE_LINK_RULES, |
229 'LIB': POSIX_LIB_RULE, | 241 'LIB': POSIX_LIB_RULES, |
230 'SO': None, | 242 'SO': None, |
231 'TOOL': NACL_TOOL | 243 'TOOL': PNACL_TOOL |
232 }, | 244 }, |
233 'win' : { | 245 'win' : { |
234 'ARCHES': [WIN_32], | 246 'ARCHES': [WIN_32], |
235 'DEFS': WIN_DEFAULTS, | 247 'DEFS': WIN_DEFAULTS, |
236 'CC': WIN_CC_RULE, | 248 'CC': WIN_CC_RULES, |
237 'CXX': WIN_CC_RULE, | 249 'CXX': WIN_CC_RULES, |
238 'NMF' : NMF_EMPTY, | 250 'NMF' : NMF_EMPTY, |
239 'MAIN': WIN_LINK_RULE, | 251 'MAIN': WIN_LINK_RULES, |
240 'LIB': WIN_LIB_RULE, | 252 'LIB': WIN_LIB_RULES, |
241 'SO': None, | 253 'SO': None, |
242 'TOOL': WIN_TOOL | 254 'TOOL': WIN_TOOL |
243 } | 255 } |
244 } | 256 } |
245 | 257 |
246 | 258 class MakeRules(object): |
247 def GetBuildRule(tool, ext): | 259 """MakeRules generates Tool, Config, and Arch dependend makefile settings. |
248 return BUILD_RULES[tool][ext] | 260 |
249 | 261 The MakeRules object generates strings used in the makefile based on the |
250 | 262 current object settings such as toolchain, configuration, architecture... |
251 def BuildList(tool, key, items): | 263 It stores settings such as includes, defines, and lists, and converts them |
252 pattern = BUILD_RULES[tool]['TOOL'][key] | 264 to the appropriate format whenever the toolchain changes. |
253 items = [(pattern % name) for name in items] | 265 """ |
254 return ' '.join(items) | 266 |
255 | 267 def __init__(self, tc, cfg=None, arch=None): |
256 def BuildDefineList(tool, defs): | 268 self.tc = tc |
257 return BuildList(tool, 'DEFINE', defs) | 269 self.defines = [] |
258 | 270 self.includes = [] |
259 | 271 self.libraries = [] |
260 def BuildIncludeList(tool, includes): | 272 self.vars = { |
261 return BuildList(tool, 'INCLUDE', includes) | 273 '<TAB>': '\t', |
262 | 274 } |
263 | 275 self.SetToolchain(tc) |
264 def BuildLibList(tool, libs): | 276 if cfg: |
265 return BuildList(tool, 'LIBRARY', libs) | 277 self.SetConfig(cfg) |
266 | 278 if arch: |
267 | 279 self.SetArch(arch) |
268 def BuildToolDict(toolchain, project, arch = {}, ext='nexe', **kwargs): | 280 |
269 tc = toolchain | 281 def _BuildList(self, key, items): |
270 TC = toolchain.upper() | 282 pattern = BUILD_RULES[self.tc]['TOOL'][key] |
271 proj = project | 283 if pattern and items: |
272 PROJ = proj.upper() | 284 items = [pattern % item for item in items] |
273 EXT = EXT_MAP.get(ext, ext.upper()) | 285 return ' '.join(items) |
274 | 286 return '' |
275 replace = { | 287 |
276 '<CC>' : '%s_%s' % (TC, EXT), | 288 def BuildDefaults(self): |
277 '<DUMP>': '%s_DUMP' % TC, | 289 return BUILD_RULES[self.tc]['DEFS'] |
278 '<ext>' : ext, | 290 |
279 '<EXT>' : EXT, | 291 def BuildDirectoryRules(self, configs): |
280 '<LIB>': '%s_LIB' % TC, | 292 tc = self.tc |
281 '<LINK>': '%s_LINK' % TC, | 293 rules = '\n#\n# Rules for %s toolchain\n#\n%s:\n\t$(MKDIR) %s\n' % ( |
282 '<proj>': proj, | 294 tc, tc, tc) |
283 '<PROJ>': PROJ, | 295 for cfg in configs: |
284 '<TAB>': '\t', | 296 rules += '%s/%s: | %s\n\t$(MKDIR) %s/%s\n' % (tc, cfg, tc, tc, cfg) |
285 '<tc>' : tc, | 297 |
286 '<TC>' : TC | 298 rules += '\n# Include header dependency files.\n' |
287 } | 299 for cfg in configs: |
288 | 300 rules += '-include %s/%s/*.d\n' % (tc, cfg) |
289 # Add replacements for this platform/architecture | 301 return rules + '\n' |
290 for key in arch: | 302 |
291 replace[key] = arch[key] | 303 def BuildCompileRule(self, EXT, src): |
292 | 304 self.vars['<EXT>'] = EXT |
293 # Add other passed in replacements | 305 out = '<tc>/<config>/%s_<ARCH>.o : %s $(THIS_MAKE) | <tc>/<config>\n' % ( |
294 for key in kwargs: | 306 os.path.splitext(src)[0], src) |
295 replace['<%s>' % key] = kwargs[key] | 307 out+= BUILD_RULES[self.tc][EXT][self.cfg] + '\n\n' |
296 | 308 return self.Replace(out) |
297 if '<OBJS>' not in replace: | 309 |
298 if replace.get('<ARCH>', ''): | 310 def BuildLinkRule(self): |
299 replace['<OBJS>'] = '%s_%s_%s_%s_O' % (TC, PROJ, replace['<ARCH>'], EXT) | 311 target = BUILD_RULES[self.tc]['TOOL'][self.ptype.upper()] |
| 312 out = '' |
| 313 if self.ptype == 'lib': |
| 314 out = 'ALL_TARGETS+=%s\n' % target |
| 315 out += target + ' : $(<PROJ>_<TC>_<CONFIG>_<ARCH>_O)\n' |
| 316 out += BUILD_RULES[self.tc][self.ptype.upper()][self.cfg] + '\n\n' |
| 317 return self.Replace(out) |
| 318 |
| 319 def BuildObjectList(self): |
| 320 obj_list = self.GetObjectList() |
| 321 sub_str = '$(patsubst %%,%s/%s/%%_%s.o,$(%s_OBJS))' % ( |
| 322 self.tc, self.cfg, self.arch['<ARCH>'], self.project.upper()) |
| 323 return '%s:=%s\n' % (obj_list, sub_str) |
| 324 |
| 325 def GetArches(self): |
| 326 return BUILD_RULES[self.tc]['ARCHES'] |
| 327 |
| 328 def GetObjectList(self): |
| 329 return '%s_%s_%s_%s_O' % (self.project.upper(), self.tc.upper(), |
| 330 self.cfg.upper(), self.arch['<ARCH>']) |
| 331 |
| 332 def SetArch(self, arch): |
| 333 self.arch = arch |
| 334 for key in arch: |
| 335 self.vars[key] = arch[key] |
| 336 |
| 337 def SetConfig(self, config): |
| 338 self.cfg = config |
| 339 self.vars['<config>'] = config |
| 340 self.vars['<CONFIG>'] = config.upper() |
| 341 |
| 342 def SetDefines(self, defs): |
| 343 self.defines = defs |
| 344 self.vars['<DEFLIST>'] = self._BuildList('DEFINE', defs) |
| 345 |
| 346 def SetIncludes(self, incs): |
| 347 self.includes = incs |
| 348 self.vars['<INCLIST>'] = self._BuildList('INCLUDE', incs) |
| 349 |
| 350 def SetLibraries(self, libs): |
| 351 self.libraries = libs |
| 352 self.vars['<LIBLIST>'] = self._BuildList('LIBRARY', libs) |
| 353 |
| 354 def SetProject(self, proj, ptype, defs=None, incs=None, libs=None): |
| 355 self.project = proj |
| 356 self.ptype = ptype |
| 357 self.vars['<proj>'] = proj |
| 358 self.vars['<PROJ>'] = proj.upper() |
| 359 self.SetDefines(defs) |
| 360 self.SetIncludes(incs) |
| 361 self.SetLibraries(libs) |
| 362 |
| 363 def SetSource(self, src): |
| 364 self.source = source |
| 365 self.vars['<src>'] = src |
| 366 |
| 367 def SetToolchain(self, tc): |
| 368 TC = tc.upper() |
| 369 self.vars['<CC>'] = '%s_CC' % TC |
| 370 self.vars['<CXX>'] = '%s_CXX' % TC |
| 371 self.vars['<DUMP>'] = '%s_DUMP' % TC |
| 372 self.vars['<LIB>'] = '%s_LIB' % TC |
| 373 self.vars['<LINK>'] = '%s_LINK' % TC |
| 374 self.vars['<tc>'] = tc |
| 375 self.vars['<TC>'] = TC |
| 376 self.SetDefines(self.defines) |
| 377 self.SetIncludes(self.includes) |
| 378 self.SetLibraries(self.libraries) |
| 379 |
| 380 def SetVars(self, **kwargs): |
| 381 # Add other passed in replacements |
| 382 for key in kwargs: |
| 383 self.vars['<%s>' % key] = kwargs[key] |
| 384 self.var_set = kwargs |
| 385 |
| 386 def Replace(self, text): |
| 387 return Replace(text, self.vars) |
| 388 |
| 389 |
| 390 def Replace(text, replacements): |
| 391 for key in replacements: |
| 392 val = replacements[key] |
| 393 if val is not None: |
| 394 text = text.replace(key, val) |
| 395 return text |
| 396 |
| 397 |
| 398 def SetVar(varname, values): |
| 399 if not values: |
| 400 return varname + ':=\n' |
| 401 |
| 402 line = varname + ':=' |
| 403 out = '' |
| 404 for value in values: |
| 405 if len(line) + len(value) > 78: |
| 406 out += line[:-1] + '\n' |
| 407 line = '%s+=%s ' % (varname, value) |
300 else: | 408 else: |
301 replace['<OBJS>'] = '%s_%s_%s_O' % (TC, PROJ, EXT) | 409 line += value + ' ' |
302 return replace | 410 |
303 | 411 if line: |
| 412 out += line[:-1] + '\n' |
| 413 return out |
| 414 |
| 415 |
| 416 def GenerateCleanRules(tools, configs): |
| 417 rules = '#\n# Target to remove temporary files\n#\n.PHONY: clean\nclean:\n' |
| 418 for tc in tools: |
| 419 for cfg in configs: |
| 420 rules += '\t$(RM) -fr %s/%s\n' % (tc, cfg) |
| 421 return rules + '\n' |
| 422 |
| 423 |
| 424 def GenerateNMFRules(tc, main, dlls, cfg, arches): |
| 425 target = BUILD_RULES[tc]['TOOL']['NMFMAIN'] |
| 426 dll_target = BUILD_RULES[tc]['TOOL']['SO'] |
| 427 nmf_targets = [] |
| 428 |
| 429 for arch in arches: |
| 430 replace = { |
| 431 '<ARCH>' : arch['<ARCH>'], |
| 432 '<config>' : cfg, |
| 433 '<DUMP>' : '%s_DUMP' % tc.upper(), |
| 434 '<TAB>' : '\t', |
| 435 '<tc>' : tc |
| 436 } |
| 437 for dll in dlls: |
| 438 replace['<proj>'] = dll |
| 439 nmf_targets.append(Replace(dll_target, replace)) |
| 440 replace['<proj>'] = main |
| 441 nmf_targets.append(Replace(target, replace)) |
| 442 |
| 443 replace['<NMF_TARGETS>'] = ' '.join(nmf_targets) |
| 444 rules = Replace(BUILD_RULES[tc]['NMF'], replace) |
| 445 return '\nALL_TARGETS+=%s/%s/%s.nmf' % (tc, cfg, main) + rules + '\n' |
OLD | NEW |