|
1 # |
|
2 # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
|
3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 # |
|
5 # This code is free software; you can redistribute it and/or modify it |
|
6 # under the terms of the GNU General Public License version 2 only, as |
|
7 # published by the Free Software Foundation. Oracle designates this |
|
8 # particular file as subject to the "Classpath" exception as provided |
|
9 # by Oracle in the LICENSE file that accompanied this code. |
|
10 # |
|
11 # This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 # version 2 for more details (a copy is included in the LICENSE file that |
|
15 # accompanied this code). |
|
16 # |
|
17 # You should have received a copy of the GNU General Public License version |
|
18 # 2 along with this work; if not, write to the Free Software Foundation, |
|
19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 # |
|
21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 # or visit www.oracle.com if you need additional information or have any |
|
23 # questions. |
|
24 # |
|
25 |
|
26 ################################################################ |
|
27 # |
|
28 # Check that GNU make and cygwin are recent enough. |
|
29 # Setup common utility functions. |
|
30 # |
|
31 ################################################################ |
|
32 |
|
33 ifndef _MAKEBASE_GMK |
|
34 _MAKEBASE_GMK := 1 |
|
35 |
|
36 ifeq (,$(findstring 3.81,$(MAKE_VERSION))) |
|
37 ifeq (,$(findstring 3.82,$(MAKE_VERSION))) |
|
38 $(error This version of GNU Make is too low ($(MAKE_VERSION)). Please upgrade to 3.81 or newer.) |
|
39 endif |
|
40 endif |
|
41 |
|
42 ifneq (,$(CYGPATH)) |
|
43 # Cygwin styff, if needed but most is going to be |
|
44 # done in configure! |
|
45 ifeq (yes,$(CHECK_FOR_VCINSTALLDIR)) |
|
46 ifeq (,$(VCINSTALLDIR)) |
|
47 $(info Could not find compiler paths!) |
|
48 $(info You probably configured the build from within a) |
|
49 $(info VS command prompt, but you are not using such a) |
|
50 $(info prompt right now.) |
|
51 $(info If you instead run configure from a plain cygwin shell, it) |
|
52 $(info will attempt to setup VS for you! Please try that.) |
|
53 $(error Giving up for now.) |
|
54 endif |
|
55 endif |
|
56 endif |
|
57 |
|
58 # The build times report is turned off by setting REPORT_BUILD_TIMES to nothing. |
|
59 # This is necessary for the target clean which will erase the |
|
60 # directories where the buildtimes are stored. |
|
61 REPORT_BUILD_TIMES=1 |
|
62 # Store the build times in this directory. |
|
63 BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes |
|
64 |
|
65 # Record starting time for build of a sub repository. |
|
66 define RecordStartTime |
|
67 $(MKDIR) -p $(BUILDTIMESDIR) |
|
68 $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 |
|
69 $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable |
|
70 endef |
|
71 |
|
72 # Indicate that we started to build a sub repository and record starting time. |
|
73 define MakeStart |
|
74 $(call RecordStartTime,$1) |
|
75 $(BUILD_LOG_WRAPPER) $(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n\n" \ |
|
76 "########################################################################" \ |
|
77 "########################################################################" \ |
|
78 "Entering $1 for target(s) $2" \ |
|
79 "########################################################################" |
|
80 endef |
|
81 |
|
82 # Record ending time and calculate the difference and store it in a |
|
83 # easy to read format. Handles builds that cross midnight. Expects |
|
84 # that a build will never take 24 hours or more. |
|
85 define RecordEndTime |
|
86 $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 |
|
87 $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable |
|
88 $(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ |
|
89 $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ |
|
90 M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ |
|
91 > $(BUILDTIMESDIR)/build_time_diff_$1 |
|
92 endef |
|
93 |
|
94 # Indicate that we are done. |
|
95 # Record ending time and print out the total time it took to build. |
|
96 define MakeFinish |
|
97 $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,$1),) |
|
98 $(BUILD_LOG_WRAPPER) $(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s #####\n%s\n\n" \ |
|
99 "########################################################################" \ |
|
100 "Leaving $1 for target(s) $2" \ |
|
101 "########################################################################" \ |
|
102 $(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \ |
|
103 "########################################################################" |
|
104 endef |
|
105 |
|
106 # Find all build_time_* files and print their contents in a list sorted |
|
107 # on the name of the sub repository. |
|
108 define ReportBuildTimes |
|
109 $(BUILD_LOG_WRAPPER) $(PRINTF) -- "-- Build times ----------\nTarget %s\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ |
|
110 "$1" \ |
|
111 "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ |
|
112 "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ |
|
113 "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ |
|
114 "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" |
|
115 endef |
|
116 |
|
117 define ResetTimers |
|
118 $$(shell $(MKDIR) -p $(BUILDTIMESDIR) && $(RM) $(BUILDTIMESDIR)/build_time_*) |
|
119 endef |
|
120 |
|
121 define StartTimer |
|
122 $(call RecordStartTime,TOTAL) |
|
123 endef |
|
124 |
|
125 define StopTimer |
|
126 $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),) |
|
127 endef |
|
128 |
|
129 # If the variable that you want to send to stdout for piping into a file or otherwise, |
|
130 # is potentially long, for example the a list of file paths, eg a list of all package directories. |
|
131 # Then you need to use ListPathsSafely, which optimistically splits the output into several shell |
|
132 # calls as well as use compression on recurrent file paths segments, to get around the potential |
|
133 # command line length problem that exists in cygwin and other shells. |
|
134 compress_pre:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.pre)) |
|
135 compress_post:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.post)) |
|
136 compress_paths=$(compress_pre)\ |
|
137 $(subst $(SRC_ROOT),X97,\ |
|
138 $(subst $(OUTPUT_ROOT),X98,\ |
|
139 $(subst X,X00,\ |
|
140 $(subst $(SPACE),\n,$(strip $1)))))\ |
|
141 $(compress_post) |
|
142 |
|
143 decompress_paths=sed -f $(SRC_ROOT)/common/makefiles/uncompress.sed -e 's|X99|\\n|g' \ |
|
144 -e 's|X98|$(OUTPUT_ROOT)|g' -e 's|X97|$(SRC_ROOT)|g' \ |
|
145 -e 's|X00|X|g' | tr '\n' '$2' |
|
146 |
|
147 define ListPathsSafely_If |
|
148 $(if $(word $3,$($1)),$(eval $1_LPS$3:=$(call compress_paths,$(wordlist $3,$4,$($1))))) |
|
149 endef |
|
150 |
|
151 define ListPathsSafely_Printf |
|
152 $(if $(strip $($1_LPS$4)),printf -- "$(strip $($1_LPS$4))\n" | $(decompress_paths) $3) |
|
153 endef |
|
154 |
|
155 # Receipt example: |
|
156 # rm -f thepaths |
|
157 # $(call ListPathsSafely,THEPATHS,\n, >> thepaths) |
|
158 # The \n argument means translate spaces into \n |
|
159 # if instead , , (a space) is supplied, then spaces remain spaces. |
|
160 define ListPathsSafely |
|
161 $(if $(word 10001,$($1)),$(error Cannot list safely more than 10000 paths. $1 has $(words $($1)) paths!)) |
|
162 $(call ListPathsSafely_If,$1,$2,1,250) |
|
163 $(call ListPathsSafely_If,$1,$2,251,500) |
|
164 $(call ListPathsSafely_If,$1,$2,501,750) |
|
165 $(call ListPathsSafely_If,$1,$2,751,1000) |
|
166 |
|
167 $(call ListPathsSafely_If,$1,$2,1001,1250) |
|
168 $(call ListPathsSafely_If,$1,$2,1251,1500) |
|
169 $(call ListPathsSafely_If,$1,$2,1501,1750) |
|
170 $(call ListPathsSafely_If,$1,$2,1751,2000) |
|
171 |
|
172 $(call ListPathsSafely_If,$1,$2,2001,2250) |
|
173 $(call ListPathsSafely_If,$1,$2,2251,2500) |
|
174 $(call ListPathsSafely_If,$1,$2,2501,2750) |
|
175 $(call ListPathsSafely_If,$1,$2,2751,3000) |
|
176 |
|
177 $(call ListPathsSafely_If,$1,$2,3001,3250) |
|
178 $(call ListPathsSafely_If,$1,$2,3251,3500) |
|
179 $(call ListPathsSafely_If,$1,$2,3501,3750) |
|
180 $(call ListPathsSafely_If,$1,$2,3751,4000) |
|
181 |
|
182 $(call ListPathsSafely_If,$1,$2,4001,4250) |
|
183 $(call ListPathsSafely_If,$1,$2,4251,4500) |
|
184 $(call ListPathsSafely_If,$1,$2,4501,4750) |
|
185 $(call ListPathsSafely_If,$1,$2,4751,5000) |
|
186 |
|
187 $(call ListPathsSafely_If,$1,$2,5001,5250) |
|
188 $(call ListPathsSafely_If,$1,$2,5251,5500) |
|
189 $(call ListPathsSafely_If,$1,$2,5501,5750) |
|
190 $(call ListPathsSafely_If,$1,$2,5751,6000) |
|
191 |
|
192 $(call ListPathsSafely_If,$1,$2,6001,6250) |
|
193 $(call ListPathsSafely_If,$1,$2,6251,6500) |
|
194 $(call ListPathsSafely_If,$1,$2,6501,6750) |
|
195 $(call ListPathsSafely_If,$1,$2,6751,7000) |
|
196 |
|
197 $(call ListPathsSafely_If,$1,$2,7001,7250) |
|
198 $(call ListPathsSafely_If,$1,$2,7251,7500) |
|
199 $(call ListPathsSafely_If,$1,$2,7501,7750) |
|
200 $(call ListPathsSafely_If,$1,$2,7751,8000) |
|
201 |
|
202 $(call ListPathsSafely_If,$1,$2,8001,8250) |
|
203 $(call ListPathsSafely_If,$1,$2,8251,8500) |
|
204 $(call ListPathsSafely_If,$1,$2,8501,8750) |
|
205 $(call ListPathsSafely_If,$1,$2,8751,9000) |
|
206 |
|
207 $(call ListPathsSafely_If,$1,$2,9001,9250) |
|
208 $(call ListPathsSafely_If,$1,$2,9251,9500) |
|
209 $(call ListPathsSafely_If,$1,$2,9501,9750) |
|
210 $(call ListPathsSafely_If,$1,$2,9751,10000) |
|
211 |
|
212 $(call ListPathsSafely_Printf,$1,$2,$3,1) |
|
213 $(call ListPathsSafely_Printf,$1,$2,$3,251) |
|
214 $(call ListPathsSafely_Printf,$1,$2,$3,501) |
|
215 $(call ListPathsSafely_Printf,$1,$2,$3,751) |
|
216 |
|
217 $(call ListPathsSafely_Printf,$1,$2,$3,1001) |
|
218 $(call ListPathsSafely_Printf,$1,$2,$3,1251) |
|
219 $(call ListPathsSafely_Printf,$1,$2,$3,1501) |
|
220 $(call ListPathsSafely_Printf,$1,$2,$3,1751) |
|
221 |
|
222 $(call ListPathsSafely_Printf,$1,$2,$3,2001) |
|
223 $(call ListPathsSafely_Printf,$1,$2,$3,2251) |
|
224 $(call ListPathsSafely_Printf,$1,$2,$3,2501) |
|
225 $(call ListPathsSafely_Printf,$1,$2,$3,2751) |
|
226 |
|
227 $(call ListPathsSafely_Printf,$1,$2,$3,3001) |
|
228 $(call ListPathsSafely_Printf,$1,$2,$3,3251) |
|
229 $(call ListPathsSafely_Printf,$1,$2,$3,3501) |
|
230 $(call ListPathsSafely_Printf,$1,$2,$3,3751) |
|
231 |
|
232 $(call ListPathsSafely_Printf,$1,$2,$3,4001) |
|
233 $(call ListPathsSafely_Printf,$1,$2,$3,4251) |
|
234 $(call ListPathsSafely_Printf,$1,$2,$3,4501) |
|
235 $(call ListPathsSafely_Printf,$1,$2,$3,4751) |
|
236 |
|
237 $(call ListPathsSafely_Printf,$1,$2,$3,5001) |
|
238 $(call ListPathsSafely_Printf,$1,$2,$3,5251) |
|
239 $(call ListPathsSafely_Printf,$1,$2,$3,5501) |
|
240 $(call ListPathsSafely_Printf,$1,$2,$3,5751) |
|
241 |
|
242 $(call ListPathsSafely_Printf,$1,$2,$3,6001) |
|
243 $(call ListPathsSafely_Printf,$1,$2,$3,6251) |
|
244 $(call ListPathsSafely_Printf,$1,$2,$3,6501) |
|
245 $(call ListPathsSafely_Printf,$1,$2,$3,6751) |
|
246 |
|
247 $(call ListPathsSafely_Printf,$1,$2,$3,7001) |
|
248 $(call ListPathsSafely_Printf,$1,$2,$3,7251) |
|
249 $(call ListPathsSafely_Printf,$1,$2,$3,7501) |
|
250 $(call ListPathsSafely_Printf,$1,$2,$3,7751) |
|
251 |
|
252 $(call ListPathsSafely_Printf,$1,$2,$3,8001) |
|
253 $(call ListPathsSafely_Printf,$1,$2,$3,8251) |
|
254 $(call ListPathsSafely_Printf,$1,$2,$3,8501) |
|
255 $(call ListPathsSafely_Printf,$1,$2,$3,8751) |
|
256 |
|
257 $(call ListPathsSafely_Printf,$1,$2,$3,9001) |
|
258 $(call ListPathsSafely_Printf,$1,$2,$3,9251) |
|
259 $(call ListPathsSafely_Printf,$1,$2,$3,9501) |
|
260 $(call ListPathsSafely_Printf,$1,$2,$3,9751) |
|
261 endef |
|
262 |
|
263 define ListPathsSafelyNow_IfPrintf |
|
264 ifneq (,$$(word $4,$$($1))) |
|
265 $$(eval $1_LPS$4:=$$(call compress_paths,$$(wordlist $4,$5,$$($1)))) |
|
266 $$(shell printf -- "$$(strip $$($1_LPS$4))\n" | $(decompress_paths) $3) |
|
267 endif |
|
268 endef |
|
269 |
|
270 # And an non-receipt version: |
|
271 define ListPathsSafelyNow |
|
272 ifneq (,$$(word 10001,$$($1))) |
|
273 $$(error Cannot list safely more than 10000 paths. $1 has $$(words $$($1)) paths!) |
|
274 endif |
|
275 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,1,250) |
|
276 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,251,500) |
|
277 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,501,750) |
|
278 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,751,1000) |
|
279 |
|
280 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,1001,1250) |
|
281 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,1251,1500) |
|
282 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,1501,1750) |
|
283 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,1751,2000) |
|
284 |
|
285 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,2001,2250) |
|
286 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,2251,2500) |
|
287 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,2501,2750) |
|
288 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,2751,3000) |
|
289 |
|
290 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,3001,3250) |
|
291 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,3251,3500) |
|
292 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,3501,3750) |
|
293 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,3751,4000) |
|
294 |
|
295 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,4001,4250) |
|
296 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,4251,4500) |
|
297 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,4501,4750) |
|
298 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,4751,5000) |
|
299 |
|
300 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,5001,5250) |
|
301 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,5251,5500) |
|
302 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,5501,5750) |
|
303 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,5751,6000) |
|
304 |
|
305 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,6001,6250) |
|
306 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,6251,6500) |
|
307 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,6501,6750) |
|
308 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,6751,7000) |
|
309 |
|
310 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,7001,7250) |
|
311 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,7251,7500) |
|
312 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,7501,7750) |
|
313 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,7751,8000) |
|
314 |
|
315 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,8001,8250) |
|
316 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,8251,8500) |
|
317 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,8501,8750) |
|
318 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,8751,9000) |
|
319 |
|
320 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,9001,9250) |
|
321 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,9251,9500) |
|
322 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,9501,9750) |
|
323 $(call ListPathsSafelyNow_IfPrintf,$1,$2,$3,9751,10000) |
|
324 |
|
325 endef |
|
326 |
|
327 endif # _MAKEBASE_GMK |