diff --git a/AUTHORS b/AUTHORS index 5cbb27b..5a2ec6b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,8 @@ This software was brought to you by: +- Ben Porter - Christophe de Dinechin +- Christophe de Dinechin - Christophe de Dinechin Thank you! diff --git a/Makefile b/Makefile index 44c48e7..7ed3e80 100644 --- a/Makefile +++ b/Makefile @@ -36,21 +36,19 @@ # Package description PACKAGE_NAME=make-it-quick -PACKAGE_VERSION=0.2.7 +PACKAGE_VERSION=0.3.0 PACKAGE_DESCRIPTION=A simple auto-configuring build system for C and C++ programs PACKAGE_URL=http://github.com/c3d/make-it-quick # Things to install -HDR_INSTALL= \ +HEADERS= \ rules.mk \ config.mk \ $(wildcard config.*.mk) \ $(MIQ_OBJDIR)config.system-setup.mk -PREFIX.config=$(PREFIX.share)$(PACKAGE_DIR)config/ -PACKAGE_INSTALL.lib=$(DESTDIR)$(PREFIX.config) -LIB_INSTALL=$(wildcard config/check*.c) -DOC_INSTALL= README.md AUTHORS NEWS +WARE.config=$(wildcard config/check*.c) +WARE.doc= README.md AUTHORS NEWS TESTS=example/ # Make sure we generate the config.system @@ -61,22 +59,13 @@ MIQ=./ include $(MIQ)rules.mk # Install the check*.c files as data -INSTALL.lib=$(INSTALL.data) +INSTALL.config=$(INSTALL.data) # Generation of the system setup file -SYSTEM_SETUP= \ -$(SYSCONFIG:%=SYSCONFIG?="$(SYSCONFIG)") \ -$(PREFIX:%=PREFIX?="$(PREFIX)") \ -$(PREFIX.bin:%=PREFIX.bin?="$(PREFIX.bin)") \ -$(PREFIX.sbin:%=PREFIX.sbin?="$(PREFIX.sbin)") \ -$(PREFIX.hdr:%=PREFIX.hdr?="$(PREFIX.hdr)") \ -$(PREFIX.share:%=PREFIX.share?="$(PREFIX.share)") \ -$(PREFIX.lib:%=PREFIX.lib?="$(PREFIX.lib)") \ -$(PREFIX.dll:%=PREFIX.dll?="$(PREFIX.dll)") \ -$(PREFIX.libexec:%=PREFIX.libexec?="$(PREFIX.libexec)") \ -$(PREFIX.man:%=PREFIX.man?="$(PREFIX.man)") \ -$(PREFIX.doc:%=PREFIX.doc?="$(PREFIX.doc)") \ -$(PREFIX.var:%=PREFIX.var?="$(PREFIX.var)") \ +SYSTEM_SETUP= \ +$(SYSCONFIG:%=SYSCONFIG?="$(SYSCONFIG)") \ +$(PREFIX:%=PREFIX?="$(PREFIX)") \ +$(foreach i,$(INSTALLABLE),$(PREFIX.$i:%=PREFIX.$i?=$(PREFIX.$i))) \ CONFIG_SOURCES="$(PREFIX.config)" $(MIQ_OBJDIR)config.system-setup.mk: diff --git a/config.cygwin.mk b/config.cygwin.mk index 6581e73..2eb08f6 100644 --- a/config.cygwin.mk +++ b/config.cygwin.mk @@ -47,7 +47,7 @@ EXT.obj= .obj # Because of the above, we need to put the number before the extesion # e.g. where Linux would have libfoo.so.1.3.2, cygwin has libfoo.1.3.2.dll -MIQ_DLLBASE= $(@:%.install_dll=%) +MIQ_DLLBASE= $(@:%.install.dll=%) MIQ_DLLNAME= $(MIQ_DLLBASE:%$(EXT.dll)=%$(PRODUCTS_VERSION:%=.$(MIQ_V_VERSION))$(EXT.dll)) MIQ_SONAME= $(MIQ_SOBASE:%$(EXT.dll)=%)$(MIQ_V_MAJOR:%=.%)$(EXT.dll) MIQ_SONAME_OPT= $(PRODUCTS_VERSION:%=-Wl,-soname -Wl,$(MIQ_SONAME)) diff --git a/config.gnu.mk b/config.gnu.mk index 84a4f6d..9348d16 100644 --- a/config.gnu.mk +++ b/config.gnu.mk @@ -73,12 +73,13 @@ GEN_AUTHORS= (echo "This software was brought to you by:"; \ sed -e 's/^/- /g'; \ echo ""; \ echo "Thank you!") -GEN_NEWS= grep '^$(shell git tag -n1 `git describe`)' $@ || \ - (touch $@; \ +GEN_NEWS_TAG= $(shell git tag -n1 `git describe`) +GEN_NEWS= $(GEN_NEWS_TAG:%=grep '^$(GEN_NEWS_TAG' $@ || \ + (touch $@; \ (git tag -l $(shell git describe) -n999 ; \ echo ""; \ cat $@) \ - > $@.latest && mv $@.latest $@) + > $@.latest && mv $@.latest $@)) #------------------------------------------------------------------------------ diff --git a/config.mk b/config.mk index 3230733..ceb9351 100644 --- a/config.mk +++ b/config.mk @@ -64,8 +64,36 @@ LAST_LOG?=$(LOGS)make.log # Stuff to clean TO_CLEAN= *~ *.bak -# Stuff to install -TO_INSTALL= +# Kinds of installable stuff +INSTALLABLE= exe \ + lib \ + dll \ + header \ + share \ + license \ + man \ + doc \ + var \ + etc \ + config \ + sysconfig \ + pkgconfig + +# Stuff to install, with one of the suffixes above +WARE.exe?= $(MIQ_OUTEXE) +WARE.lib?= $(MIQ_OUTLIB) +WARE.dll?= $(MIQ_OUTDLL) +WARE.man?= $(MANPAGES) +WARE.header?= $(HEADERS) +WARE.doc?= $(wildcard README*) +WARE.license?= $(wildcard COPYING* LICENSE*) +WARE.pkgconfig?=$(PACKAGE_NAME:%=%.pc) + +# Where we pick up the stuff to install (default is source) +WARE_DIR.pkgconfig?=$(MIQ_OBJDIR) + +# Where to put system configuration files +SYSCONFIG?=$(PREFIX.etc) # Buildenv for recursive builds RECURSE_BUILDENV=$(BUILDENV) @@ -98,7 +126,7 @@ PACKAGE_DLLS=$(MIQ_PRODDLL) CONFIG_SOURCES?=$(MIQ)config/ # Sources to reformat -CLANG_FORMAT_SOURCES=$(SOURCES) $(HDR_INSTALL) +CLANG_FORMAT_SOURCES=$(SOURCES) $(WARE.header) #------------------------------------------------------------------------------ @@ -106,32 +134,34 @@ CLANG_FORMAT_SOURCES=$(SOURCES) $(HDR_INSTALL) #------------------------------------------------------------------------------ # Variables typically provided by configure scripts -SYSCONFIG?=/etc/ PREFIX?=/usr/local/ PREFIX.bin?=$(PREFIX)bin/ PREFIX.sbin?=$(PREFIX)sbin/ -PREFIX.lib?=$(PREFIX)lib/ PREFIX.libexec?=$(PREFIX)libexec/ +PREFIX.exe?=$(PREFIX.bin) +PREFIX.lib?=$(PREFIX)lib/ PREFIX.dll?=$(PREFIX.lib) -PREFIX.h?=$(PREFIX)include/ +PREFIX.header?=$(PREFIX)include/ PREFIX.share?=$(PREFIX)share/ PREFIX.man?=$(PREFIX.share)man/ PREFIX.doc?=$(PREFIX.share)doc/ +PREFIX.license?=$(PREFIX.doc) +PREFIX.config?=$(PREFIX.share)config/ PREFIX.var?=$(PREFIX)var/ +PREFIX.etc?=/etc/ +PREFIX.sysconfig=$(SYSCONFIG) +PREFIX.pkgconfig=$(PREFIX.share)pkgconfig/ + # Package configuration directories by default # The defaut is to install binaries and shared libraries in the prefix # but to install headers and data items under a directory named after project -PACKAGE_INSTALL?=$(DESTDIR)$(PREFIX) -PACKAGE_INSTALL.bin?=$(DESTDIR)$(PREFIX.bin) -PACKAGE_INSTALL.lib?=$(DESTDIR)$(PREFIX.lib) -PACKAGE_INSTALL.dll?=$(DESTDIR)$(PREFIX.dll) -PACKAGE_INSTALL.h?=$(DESTDIR)$(PREFIX.h)$(PACKAGE_DIR) -PACKAGE_INSTALL.share?=$(DESTDIR)$(PREFIX.share)$(PACKAGE_DIR) -PACKAGE_INSTALL.man?=$(DESTDIR)$(PREFIX.man) -PACKAGE_INSTALL.doc?=$(DESTDIR)$(PREFIX.doc)$(PACKAGE_DIR) -PACKAGE_INSTALL.pkgconfig?=$(DESTDIR)$(PREFIX.share)pkgconfig/ -PACKAGE_INSTALL.sysconfig?=$(DESTDIR)$(SYSCONFIG)$(PACKAGE_DIR) +define package-install + +PACKAGE_INSTALL.$1?=$$(DESTDIR)$$(PREFIX.$1) + +endef +$(eval $(foreach i,$(INSTALLABLE),$(call package-install,$i))) #------------------------------------------------------------------------------ diff --git a/rules.mk b/rules.mk index 550634c..6469ee0 100644 --- a/rules.mk +++ b/rules.mk @@ -88,21 +88,8 @@ MIQ_LDFLAGS= $(LDFLAGS) \ MIQ_PACKAGE= $(PACKAGE_NAME:%=$(MIQ_OBJDIR)%.pc) -MIQ_INSTALL= $(TO_INSTALL:%=%.$(DO_INSTALL)) \ - $(MIQ_OUTEXE:%=%.$(DO_INSTALL)_exe) \ - $(MIQ_OUTLIB:%=%.$(DO_INSTALL)_lib) \ - $(MIQ_OUTDLL:%=%.$(DO_INSTALL)_dll) \ - $(EXE_INSTALL:%=%.$(DO_INSTALL)_exe) \ - $(LIB_INSTALL:%=%.$(DO_INSTALL)_lib) \ - $(DLL_INSTALL:%=%.$(DO_INSTALL)_dll) \ - $(HEADERS:%=%.$(DO_INSTALL)_hdr) \ - $(HDR_INSTALL:%=%.$(DO_INSTALL)_hdr) \ - $(SHR_INSTALL:%=%.$(DO_INSTALL)_shr) \ - $(DOC_INSTALL:%=%.$(DO_INSTALL)_doc) \ - $(MANPAGES:%=%.gz.$(DO_INSTALL)_man) \ - $(MAN_INSTALL:%=%.gz.$(DO_INSTALL)_man) \ - $(ETC_INSTALL:%=%.$(DO_INSTALL)_etc) \ - $(MIQ_PACKAGE:%=%.$(DO_INSTALL)_pc) +MIQ_DOINSTALL= $(foreach i,$(INSTALLABLE),$(WARE.$i:%=%.$(DO_INSTALL).$i)) +MIQ_INSTALL= $(DO_INSTALL:%=$(MIQ_DOINSTALL)) MIQ_SOURCES= $(SOURCES) \ $(SOURCES_BUILDENV_$(BUILDENV)) \ @@ -212,6 +199,7 @@ rebuild: re-$(TARGET) # Installation install: install-$(TARGET) uninstall: uninstall-$(TARGET) +reinstall: reinstall-$(TARGET) clean: $(SUBDIRS:%=%.clean) $(VARIANTS:%=%.variant-clean) -$(PRINT_CLEAN) rm -f $(TO_CLEAN) $(MIQ_OBJECTS) $(DEPENDENCIES) $(MIQ_OUTPRODS) $(MIQ_TOLINK) config.h @@ -280,7 +268,7 @@ endif .objects: $(MIQ_OBJDIR:%=%.mkdir) .product: $(MIQ_OUTPRODS) .postbuild: .product .install -.install: $(DO_INSTALL:%=$(MIQ_INSTALL)) +.install: $(MIQ_INSTALL) .tests: $(TESTS:%=%.test) .goodbye: .postbuild @@ -328,6 +316,8 @@ install-%: $(PRINT_COMMAND) $(MAKE) $* DO_INSTALL=install uninstall-%: $(PRINT_COMMAND) $(MAKE) TARGET=$* DO_INSTALL=uninstall .install +reinstall-%: + $(PRINT_COMMAND) $(MAKE) TARGET=$* DO_INSTALL=reinstall .install # Deep build (re-check all libraries instead of just resulting .a) deep-%: @@ -392,7 +382,7 @@ PRINT_COMPILE= $(PRINT_COMMAND) $(INFO) "[COMPILE$(MIQ_PRINTCOUNT)] " $<; PRINT_LINK= $(PRINT_COMMAND) $(INFO) "[LINK]" $(shell basename $@); PRINT_GENERATE= $(PRINT_COMMAND) $(INFO) "[GENERATE]" "$(shell basename "$@")" $(COLORIZE); PRINT_VARIANT= $(PRINT_COMMAND) $(INFO) "[VARIANT]" "$*"; -PRINT_INSTALL= $(PRINT_COMMAND) $(INFO) "[INSTALL]" "$(*F) in $( $(@D)/" $(COLORIZE); PRINT_UNINSTALL=$(PRINT_COMMAND) $(INFO) "[UNINSTALL] " "$(*F)" $(COLORIZE); PRINT_CLEAN= $(PRINT_COMMAND) $(INFO) "[CLEAN] " "$@ $(MIQ_PRETTYDIR)" $(COLORIZE); PRINT_COPY= $(PRINT_COMMAND) $(INFO) "[COPY]" "$< '=>' $@" ; @@ -637,50 +627,28 @@ benchmark: $(BENCHMARKS:%=%.benchmark) # Install targets #------------------------------------------------------------------------------ -# Installing the product: always need to build it first -%.install: $(PACKAGE_INSTALL).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.data) $* $(PACKAGE_INSTALL) -%.install_exe: $(PACKAGE_INSTALL.bin).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.bin) $* $(PACKAGE_INSTALL.bin) -%.install_lib: $(PACKAGE_INSTALL.lib).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.lib) $* $(PACKAGE_INSTALL.lib) -%.install_dll: $(PACKAGE_INSTALL.dll).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.dll) -%.install_hdr: $(PACKAGE_INSTALL.h).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.h) $* $(PACKAGE_INSTALL.h) -%.install_shr: $(PACKAGE_INSTALL.share).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.share) $* $(PACKAGE_INSTALL.share) -%.install_man: $(PACKAGE_INSTALL.man).mkdir-only % - $(PRINT_COMMAND) $(MKDIR) -p $(MIQ_MANDIR) - $(PRINT_INSTALL) $(INSTALL.man) $* $(MIQ_MANDIR) -%.install_doc: $(PACKAGE_INSTALL.doc).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.doc) $* $(PACKAGE_INSTALL.doc) -%.install_etc: $(PACKAGE_INSTALL.sysconfig).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.etc) $* $(PACKAGE_INSTALL.sysconfig) -%.install_pc: $(PACKAGE_INSTALL.pkgconfig).mkdir-only % - $(PRINT_INSTALL) $(INSTALL.data) $* $(PACKAGE_INSTALL.pkgconfig) +# Helper macro: +# $1: install pattern +# $2: what to install +define install-rules -# Uninstalling the product -%.uninstall: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL) $(UNINSTALL.ok) -%.uninstall_exe: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.bin)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.bin) $(UNINSTALL.ok) -%.uninstall_lib: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.lib)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.lib) $(UNINSTALL.ok) -%.uninstall_dll: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.dll)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.dll) $(UNINSTALL.ok) -%.uninstall_hdr: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.h)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.h) $(UNINSTALL.ok) -%.uninstall_shr: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.share)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.share) $(UNINSTALL.ok) -%.uninstall_doc: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.doc)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.doc) $(UNINSTALL.ok) -%.uninstall_man: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.man)%) -%.uninstall_etc: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.sysconfig)%) -%.uninstall_pc: - $(PRINT_UNINSTALL) $(UNINSTALL) $(*F:%=$(PACKAGE_INSTALL.pkgconfig)%) ; $(UNINSTALL.dir) $(PACKAGE_INSTALL.pkgconfig) $(UNINSTALL.ok) +$2.install.$1: $$(PACKAGE_INSTALL.$1)$(notdir $2) +$$(PACKAGE_INSTALL.$1)$(notdir $2): $$(WARE_DIR.$1)$2 | .install-directories + $$(PRINT_INSTALL) $$(firstword $$(INSTALL.$1) $$(INSTALL)) $$(WARE_DIR.$1)$2 $$(PACKAGE_INSTALL.$1) + +$2.uninstall.$1: + $$(PRINT_UNINSTALL) $$(firstword $$(UNINSTALL.$1) $$(UNINSTALL)) $$(PACKAGE_INSTALL.$1)$2; $$(UNINSTALL.dir) $$(PACKAGE_INSTALL.$1) $$(UNINSTALL.ok) + +$2.reinstall: $2 $$(PACKAGE_INSTALL.$1).mkdir-only + $$(PRINT_INSTALL) $$(firstword $$(INSTALL.$1) $$(INSTALL)) $2 $$(PACKAGE_INSTALL.$1) + +.install-directories: $$(PACKAGE_INSTALL.$1).mkdir-only + +endef + +# Generate rules for all the installable stuff +$(eval $(foreach i,$(INSTALLABLE),$(foreach w,$(WARE.$i),$(call install-rules,$i,$w)))) +.install: .install-directories #------------------------------------------------------------------------------ @@ -698,7 +666,7 @@ MIQ_GENPC= \ (echo 'prefix=$(PREFIX.bin)' ;\ echo 'exec_prefix=$${prefix}' ;\ echo 'libdir=$(PREFIX.lib)' ;\ - echo 'includedir=$(PREFIX.h)' ;\ + echo 'includedir=$(PREFIX.header)' ;\ echo 'Name: $(PACKAGE_NAME)' ;\ echo 'Description: $(PACKAGE_DESCRIPTION)' ;\ echo 'Version: $(PACKAGE_VERSION)' ;\