Mercurial > repos > fubar > microsatbed
comparison seqrequester/src/Makefile.boilermake @ 1:1085e094cf5f draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/microsatbed commit 7ceb6658309a7ababe622b5d92e729e5470e22f0-dirty
author | fubar |
---|---|
date | Sat, 13 Jul 2024 12:39:06 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:dd71d3167476 | 1:1085e094cf5f |
---|---|
1 # -*- Makefile -*- | |
2 # | |
3 # boilermake: A reusable, but flexible, boilerplate Makefile. | |
4 # | |
5 # Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok | |
6 # | |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 # | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU General Public License for more details. | |
16 # | |
17 # You should have received a copy of the GNU General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 # | |
21 # Significantly modified for Marbl projects. Get the original from | |
22 # https://github.com/dmoulding/boilermake | |
23 # | |
24 | |
25 | |
26 # | |
27 # Set paths for building and installing. If DESTDIR is defined, | |
28 # use that, otherwise, use the directory just above us. | |
29 # | |
30 # We used to use "OSTYPE-MACHINETYPE" instead of "build" to allow | |
31 # multi-platform builds. We now make the user set DESTDIR for that | |
32 # functionality. The three variables are now just diagnostic info with some | |
33 # historical baggage (but even more was removed, like "Power Macintosh" | |
34 # detection). | |
35 # | |
36 ifeq "$(strip ${DESTDIR})" "" | |
37 BUILD_DIR := $(realpath ..)/build/obj | |
38 TARGET_DIR := $(realpath ..)/build | |
39 else | |
40 BUILD_DIR := $(DESTDIR)/build/obj | |
41 TARGET_DIR := $(DESTDIR)/build | |
42 endif | |
43 | |
44 OSTYPE := $(shell echo `uname`) | |
45 OSVERSION := $(shell echo `uname -r`)) | |
46 MACHINETYPE := $(subst x86_64,amd64,$(shell echo `uname -m`)) | |
47 | |
48 # | |
49 # Define the source file extensions that we know how to handle. | |
50 # | |
51 C_SRC_EXTS := %.c | |
52 CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++ | |
53 JAVA_EXTS := %.jar %.tar | |
54 ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS} ${JAVA_EXTS} | |
55 | |
56 # | |
57 # Initialize internal variables. | |
58 # | |
59 ALL_TGTS := | |
60 DIR_STACK := | |
61 TGT_STACK := | |
62 | |
63 ######################################## | |
64 # | |
65 # The single entry point to create all the targets and rules and everything. | |
66 # | |
67 # $(eval $(call BOILERMAKE)) | |
68 # | |
69 ######################################## | |
70 | |
71 define BOILERMAKE | |
72 | |
73 # Add a new target rule for each user-defined target. | |
74 $(foreach TGT,${ALL_TGTS},\ | |
75 $(eval $(call ADD_TARGET_RULE,${TGT}))) | |
76 | |
77 # Add pattern rule(s) for creating compiled object code from C source. | |
78 $(foreach TGT,${ALL_TGTS},\ | |
79 $(foreach EXT,${C_SRC_EXTS},\ | |
80 $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ | |
81 ${EXT},$${COMPILE_C_CMDS})))) | |
82 | |
83 # Add pattern rule(s) for creating compiled object code from C++ source. | |
84 $(foreach TGT,${ALL_TGTS},\ | |
85 $(foreach EXT,${CXX_SRC_EXTS},\ | |
86 $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ | |
87 ${EXT},$${COMPILE_CXX_CMDS})))) | |
88 | |
89 # Add "clean" rules to remove all build-generated files. | |
90 $(foreach TGT,${ALL_TGTS},\ | |
91 $(eval $(call ADD_CLEAN_RULE,${TGT}))) | |
92 | |
93 # Include generated rules that define additional (header) dependencies | |
94 # (but don't complain if that file doesn't exist). | |
95 $(foreach TGT,${ALL_TGTS},\ | |
96 $(eval -include ${${TGT}_DEPS})) | |
97 | |
98 # Define more targets to copy files to the target directory. | |
99 $(call ADD_FILE_COPY_RULES,${EXECUTABLES},executable) | |
100 $(call ADD_FILE_COPY_RULES,${FILES},) | |
101 endef | |
102 | |
103 | |
104 ############################################################ | |
105 # | |
106 # boilermake internal functions below. | |
107 # | |
108 ############################################################ | |
109 | |
110 # | |
111 # Adds a new rule and phony target for cleaning the specified target | |
112 # (removing its build-generated files). Use with EVAL. | |
113 # | |
114 define ADD_CLEAN_RULE | |
115 doclean: doclean-${1} | |
116 .PHONY: doclean-${1} | |
117 doclean-${1}: | |
118 $$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]}) | |
119 $${${1}_POSTCLEAN} | |
120 endef | |
121 | |
122 # ADD_FILE_COPY_RULES adds rules to copy source files directly to the | |
123 # TARGET_DIR and optionally make them executable. A rule to remove the | |
124 # copied file (on 'make clean') is also added. It expects a list of files | |
125 # to copy and their destination: | |
126 # | |
127 # EXECUTABLES += scripts/a -> bin/b # These go in main.mk | |
128 # | |
129 # FILES += scripts/module/c -> lib/site_perl/module/d \ | |
130 # data/e -> share/data/f | |
131 # | |
132 # $(call ADD_FILE_COPY_RULES,${EXECS},) # These go in Makefile! | |
133 # $(call ADD_FILE_COPY_RULES,${FILES},) | |
134 # | |
135 # Source locations are relative to the submakefile location, and destination | |
136 # locations are relative to TARGET_DIR (e.g., 'build/'. Destination | |
137 # directories are created if needed. | |
138 # | |
139 # If the second parameter is the "executable", then the copied file is made | |
140 # executable. | |
141 # | |
142 # ADD_FILE_COPY_RULE does the work of adding the rules, copying the first | |
143 # parameter to the second parameter and setting +x if the third parameter is | |
144 # "executable". | |
145 # | |
146 # MAKE_FILE_COPY_LIST strips whitespace from around the 'file copy' operator | |
147 # '->' in the user-supplied file-copy-list. It works by first squashing | |
148 # adjacent white space to a single space, then replacing adjacent whitespace | |
149 # with nothing. | |
150 # | |
151 # (The $\ at the end of some of these lines serve to eat up whitespace | |
152 # before the continued line.) | |
153 # | |
154 define MAKE_FILE_COPY_LIST | |
155 $(subst $ ->$ ,->,$\ | |
156 $(subst $ -> $ ,->,$\ | |
157 $(strip ${1}))) | |
158 endef | |
159 | |
160 define ADD_FILE_COPY_RULE | |
161 doall: $${TARGET_DIR}/$2 | |
162 ifeq ($3,executable) | |
163 $${TARGET_DIR}/$2: $1 | |
164 @mkdir -p $$(dir $${TARGET_DIR}/$2) | |
165 cp -pf $1 $${TARGET_DIR}/$2 | |
166 chmod +x $${TARGET_DIR}/$2 | |
167 else | |
168 $${TARGET_DIR}/$2: $1 | |
169 @mkdir -p $$(dir $${TARGET_DIR}/$2) | |
170 cp -pf $1 $${TARGET_DIR}/$2 | |
171 endif | |
172 doclean: doclean-$1 | |
173 .PHONY: doclean-$1 | |
174 doclean-$1: | |
175 rm -f $${TARGET_DIR}/$2 | |
176 endef | |
177 | |
178 define ADD_FILE_COPY_RULES | |
179 $(foreach R,$(call MAKE_FILE_COPY_LIST,$1),\ | |
180 $(eval $(call ADD_FILE_COPY_RULE,$(firstword $(subst ->, ,${R})),$\ | |
181 $(lastword $(subst ->, ,${R})),$2))) | |
182 endef | |
183 | |
184 # Adds a pattern rule for building object files from source files with the | |
185 # filename extension specified in the second argument. The first argument | |
186 # must be the name of the base directory where the object files should | |
187 # reside (such that the portion of the path after the base directory will | |
188 # match the path to corresponding source files). The third argument must | |
189 # contain the rules used to compile the source files into object code form. | |
190 # Use with EVAL. | |
191 # | |
192 define ADD_OBJECT_RULE | |
193 ${1}/%.o: ${2} ${VERSION_H} | |
194 ${3} | |
195 endef | |
196 | |
197 # Adds a new target to the Makefile. Targets are executable files unless | |
198 # they end with '.a'. Use with EVAL. | |
199 # | |
200 define ADD_TARGET_RULE | |
201 ifeq "$$(suffix ${1})" ".a" | |
202 # Add a target for creating a static library. | |
203 $${TARGET_DIR}/${1}: $${${1}_OBJS} | |
204 @mkdir -p $$(dir $$@) | |
205 $$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS}) | |
206 $${${1}_POSTMAKE} | |
207 else | |
208 # Add a target for linking an executable. First, attempt to select the | |
209 # appropriate front-end to use for linking. This might not choose the | |
210 # right one (e.g. if linking with a C++ static library, but all other | |
211 # sources are C sources), so the user makefile is allowed to specify a | |
212 # linker to be used for each target. | |
213 ifeq "$$(strip $${${1}_LINKER})" "" | |
214 # No linker was explicitly specified to be used for this target. If | |
215 # there are any C++ sources for this target, use the C++ compiler. | |
216 # For all other targets, default to using the C compiler. | |
217 ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" "" | |
218 ${1}_LINKER = $${CXX} | |
219 else | |
220 ${1}_LINKER = $${CC} | |
221 endif | |
222 endif | |
223 | |
224 $${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS} | |
225 @mkdir -p $$(dir $$@) | |
226 $$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} $${${1}_OBJS} $${${1}_LDLIBS} $${LDLIBS}) | |
227 $${${1}_POSTMAKE} | |
228 endif | |
229 endef | |
230 | |
231 # COMPILE_C_CMDS - Commands for compiling C source code. | |
232 define COMPILE_C_CMDS | |
233 @mkdir -p $(dir $@) | |
234 $(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${SRC_INCDIRS} ${SYS_INCDIRS} ${SRC_DEFS} $<) | |
235 @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ | |
236 sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ | |
237 -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ | |
238 >> ${@:%$(suffix $@)=%.P}; \ | |
239 rm -f ${@:%$(suffix $@)=%.d} | |
240 endef | |
241 | |
242 # COMPILE_CXX_CMDS - Commands for compiling C++ source code. | |
243 define COMPILE_CXX_CMDS | |
244 @mkdir -p $(dir $@) | |
245 $(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${SRC_INCDIRS} ${SYS_INCDIRS} ${SRC_DEFS} $<) | |
246 @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ | |
247 sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ | |
248 -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ | |
249 >> ${@:%$(suffix $@)=%.P}; \ | |
250 rm -f ${@:%$(suffix $@)=%.d} | |
251 endef | |
252 | |
253 # INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new | |
254 # "submakefile" fragment into the overall Makefile. It also recursively | |
255 # includes all submakefiles of the specified submakefile fragment. | |
256 # | |
257 # USE WITH EVAL | |
258 # | |
259 define INCLUDE_SUBMAKEFILE | |
260 # Initialize all variables that can be defined by a makefile fragment, then | |
261 # include the specified makefile fragment. | |
262 TARGET := | |
263 TGT_LDFLAGS := | |
264 TGT_LDLIBS := | |
265 TGT_LINKER := | |
266 TGT_PREREQS := | |
267 | |
268 SOURCES := | |
269 SRC_CFLAGS := | |
270 SRC_CXXFLAGS := | |
271 SRC_DEFS := | |
272 SRC_INCDIRS := | |
273 | |
274 SYS_INCDIRS := | |
275 | |
276 SUBMAKEFILES := | |
277 | |
278 # A directory stack is maintained so that the correct paths are used as we | |
279 # recursively include all submakefiles. Get the makefile's directory and | |
280 # push it onto the stack. | |
281 DIR := $(call CANONICAL_PATH,$(dir ${1})) | |
282 DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR}) | |
283 | |
284 include ${1} | |
285 | |
286 # Initialize internal local variables. | |
287 OBJS := | |
288 | |
289 # Determine which target this makefile's variables apply to. A stack is | |
290 # used to keep track of which target is the "current" target as we | |
291 # recursively include other submakefiles. | |
292 ifneq "$$(strip $${TARGET})" "" | |
293 # This makefile defined a new target. Target variables defined by this | |
294 # makefile apply to this new target. Initialize the target's variables. | |
295 | |
296 ifeq "$$(suffix $${TARGET})" ".a" | |
297 TGT := $$(addprefix lib/, $$(strip $${TARGET})) | |
298 else | |
299 TGT := $$(addprefix bin/, $$(strip $${TARGET})) | |
300 endif | |
301 ALL_TGTS += $${TGT} | |
302 $${TGT}_DEPS := | |
303 $${TGT}_LDFLAGS := $${TGT_LDFLAGS} | |
304 $${TGT}_LDLIBS := $${TGT_LDLIBS} | |
305 $${TGT}_LINKER := $${TGT_LINKER} | |
306 $${TGT}_OBJS := | |
307 $${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/lib/,$${TGT_PREREQS}) | |
308 else | |
309 # The values defined by this makefile apply to the the "current" target | |
310 # as determined by which target is at the top of the stack. | |
311 TGT := $$(strip $$(call PEEK,$${TGT_STACK})) | |
312 $${TGT}_LDFLAGS += $${TGT_LDFLAGS} | |
313 $${TGT}_LDLIBS += $${TGT_LDLIBS} | |
314 $${TGT}_PREREQS += $${TGT_PREREQS} | |
315 endif | |
316 | |
317 # Push the current target onto the target stack. | |
318 TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT}) | |
319 | |
320 ifneq "$$(strip $${SOURCES})" "" | |
321 # This makefile builds one or more objects from source. Validate the | |
322 # specified sources against the supported source file types. | |
323 BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES})) | |
324 ifneq "$${BAD_SRCS}" "" | |
325 $$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}]) | |
326 endif | |
327 | |
328 # Qualify and canonicalize paths. | |
329 SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES}) | |
330 SOURCES := $$(call CANONICAL_PATH,$${SOURCES}) | |
331 SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS}) | |
332 SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS}) | |
333 SYS_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SYS_INCDIRS}) | |
334 SYS_INCDIRS := $$(call CANONICAL_PATH,$${SYS_INCDIRS}) | |
335 | |
336 # Save the list of source files for this target. | |
337 $${TGT}_SOURCES += $${SOURCES} | |
338 | |
339 # Convert the source file names to their corresponding object file | |
340 # names. | |
341 OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\ | |
342 $$(addsuffix .o,$$(basename $${SOURCES}))) | |
343 | |
344 # Add the objects to the current target's list of objects, and create | |
345 # target-specific variables for the objects based on any source | |
346 # variables that were defined. | |
347 $${TGT}_OBJS += $${OBJS} | |
348 $${TGT}_DEPS += $${OBJS:%.o=%.P} | |
349 $${OBJS}: SRC_CFLAGS := $${SRC_CFLAGS} | |
350 $${OBJS}: SRC_CXXFLAGS := $${SRC_CXXFLAGS} | |
351 $${OBJS}: SRC_DEFS := $$(addprefix -D,$${SRC_DEFS}) | |
352 $${OBJS}: SRC_INCDIRS := $$(addprefix -iquote,$${SRC_INCDIRS}) | |
353 $${OBJS}: SYS_INCDIRS := $$(addprefix -isystem,$${SYS_INCDIRS}) | |
354 endif | |
355 | |
356 ifneq "$$(strip $${SUBMAKEFILES})" "" | |
357 # This makefile has submakefiles. Recursively include them. | |
358 $$(foreach MK,$${SUBMAKEFILES},\ | |
359 $$(eval $$(call INCLUDE_SUBMAKEFILE,\ | |
360 $$(call CANONICAL_PATH,\ | |
361 $$(call QUALIFY_PATH,$${DIR},$${MK}))))) | |
362 endif | |
363 | |
364 # Reset the "current" target to it's previous value. | |
365 TGT_STACK := $$(call POP,$${TGT_STACK}) | |
366 TGT := $$(call PEEK,$${TGT_STACK}) | |
367 | |
368 # Reset the "current" directory to it's previous value. | |
369 DIR_STACK := $$(call POP,$${DIR_STACK}) | |
370 DIR := $$(call PEEK,$${DIR_STACK}) | |
371 endef | |
372 | |
373 | |
374 # MIN - Parameterized "function" that results in the minimum lexical value of | |
375 # the two values given. | |
376 #define MIN | |
377 #$(firstword $(sort ${1} ${2})) | |
378 #endef | |
379 | |
380 # PEEK - Parameterized "function" that results in the value at the top of the | |
381 # specified colon-delimited stack. | |
382 define PEEK | |
383 $(lastword $(subst :, ,${1})) | |
384 endef | |
385 | |
386 # POP - Parameterized "function" that pops the top value off of the specified | |
387 # colon-delimited stack, and results in the new value of the stack. Note that | |
388 # the popped value cannot be obtained using this function; use peek for that. | |
389 define POP | |
390 ${1:%:$(lastword $(subst :, ,${1}))=%} | |
391 endef | |
392 | |
393 # PUSH - Parameterized "function" that pushes a value onto the specified colon- | |
394 # delimited stack, and results in the new value of the stack. | |
395 define PUSH | |
396 ${2:%=${1}:%} | |
397 endef | |
398 | |
399 # CANONICAL_PATH - Given one or more paths, converts the paths to the canonical | |
400 # form. The canonical form is the path, relative to the project's top-level | |
401 # directory (the directory from which "make" is run), and without | |
402 # any "./" or "../" sequences. For paths that are not located below the | |
403 # top-level directory, the canonical form is the absolute path (i.e. from | |
404 # the root of the filesystem) also without "./" or "../" sequences. | |
405 define CANONICAL_PATH | |
406 $(patsubst ${CURDIR}/%,%,$(abspath ${1})) | |
407 endef | |
408 | |
409 # QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the | |
410 # paths using the "root" directory (i.e. appends the root directory name to | |
411 # the paths) except for paths that are absolute. | |
412 define QUALIFY_PATH | |
413 $(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2}) | |
414 endef |