# generic utility modules # (c) 2001 jannet it services # contact@jannet.de # $Id$ ifndef JW_BUILD_RULES_MK_INCLUDED JW_BUILD_RULES_MK_INCLUDED = true # -- standard targets all: install: all clean: tmpclean distclean: clean .PHONY: all install clean distclean \ %.this \ allclean \ checkroot \ collect \ coreclean \ depclean \ doneclean \ execlean \ find \ installexe \ installsh \ installso \ ldd \ lddtree \ libclean \ localclean \ love \ mocclean \ objclean \ pckgclean \ prereqclean \ profclean \ push \ rccclean \ remake \ runclean \ textclean \ tmpclean \ uicclean \ varclean \ vcdistclean \ # -- phony targets checkroot: @if [ "$(CHECK_ROOT)" = true -o "$(CHECK_ROOT)" = TRUE ] ; then \ echo "Error: You can only do this if either" ;\ echo " a) you are user \"root\"" ;\ echo " b) the Makefile variable CHECK_ROOT does not contain \"true\" as value." ;\ fi installexe: all checkroot $(INSTALLED_EXE) installso: all checkroot install_dir_LIB $(INSTALLED_SHOBJS) installsh: all checkroot $(INSTALL_EXEDIR) $(INSTALLED_EXE_SH) pckgclean: $(RM) -rf *.zip *.tar.gz *.rpm *.deb tmpclean: $(RM) -rf *.tmp *.rep coreclean: $(RM) -rf core core.* vgcore vgcore.* runclean: coreclean objclean: $(RM) -rf *.o *.o *.a *.so *.so.* mocclean: $(RM) -rf moc_* uicclean: $(RM) -rf $(UIC_CPP) $(UIC_H) rccclean: $(RM) -rf $(RCC_CPP) textclean: doneclean $(RM) -rf *~ .*~ .*.swp *.rep \#*\# .kdbgrc.* .\#* .exrc allclean: $(RM) -rf $(ALL) $(LOCAL_TARGETS) doneclean: $(RM) -rf *.done $(PREREQ_DONE) execlean: allclean objclean runclean textclean $(RM) -rf $(EXE) $(PLUGIN) distclean: clean objclean textclean vcdistclean profclean varclean localclean: $(LOCAL_CLEAN) $(RM) -rf $(CLEAN) libclean: $(RM) -rf $(LIB_A) $(LIB_SO) $(VERSION_SCRIPT) vcdistclean: $(RM) -rf *.plg *.opt *.ncb Debug *.exe dist *.ilk prereqclean: set -e; for dir in $(PREREQ_DIR); do make -$(MAKEFLAGS) -C $$dir clean; done profclean: $(RM) -f *.da *.bb *.bbg *.gcov *.gcda *.gcno varclean: $(RM) -rf $(CLEAN) $(DISTCLEAN) $(AC_FILES) love: @echo "Not war?" cvsupdate update: if [ -d "CVS" ]; then cvs update -dP || exit 1; else git pull && git submodule update --init --recursive || exit 1; fi cvsdiff diff: if [ -d "CVS" ]; then cvs diff -u || exit 1; else git --no-pager diff --relative --no-prefix . || exit 1; fi push: if [ ! -d "CVS" ]; then git push || exit 1; fi prepend_header: set -e; for f in $(SRC_UNHEADERED); do sh $(TOPDIR)/hdr/prepend_header.sh $$f; done remake: set -e; make $(addprefix -W ,$(SRC_FILES)) $(filter-out remake,$(MAKECMDGOALS)) echo-all: @echo "ALL = $(ALL)" echo-target: @echo "TARGET_TUPLE = $(TARGET_TUPLE)" @echo "TARGET_TUPLE_WORDS = $(TARGET_TUPLE_WORDS)" @echo "TARGET_TRIPLET = $(TARGET_TRIPLET)" @echo "TARGET_TRIPLET_WORDS = $(TARGET_TRIPLET_WORDS)" @echo "TARGET_ARCH = $(TARGET_ARCH)" @echo "TARGET_VENDOR = $(TARGET_VENDOR)" @echo "TARGET_OS = $(TARGET_OS)" @echo "TARGET_ABI = $(TARGET_ABI)" @echo "TARGET = $(TARGET)" echo-compilers: @echo "GCC = $(GCC)" @echo "GCC_VERSION = $(GCC_VERSION)" @echo "GCC_VERSION_NUMBERS = $(GCC_VERSION_NUMBERS)" @echo "GCC_MAJOR = $(GCC_MAJOR)" @echo "GCC_MINOR = $(GCC_MINOR)" @echo "GCC_REV = $(GCC_REV)" @echo @echo "GNU_LD = $(GNU_LD)" @echo "GNU_LD_VERSION = $(GNU_LD_VERSION)" @echo "GNU_LD_VERSION_NUMBERS = $(GNU_LD_VERSION_NUMBERS)" @echo "GNU_LD_MAJOR = $(GNU_LD_MAJOR)" @echo "GNU_LD_MINOR = $(GNU_LD_MINOR)" @echo "GNU_LD_REV = $(GNU_LD_REV)" echo-ldflags: @echo "BUILD_LDFLAGS = $(BUILD_LDFLAGS)" @echo "LOCAL_LDFLAGS = $(LOCAL_LDFLAGS)" @echo "PROJECTLIB_LDFLAGS = $(PROJECTLIB_LDFLAGS)" @echo "PROJECT_LDFLAGS = $(PROJECT_LDFLAGS)" @echo "BUILD_LPPFLAGS = $(BUILD_LPPFLAGS)" @echo "BUILD_LIBFLAGS = $(BUILD_LIBFLAGS)" @echo "QT_LDFLAGS = $(QT_LDFLAGS)" @echo "REAL_LDFLAGS = $(REAL_LDFLAGS)" echo-cflags: @echo "LOCAL_CFLAGS = $(LOCAL_CFLAGS)" @echo "PROJECT_CFLAGS = $(PROJECT_CFLAGS)" @echo "BUILD_CFLAGS = $(BUILD_CFLAGS)" @echo "LOCAL_CXXFLAGS = $(LOCAL_CXXFLAGS)" @echo "PROJECT_CXXFLAGS = $(PROJECT_CXXFLAGS)" @echo "BUILD_CXXFLAGS = $(BUILD_CXXFLAGS)" @echo "LOCAL_CPPFLAGS = $(LOCAL_CPPFLAGS)" @echo "PROJECT_CPPFLAGS = $(PROJECT_CPPFLAGS)" @echo "BUILD_CPPFLAGS = $(BUILD_CPPFLAGS)" @echo "REAL_CFLAGS = $(REAL_CFLAGS)" @echo "REAL_CXXFLAGS = $(REAL_CXXFLAGS)" echo-development: echo "DEVELOPMENT = $(DEVELOPMENT)" echo-libpath: @echo LD_LIBRARY_PATH = :$(LD_LIBRARY_PATH) | $(beautify_lib_path) echo-lddtree: bash $(MOD_SCRIPT_DIR)/linktree.sh $(REAL_LDFLAGS) echo-path: @echo PATH = :$(PATH) | $(beautify_lib_path) echo-modules: @echo "USERVER = $(USERVER_DIR)" @echo "XCHANGE = $(XCHANGE_DIR)" @echo "FEEDFS = $(FEEDFS_DIR)" @echo "FEEDFS_UTILS = $(FEEDFS_UTILS_DIR)" @echo "FEEDFS_NET = $(FEEDFS_NET_DIR)" @echo "DSPCD = $(DSPCD_DIR)" @echo "DSPROUT = $(DSPROUT_DIR)" @echo "DSPIDER_SHARED = $(DSPIDER_SHARED_DIR)" @echo "BTOOLS = $(BTOOLS_DIR)" @echo "CCONSOLE = $(CCONSOLE_DIR)" @echo "JACKJART = $(JACKJART_DIR)" @echo "JACKRTAI = $(JACKRTAI_DIR)" @echo "JACKDUMMY = $(JACKDUMMY_DIR)" @echo "ALSART = $(ALSART_DIR)" @echo "DSPFS = $(DSPFS_DIR)" @echo "JW_BUILD = $(JW_BUILD_DIR)" @echo "SCOPE_CASMIX = $(SCOPE_CASMIX_DIR)" echo-include: @echo "INCLUDE : $(BUILD_INCLUDE)" echo-mk: @echo MAKEFILE_LIST = $(MAKEFILE_LIST) echo-prereq: @echo "PREREQ_BUILD = $(sort $(PREREQ_BUILD))" @echo "PREREQ_INSTALL = $(sort $(PREREQ_INSTALL))" @echo "PREREQ_RUN = $(sort $(PREREQ_RUN))" @echo "PREREQ = $(sort $(PREREQ))" echo-contrib: echo-echo: sed '/echo-[a-z]\+:$$/ !d; s/:$$//' $(MODDIR)/make/rules.mk trace-marks: for f in $(ALL_CPP); do \ $(SED) 's/^{$$/{_/' $$f > $$f.rep ;\ cp $$f.rep $$f ;\ done remove-trace-marks: for f in $(ALL_CPP); do \ $(SED) 's/^{_$$/{/' $$f > $$f.rep ;\ cp $$f.rep $$f ;\ done core-pattern: echo core.%e.%p | sudo tee /proc/sys/kernel/core_pattern ifneq ($(TARGET),mingw) echo-ldd: ifneq ($(wildcard *.so),) @echo "======= libraries:" @for o in *.so; do echo "------- $$o"; ldd $$o; done endif ifneq ($(EXE_PATH),) @echo "======= executables:" @for o in $(EXE_PATH); do echo "------- $$o"; ldd $$o; done endif endif # -- special built-in targets .PRECIOUS: $(LOCAL_H) # -- rules all.done: $(PREREQ_DONE) $(LOCAL_TARGETS) $(ALL) touch $@ strip.done: $(EXE_ALL) $(STRIP) $^ touch $@ ifeq ($(LIBTYPE),shared) $(SO_PREFIX)%.so: %.o $(LD) -shared $(REAL_LDFLAGS) $(FLAVOUR_PREFIX)$^ -o $@ else $(SO_PREFIX)%.so: %.o $(LD) $(REAL_LDFLAGS) $(FLAVOUR_PREFIX)$^ -o $@ endif $(VERSION_SCRIPT): sh $(MOD_SCRIPT_DIR)/make-version-script.sh $(BINARY_VERSION) > $@.tmp mv $@.tmp $@ ifneq ($(TARGET),mingw) $(LIB_SO): $(VERSION_SCRIPT) $(LIB_A) $(TOPDIR)/dir_build_LIB.done $(CXX) -shared -Wl,--whole-archive,-soname=$(notdir $@) $(VERSION_SCRIPT) $(LIB_A) -Wl,--no-whole-archive \ $(filter-out -l$(LIBNAME),$(REAL_LDFLAGS)) -o $@ else $(WINRES_RC): $(WINRES_RC_TMPL) $(CAT) $< | $(SED) " \ s/__VER_FILEVERSION__/$(MAJOR_VERSION),$(MINOR_VERSION),$(RELEASE_VERSION),$(BUILD_NUMBER)/; \ s/__VER_FILEVERSION_STR__/$(MAJOR_VERSION).$(MINOR_VERSION).$(RELEASE_VERSION).$(BUILD_NUMBER)/; \ s/__VER_DESCRIPTION__/\"$(PROJECT_DESCR)\"/; \ s/__VER_COMPANY_NAME__/\"$(CUSTOMER)\"/; \ " > $@.tmp mv $@.tmp $@ $(WINRES_O): $(WINRES_RC) $(WINDRES) $^ -o $@ $(LIB_SO): $(VERSION_SCRIPT) $(WINRES_O) $(LIB_A) $(TOPDIR)/dir_build_LIB.done $(CXX) -shared -Wl,--whole-archive,--out-implib,$(shell echo $(LIB_A) | \ $(SED) 's/-static//'),--output-def,$(LIB_DEF) $(VERSION_SCRIPT) $(LIB_A) $(WINRES_O) \ -Wl,--no-whole-archive $(filter-out -l$(LIBNAME),$(REAL_LDFLAGS)) -o $@ $(MSVCPP_IMPLIB): $(LIB_SO) $(MS_LD) /machine:i386 /def:$(LIB_DEF) endif $(FLAVOUR_PREFIX)%.o: %.cpp $(CXX) $(REAL_CXXFLAGS) $(REAL_CPPFLAGS) -c $< -o $@ $(FLAVOUR_PREFIX)%.o: %.cc $(CXX) $(REAL_CXXFLAGS) $(REAL_CPPFLAGS) -c $< -o $@ $(FLAVOUR_PREFIX)%.o: %.c $(CC) $(REAL_CFLAGS) $(REAL_CPPFLAGS) -c $< -o $@ $(FLAVOUR_PREFIX)%.o: %.S $(CC) $(REAL_CFLAGS) $(REAL_CPPFLAGS) -c $< -o $@ $(FLAVOUR_PREFIX)%.o: %.sx $(CC) $(REAL_CFLAGS) $(REAL_CPPFLAGS) -c $< -o $@ $(LIB_A)(%.o): %.o $(AR) crU $(LIB_A) $< ifneq ($(USE_QT),) $(BUILD_OBJ): $(UIC_H) $(MOC_H) $(UIC_CPP) $(MOC_CPP) $(RCC_CPP) endif ifeq ($(USE_PROJECT_LIB),true) ifeq ($(LIBTYPE),shared) $(EXE) $(EXE_BIN): $(BUILD_OBJ) $(LD_SCRIPTS) $(LIB_SO) $(PLUGIN) $(PLUGIN_LIB): $(BUILD_OBJ) $(LD_SCRIPTS) $(LIB_SO) else $(EXE) $(EXE_BIN): $(BUILD_OBJ) $(LD_SCRIPTS) $(LIB_A) $(PLUGIN) $(PLUGIN_LIB): $(BUILD_OBJ) $(LD_SCRIPTS) $(LIB_A) endif else $(EXE) $(EXE_BIN): $(BUILD_OBJ) $(LD_SCRIPTS) $(PLUGIN) $(PLUGIN_LIB): $(BUILD_OBJ) $(LD_SCRIPTS) endif $(EXE) $(EXE_BIN): $(CXX) $(sort $(BUILD_OBJ)) $(REAL_LDFLAGS) -o $@ $(PLUGIN) $(PLUGIN_LIB): $(CXX) -shared $(sort $(BUILD_OBJ)) $(REAL_LDFLAGS) -o $@ # mkdir -p $(BUILD_LIBDIR) # $(BIN_INSTALL) -m 755 $@ $(BUILD_LIBDIR) define check_not_empty check_not_empty_$(1): @if [ -z "$($(1))" ]; then \ echo "$(1) is undefined" >&2 ;\ exit 1 ;\ fi endef # --- special installation rules, that the general rules farther down # below don't catch for whatever reason > $(INSTALL_INITDIR)/%: %.init | provide_dir_INIT $(INSTALL) -p -o $(INITOWNER) -g $(INITGROUP) -m $(INITMODE) $< $@ $(INSTALL_SYSTEMDDIR)/%.service: %.service | provide_dir_SYSTEMD $(INSTALL) -p -o $(SYSTEMDOWNER) -g $(SYSTEMDGROUP) -m $(SYSTEMDMODE) $< $@ $(INSTALL_LOGROTDIR)/%: %.logrotate | provide_dir_LOGROT $(INSTALL) -p -o $(LOGROTOWNER) -g $(LOGROTGROUP) -m $(LOGROTMODE) $< $@ $(INSTALL_APACHE_CONFDIR)/%.conf: %.apache-conf | provide_dir_APACHE_CONF $(INSTALL) -p -o $(APACHE_CONFOWNER) -g $(APACHE_CONFGROUP) -m $(APACHE_CONFMODE) $< $@ $(INSTALL_RSYSLOGDIR)/%.conf: %.rsyslog | provide_dir_RSYSLOG $(INSTALL) -p -o $(RSYSLOGOWNER) -g $(RSYSLOGGROUP) -m $(RSYSLOGMODE) $< $@ $(INSTALL_RSYSLOGDIR)/%.bprof: rsyslog-%.bprof | provide_dir_RSYSLOG $(INSTALL) -p -o $(RSYSLOGOWNER) -g $(RSYSLOGGROUP) -m $(RSYSLOGMODE) $< $@ $(INSTALL_SYSCFGDIR)/%: %.sysconf | provide_dir_SYSCFG $(INSTALL) -p -o $(INITOWNER) -g $(INITGROUP) -m $(INITMODE) $< $@ # --- special installation rules < # saving performance, so don't expand this always #ifeq ($(MAKE_CMDGOAL),install) define std_install_rules build_$(1): $$(TOPDIR)/dir_build_$(1).done $$(BUILD_$(1)) install_dir_$(1): | $$(INSTALL_$(1)DIR) provide_dir_$(1): | $$(TOPDIR)/dir_install_$(1).done install_$(1): install_dir_$(1) $$(INSTALLED_$(1)) install_files_$(1): provide_dir_$(1) $$(INSTALLED_$(1)) $$(TOPDIR)/dir_build_$(1).done: mkdir -p $$(BUILD_$(1)DIR) touch $$@ $$(TOPDIR)/dir_install_$(1).done: mkdir -p $$(INSTALL_$(1)DIR) touch $$@ $$(BUILD_$(1)DIR)/%: % | $$(TOPDIR)/dir_build_$(1).done @if [ ! $$< -ef $$@ -a "`echo $$< | $(SED) 's/\..*//'`" != local ]; then \ echo $(BIN_INSTALL) -D -p -m $($(1)MODE) $$< $$@ ;\ $(BIN_INSTALL) -D -p -m $($(1)MODE) $$< $$@ ;\ $(RM) -f $$(TOPDIR)/dirs-*.done ;\ fi $$(INSTALL_$(1)DIR): $$(INSTALL) -D -d -o $$($(1)DIROWNER) -g $$($(1)DIRGROUP) -m $$($(1)DIRMODE) $$(INSTALL_$(1)DIR) $$(INSTALL_$(1)DIR)/%: % | $$(INSTALL_$(1)DIR) $$(INSTALL) -D -p -o $$($(1)OWNER) -g $$($(1)GROUP) -m $$($(1)MODE) $$< $$@ endef #endef $(foreach type, $(INSTALLATION_FILE_TYPES), $(eval $(call std_install_rules,$(type)))) $(sort $(LINKS_SO)): cd $(dir $@); ln -sf $(shell echo $@ | $(SED) -e 's/\.so$$\|\.so.*$$//').$(SO_SUFFIX) $(notdir $@) ifeq ($(DEVELOPMENT),true) install_profile_path: else install_profile_path: $(INSTALLED_PROFILE_PATH_SCRIPT) endif $(INSTALLED_PROFILE_PATH_SCRIPT): $(TOPDIR)/profiledir.done echo "if [ -z \"\$$PATH\" ]; then PATH=$(shell echo $(INSTALL_EXEDIR) | $(SED) -e s%^$(ENV_PREFIX)/%/%)" > path_script.sh echo "else PATH=\$$PATH:$(shell echo $(INSTALL_EXEDIR) | $(SED) -e s%^$(ENV_PREFIX)/%/%); fi" >> path_script.sh $(INSTALL) -p -o $(PROFILEOWNER) -g $(PROFILEGROUP) -m $(PROFILEMODE) path_script.sh $@ find: @bash $(MOD_SCRIPT_DIR)/scm.sh ls-files collect: bash $(MOD_SCRIPT_DIR)/collect-installed-pkg-changes.sh -t $(TOPDIR) endif # ifndef JW_BUILD_RULES_MK_INCLUDED