Mercurial > repos > fubar > microsatbed
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seqrequester/src/Makefile.boilermake Sat Jul 13 12:39:06 2024 +0000 @@ -0,0 +1,414 @@ +# -*- Makefile -*- +# +# boilermake: A reusable, but flexible, boilerplate Makefile. +# +# Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# +# Significantly modified for Marbl projects. Get the original from +# https://github.com/dmoulding/boilermake +# + + +# +# Set paths for building and installing. If DESTDIR is defined, +# use that, otherwise, use the directory just above us. +# +# We used to use "OSTYPE-MACHINETYPE" instead of "build" to allow +# multi-platform builds. We now make the user set DESTDIR for that +# functionality. The three variables are now just diagnostic info with some +# historical baggage (but even more was removed, like "Power Macintosh" +# detection). +# +ifeq "$(strip ${DESTDIR})" "" + BUILD_DIR := $(realpath ..)/build/obj + TARGET_DIR := $(realpath ..)/build +else + BUILD_DIR := $(DESTDIR)/build/obj + TARGET_DIR := $(DESTDIR)/build +endif + +OSTYPE := $(shell echo `uname`) +OSVERSION := $(shell echo `uname -r`)) +MACHINETYPE := $(subst x86_64,amd64,$(shell echo `uname -m`)) + +# +# Define the source file extensions that we know how to handle. +# +C_SRC_EXTS := %.c +CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++ +JAVA_EXTS := %.jar %.tar +ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS} ${JAVA_EXTS} + +# +# Initialize internal variables. +# +ALL_TGTS := +DIR_STACK := +TGT_STACK := + +######################################## +# +# The single entry point to create all the targets and rules and everything. +# +# $(eval $(call BOILERMAKE)) +# +######################################## + +define BOILERMAKE + + # Add a new target rule for each user-defined target. + $(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_TARGET_RULE,${TGT}))) + + # Add pattern rule(s) for creating compiled object code from C source. + $(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${C_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_C_CMDS})))) + + # Add pattern rule(s) for creating compiled object code from C++ source. + $(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${CXX_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_CXX_CMDS})))) + + # Add "clean" rules to remove all build-generated files. + $(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_CLEAN_RULE,${TGT}))) + + # Include generated rules that define additional (header) dependencies + # (but don't complain if that file doesn't exist). + $(foreach TGT,${ALL_TGTS},\ + $(eval -include ${${TGT}_DEPS})) + + # Define more targets to copy files to the target directory. + $(call ADD_FILE_COPY_RULES,${EXECUTABLES},executable) + $(call ADD_FILE_COPY_RULES,${FILES},) +endef + + +############################################################ +# +# boilermake internal functions below. +# +############################################################ + +# +# Adds a new rule and phony target for cleaning the specified target +# (removing its build-generated files). Use with EVAL. +# +define ADD_CLEAN_RULE + doclean: doclean-${1} + .PHONY: doclean-${1} + doclean-${1}: + $$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]}) + $${${1}_POSTCLEAN} +endef + +# ADD_FILE_COPY_RULES adds rules to copy source files directly to the +# TARGET_DIR and optionally make them executable. A rule to remove the +# copied file (on 'make clean') is also added. It expects a list of files +# to copy and their destination: +# +# EXECUTABLES += scripts/a -> bin/b # These go in main.mk +# +# FILES += scripts/module/c -> lib/site_perl/module/d \ +# data/e -> share/data/f +# +# $(call ADD_FILE_COPY_RULES,${EXECS},) # These go in Makefile! +# $(call ADD_FILE_COPY_RULES,${FILES},) +# +# Source locations are relative to the submakefile location, and destination +# locations are relative to TARGET_DIR (e.g., 'build/'. Destination +# directories are created if needed. +# +# If the second parameter is the "executable", then the copied file is made +# executable. +# +# ADD_FILE_COPY_RULE does the work of adding the rules, copying the first +# parameter to the second parameter and setting +x if the third parameter is +# "executable". +# +# MAKE_FILE_COPY_LIST strips whitespace from around the 'file copy' operator +# '->' in the user-supplied file-copy-list. It works by first squashing +# adjacent white space to a single space, then replacing adjacent whitespace +# with nothing. +# +# (The $\ at the end of some of these lines serve to eat up whitespace +# before the continued line.) +# +define MAKE_FILE_COPY_LIST + $(subst $ ->$ ,->,$\ + $(subst $ -> $ ,->,$\ + $(strip ${1}))) +endef + +define ADD_FILE_COPY_RULE + doall: $${TARGET_DIR}/$2 + ifeq ($3,executable) + $${TARGET_DIR}/$2: $1 + @mkdir -p $$(dir $${TARGET_DIR}/$2) + cp -pf $1 $${TARGET_DIR}/$2 + chmod +x $${TARGET_DIR}/$2 + else + $${TARGET_DIR}/$2: $1 + @mkdir -p $$(dir $${TARGET_DIR}/$2) + cp -pf $1 $${TARGET_DIR}/$2 + endif + doclean: doclean-$1 + .PHONY: doclean-$1 + doclean-$1: + rm -f $${TARGET_DIR}/$2 +endef + +define ADD_FILE_COPY_RULES + $(foreach R,$(call MAKE_FILE_COPY_LIST,$1),\ + $(eval $(call ADD_FILE_COPY_RULE,$(firstword $(subst ->, ,${R})),$\ + $(lastword $(subst ->, ,${R})),$2))) +endef + +# Adds a pattern rule for building object files from source files with the +# filename extension specified in the second argument. The first argument +# must be the name of the base directory where the object files should +# reside (such that the portion of the path after the base directory will +# match the path to corresponding source files). The third argument must +# contain the rules used to compile the source files into object code form. +# Use with EVAL. +# +define ADD_OBJECT_RULE + ${1}/%.o: ${2} ${VERSION_H} + ${3} +endef + +# Adds a new target to the Makefile. Targets are executable files unless +# they end with '.a'. Use with EVAL. +# +define ADD_TARGET_RULE + ifeq "$$(suffix ${1})" ".a" + # Add a target for creating a static library. + $${TARGET_DIR}/${1}: $${${1}_OBJS} + @mkdir -p $$(dir $$@) + $$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS}) + $${${1}_POSTMAKE} + else + # Add a target for linking an executable. First, attempt to select the + # appropriate front-end to use for linking. This might not choose the + # right one (e.g. if linking with a C++ static library, but all other + # sources are C sources), so the user makefile is allowed to specify a + # linker to be used for each target. + ifeq "$$(strip $${${1}_LINKER})" "" + # No linker was explicitly specified to be used for this target. If + # there are any C++ sources for this target, use the C++ compiler. + # For all other targets, default to using the C compiler. + ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" "" + ${1}_LINKER = $${CXX} + else + ${1}_LINKER = $${CC} + endif + endif + + $${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS} + @mkdir -p $$(dir $$@) + $$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} $${${1}_OBJS} $${${1}_LDLIBS} $${LDLIBS}) + $${${1}_POSTMAKE} + endif +endef + +# COMPILE_C_CMDS - Commands for compiling C source code. +define COMPILE_C_CMDS + @mkdir -p $(dir $@) + $(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${SRC_INCDIRS} ${SYS_INCDIRS} ${SRC_DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# COMPILE_CXX_CMDS - Commands for compiling C++ source code. +define COMPILE_CXX_CMDS + @mkdir -p $(dir $@) + $(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${SRC_INCDIRS} ${SYS_INCDIRS} ${SRC_DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new +# "submakefile" fragment into the overall Makefile. It also recursively +# includes all submakefiles of the specified submakefile fragment. +# +# USE WITH EVAL +# +define INCLUDE_SUBMAKEFILE + # Initialize all variables that can be defined by a makefile fragment, then + # include the specified makefile fragment. + TARGET := + TGT_LDFLAGS := + TGT_LDLIBS := + TGT_LINKER := + TGT_PREREQS := + + SOURCES := + SRC_CFLAGS := + SRC_CXXFLAGS := + SRC_DEFS := + SRC_INCDIRS := + + SYS_INCDIRS := + + SUBMAKEFILES := + + # A directory stack is maintained so that the correct paths are used as we + # recursively include all submakefiles. Get the makefile's directory and + # push it onto the stack. + DIR := $(call CANONICAL_PATH,$(dir ${1})) + DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR}) + + include ${1} + + # Initialize internal local variables. + OBJS := + + # Determine which target this makefile's variables apply to. A stack is + # used to keep track of which target is the "current" target as we + # recursively include other submakefiles. + ifneq "$$(strip $${TARGET})" "" + # This makefile defined a new target. Target variables defined by this + # makefile apply to this new target. Initialize the target's variables. + + ifeq "$$(suffix $${TARGET})" ".a" + TGT := $$(addprefix lib/, $$(strip $${TARGET})) + else + TGT := $$(addprefix bin/, $$(strip $${TARGET})) + endif + ALL_TGTS += $${TGT} + $${TGT}_DEPS := + $${TGT}_LDFLAGS := $${TGT_LDFLAGS} + $${TGT}_LDLIBS := $${TGT_LDLIBS} + $${TGT}_LINKER := $${TGT_LINKER} + $${TGT}_OBJS := + $${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/lib/,$${TGT_PREREQS}) + else + # The values defined by this makefile apply to the the "current" target + # as determined by which target is at the top of the stack. + TGT := $$(strip $$(call PEEK,$${TGT_STACK})) + $${TGT}_LDFLAGS += $${TGT_LDFLAGS} + $${TGT}_LDLIBS += $${TGT_LDLIBS} + $${TGT}_PREREQS += $${TGT_PREREQS} + endif + + # Push the current target onto the target stack. + TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT}) + + ifneq "$$(strip $${SOURCES})" "" + # This makefile builds one or more objects from source. Validate the + # specified sources against the supported source file types. + BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES})) + ifneq "$${BAD_SRCS}" "" + $$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}]) + endif + + # Qualify and canonicalize paths. + SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES}) + SOURCES := $$(call CANONICAL_PATH,$${SOURCES}) + SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS}) + SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS}) + SYS_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SYS_INCDIRS}) + SYS_INCDIRS := $$(call CANONICAL_PATH,$${SYS_INCDIRS}) + + # Save the list of source files for this target. + $${TGT}_SOURCES += $${SOURCES} + + # Convert the source file names to their corresponding object file + # names. + OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\ + $$(addsuffix .o,$$(basename $${SOURCES}))) + + # Add the objects to the current target's list of objects, and create + # target-specific variables for the objects based on any source + # variables that were defined. + $${TGT}_OBJS += $${OBJS} + $${TGT}_DEPS += $${OBJS:%.o=%.P} + $${OBJS}: SRC_CFLAGS := $${SRC_CFLAGS} + $${OBJS}: SRC_CXXFLAGS := $${SRC_CXXFLAGS} + $${OBJS}: SRC_DEFS := $$(addprefix -D,$${SRC_DEFS}) + $${OBJS}: SRC_INCDIRS := $$(addprefix -iquote,$${SRC_INCDIRS}) + $${OBJS}: SYS_INCDIRS := $$(addprefix -isystem,$${SYS_INCDIRS}) + endif + + ifneq "$$(strip $${SUBMAKEFILES})" "" + # This makefile has submakefiles. Recursively include them. + $$(foreach MK,$${SUBMAKEFILES},\ + $$(eval $$(call INCLUDE_SUBMAKEFILE,\ + $$(call CANONICAL_PATH,\ + $$(call QUALIFY_PATH,$${DIR},$${MK}))))) + endif + + # Reset the "current" target to it's previous value. + TGT_STACK := $$(call POP,$${TGT_STACK}) + TGT := $$(call PEEK,$${TGT_STACK}) + + # Reset the "current" directory to it's previous value. + DIR_STACK := $$(call POP,$${DIR_STACK}) + DIR := $$(call PEEK,$${DIR_STACK}) +endef + + +# MIN - Parameterized "function" that results in the minimum lexical value of +# the two values given. +#define MIN +#$(firstword $(sort ${1} ${2})) +#endef + +# PEEK - Parameterized "function" that results in the value at the top of the +# specified colon-delimited stack. +define PEEK +$(lastword $(subst :, ,${1})) +endef + +# POP - Parameterized "function" that pops the top value off of the specified +# colon-delimited stack, and results in the new value of the stack. Note that +# the popped value cannot be obtained using this function; use peek for that. +define POP +${1:%:$(lastword $(subst :, ,${1}))=%} +endef + +# PUSH - Parameterized "function" that pushes a value onto the specified colon- +# delimited stack, and results in the new value of the stack. +define PUSH +${2:%=${1}:%} +endef + +# CANONICAL_PATH - Given one or more paths, converts the paths to the canonical +# form. The canonical form is the path, relative to the project's top-level +# directory (the directory from which "make" is run), and without +# any "./" or "../" sequences. For paths that are not located below the +# top-level directory, the canonical form is the absolute path (i.e. from +# the root of the filesystem) also without "./" or "../" sequences. +define CANONICAL_PATH +$(patsubst ${CURDIR}/%,%,$(abspath ${1})) +endef + +# QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the +# paths using the "root" directory (i.e. appends the root directory name to +# the paths) except for paths that are absolute. +define QUALIFY_PATH +$(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2}) +endef