X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=Makefile;h=a0c754b694dbf64e9d42fc277ec02fcacfcbd9a7;hp=0ca002bb5f83e3bf44be6818d82d517e70531833;hb=574af38ed616d1adfa5e6ce35f67cda1f707f89d;hpb=6b0a0d0efafe34d48ab344fca3b479553bd4e62c diff --git a/Makefile b/Makefile index 0ca002b..a0c754b 100644 --- a/Makefile +++ b/Makefile @@ -1,149 +1,257 @@ # # Yoink -# Use this file with make to compile and install Yoink. -# -# This makefile supports these targets: -# all, install, clean, cleandist, run, debug -# -# This build system incorporates the ideas written by Emile van Bergen: -# http://www.xs4all.nl/~evbergen/nonrecursive-make.html +# Use this file with GNU make to compile and install Yoink. # -# -# Define some options. -# +# Set V to `1' to echo each build command in full. The default behavior +# will keep output minimal. +V = 0 -# Set this to `yes' to echo each build command. -verbose := no +SHELL = /bin/sh -# -# Include the configuration file, config.mk. -# +ifeq (menuconfig,$(MAKECMDGOALS)) +menuconfig: + ./configure --interactive +.PHONY: menuconfig +else + +config.h: config.mk + $(Q)$(configure) --export-header=$@ + +config.sed: config.mk + $(Q)$(configure) --export-terms=$@ + +config.mk: + $(Q)$(configure) --interactive --print-instructions=no -have_config := $(wildcard config.mk) -ifneq ($(strip $(have_config)),) include config.mk -else -no_config: - @echo "You must run the configure script before you can make anything." - @exit 1 -endif # -# Some standard stuff. +# Define some useful functions. # -.SUFFIXES: -.SUFFIXES: .a .c .cc .cpp .o .rc +DATA_TARGETS := +EXEC_TARGETS := +SUBDIRS := -all: targets +define include_func = +ifeq (,$$d) +dir := $1 +else +dir := $$d/$1 +endif +sp := $$(sp).x +dirstack_$$(sp) := $$d +datstack_$$(sp) := $$(data) +exestack_$$(sp) := $$(exec) +d := $$(dir) +data := +exec := +include $$(dir)/rules.mk +SUBDIRS += $$d $$b +data := $$(sort $$(data) $$(appdir_$$b) $$(mandir_$$b) $$(pkgdatadir_$$b) $$(desktop_$$b)) +exec := $$(sort $$(exec) $$(bindir_$$b) $$(libdir_$$b)) +deps := $$(filter %.d,$$(exec:%.o=%.d)) +clean := $$(clean) $$(deps) $$(exec) $$(data) +DEPFILE := $$(DEPFILE) $$(deps) +DATA_TARGETS += $$(data) +EXEC_TARGETS += $$(exec) +d := $$(dirstack_$$(sp)) +data := $$(datstack_$$(sp)) +exec := $$(exestack_$$(sp)) +sp := $$(basename $$(sp)) +endef +include = $(foreach i,$1,$(eval $(call include_func,$i))) + +targets = $(EXEC_TARGETS) $(DATA_TARGETS) +builddir = build/obj +b = $(builddir)/$(d) +this = $(d)/rules.mk + +ifeq (gzip,$(manCompression)) +MANEXT=.gz +else +ifeq (bzip2,$(manCompression)) +MANEXT=.bz2 +endif +endif # # Include the subdirectories--order is not important. # -dir := src -include $(dir)/rules.mk - -dir := data -include $(dir)/rules.mk - -dir := doc -include $(dir)/rules.mk +$(call include,src data doc) +-include build/arch/$(platform)/rules.mk # # Define some common rules. # -CC_WRAPPER = ./build/compile.sh $(CC) -CXX_WRAPPER = ./build/compile.sh $(CXX) - -ifeq ($(verbose),no) -DO_CC = @echo " CC $@"; -DO_CXX = @echo " CXX $@"; -DO_LD = @echo " LD $@"; -DO_LDX = @echo " LD $@"; -DO_CCLD = @echo " CCLD $@"; -DO_CXXLD = @echo " CXXLD $@"; -DO_AR = @echo " AR $@"; -DO_RC = @echo " RC $@"; +ifeq (true,$(tracking)) +PKG_CFLAGS += -MD -MP -MF $(@:%.o=%.d) -MT $@ +-include $(DEPFILE) endif -DO_CC += $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) -o $@ -c $< -DO_CXX += $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) -o $@ -c $< -DO_LD += $(CC_WRAPPER) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS) -DO_LDX += $(CXX_WRAPPER) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS) -DO_CCLD += $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS) -DO_CXXLD += $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS) -DO_AR += $(AR) rcs $@ $^; $(RANLIB) $@ -DO_RC += $(WINDRES) $(DDEFINES) $(DF_TGT) -o $@ -i $< - -%.o: %.c - $(DO_CC) -%.o: %.cc - $(DO_CXX) -%.o: %.cpp - $(DO_CXX) -%.o: %.rc - $(DO_RC) -%: %.o - $(DO_LD) -%: %.c - $(DO_CCLD) -%: %.cc - $(DO_CXXLD) -%: %.cpp - $(DO_CXXLD) -%.a: %.o - $(DO_AR) +# Include current directory to allow sources to include config.h. +override CPPFLAGS += -I. -DHAVE_CONFIG_H=1 +TGT_CXXFLAGS = $(TGT_CFLAGS) +ARFLAGS = rc +INSTALL = install + +tarname = $(TARNAME)-$(VERSION) + +cmd_compile_c = $(CC) $(PKG_CFLAGS) $(TGT_CFLAGS) $(CFLAGS) $(CPPFLAGS) \ + $(TARGET_ARCH) -c $(OUTPUT_OPTION) $< +cmd_compile_cc = $(CXX) $(PKG_CXXFLAGS) $(TGT_CXXFLAGS) $(CXXFLAGS) $(CPPFLAGS) \ + $(TARGET_ARCH) -c $(OUTPUT_OPTION) $< +cmd_link_c = $(CC) $(PKG_CFLAGS) $(TGT_CFLAGS) $(CFLAGS) $(CPPFLAGS) \ + $(PKG_LDFLAGS) $(TGT_LDFLAGS) $(LDFLAGS) \ + $(TARGET_ARCH) $^ $(LOADLIBES) $(PKG_LDLIBS) $(TGT_LDLIBS) $(LDLIBS) -o $@ +cmd_link_cc = $(CXX) $(PKG_CXXFLAGS) $(TGT_CXXFLAGS) $(CXXFLAGS) $(CPPFLAGS) \ + $(PKG_LDFLAGS) $(TGT_LDFLAGS) $(LDFLAGS) \ + $(TARGET_ARCH) $^ $(LOADLIBES) $(PKG_LDLIBS) $(TGT_LDLIBS) $(LDLIBS) -o $@ +cmd_ar = $(AR) $(ARFLAGS) $@ $^; $(RANLIB) $@ +cmd_compile_rc = $(WINDRES) $(CPPFLAGS) $(TARGET_ARCH) $(OUTPUT_OPTION) -i $< +cmd_sed = sed -f config.sed <$< >$@ +cmd_gzip = gzip -c $< >$@ +cmd_bzip2 = bzip2 -c $< >$@ +cmd_xxd = id=$(subst .,_,$(notdir $<)); \ + printf "\#include \nsize_t\tdata_%s_size = %d;\nchar\tdata_%s[] = {\n" \ + $$id $$(wc -c <$<) $$id >$@; \ + xxd -i <$< >>$@; \ + printf ", 0x00\n};\n" >>$@ +cmd_configure = ./configure +func_install = mkdir -p $(DESTDIR)$3 && $(INSTALL) -m $1 $2 $(DESTDIR)$3 +func_remove = rm -f $1 +func_dist = git archive HEAD --prefix='$(tarname)/' | $1 >"$(tarname).tar.$2" && \ + (md5 "$(tarname).tar.$2" 2>/dev/null || md5sum "$(tarname).tar.$2") + +compile_c = $(call func_print,CC,$@) $(cmd_compile_c) +compile_cc = $(call func_print,CXX,$@) $(cmd_compile_cc) +compile_rc = $(call func_print,RC,$@) $(cmd_compile_rc) +link_c = $(call func_print,LINK,$@) $(cmd_link_c) +link_cc = $(call func_print,LINK,$@) $(cmd_link_cc) +ar = $(call func_print,AR,$@) $(cmd_ar) +sed = $(call func_print,SED,$@) $(cmd_sed) +gzip = $(call func_print,GZIP,$@) $(cmd_gzip) +bzip2 = $(call func_print,BZIP2,$@) $(cmd_bzip2) +xxd = $(call func_print,XXD,$@) $(cmd_xxd) +configure = $(call func_print,MAKE,$@) $(cmd_configure) +dist = $(call func_print,DIST,$1) $(func_dist) +install = $(call func_print,CP,$(DESTDIR:%/=%)$(3:%/=%)/$(notdir $2)) $(func_install) +remove = $(call func_print,RM,$1) $(func_remove) + +ifeq (1,$V) +Q = +func_print = +else +Q = @ +func_print = printf "\x20\x20$1\t%s\n" $2; +endif # -# Stuff. +# Define the implicit rules. # -#TGT_BIN := $(addsuffix $(EXEEXT),$(TGT_BIN)) +%.o: %.cc + $(Q)$(compile_cc) +%.o: %.cpp + $(Q)$(compile_cc) +%.o: %.c + $(Q)$(compile_c) +%.o: %.rc + $(Q)$(compile_rc) +%: %.in + $(Q)$(sed) +%.gz: % + $(Q)$(gzip) +%.bz2: % + $(Q)$(bzip2) + +$(builddir)/%.o: %.cc + $(Q)$(compile_cc) +$(builddir)/%.o: %.cpp + $(Q)$(compile_cc) +$(builddir)/%.o: %.c + $(Q)$(compile_c) +$(builddir)/%.o: %.rc + $(Q)$(compile_rc) +$(builddir)/%: %.in + $(Q)$(sed) +$(builddir)/%.gz: % + $(Q)$(gzip) +$(builddir)/%.bz2: % + $(Q)$(bzip2) +$(builddir)/%: % + $(Q)if [ -d $< ]; then mkdir -p $@; elif [ -f $< ]; then cp -f $< $@; fi # # Define the phony targets. # -.PHONY: targets -targets: $(TGT_BIN) $(TGT_LIB) +.DEFAULT_GOAL := +all: $(targets) -.PHONY: clean clean: -ifeq ($(verbose),yes) - rm -f $(CLEAN) -else - @echo " CLEAN"; rm -f $(CLEAN) -endif + $(Q)$(foreach f,$(clean),$(call remove,$f);) + $(Q)if [ -d $(builddir) ]; then find $(builddir) -type d -empty -delete; fi -.PHONY: distclean distclean: clean -ifeq ($(verbose),yes) - rm -f config.mk -else - @rm -f config.mk -endif + $(Q)cd build && $(MAKE) clean + $(Q)$(call remove,config.h);$(call remove,config.mk);$(call remove,config.sed) + + +install: install-data install-exec -.PHONY: install -install: targets - $(INSTALL) $(TGT_BIN) -m 755 -d $(DESTDIR)$(bindir) - $(INSTALL) $(TGT_DATA) -m 644 -d $(DESTDIR)$(datadir) - $(INSTALL) $(TGT_LIB) -m 750 -d $(DESTDIR)$(libdir) - $(INSTALL) $(TGT_MAN) -m 644 -d $(DESTDIR)$(mandir) +install-data: $(DATA_TARGETS) + $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(pkgdatadir_$d),\ + $(call install,644,$f,$(dir $(f:$d%=$(pkgdatadir)%)));)) + $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(mandir_$d),\ + $(call install,644,$f,\ + $(dir $(f:$d%=$(mandir)/man$(shell echo "$f" | sed 's/[^.]*\.\([^.]*\).*/\1/')%)));)) + +install-exec: $(EXEC_TARGETS) + $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(bindir_$d),\ + $(call install,755,$f,$(dir $(f:$d%=$(bindir)%)));)) + +install-desktop-entry: $(DATA_TARGETS) + $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(desktop_$d),\ + $(call install,644,$f,/usr/share/applications);)) + + +dist-all: dist-bzip2 dist-gzip dist-lzma dist-xz + +dist-bzip2: + $(Q)$(call dist,bzip2,bz2) + +dist-gzip: + $(Q)$(call dist,gzip,gz) + +dist-lzma: + $(Q)$(call dist,lzma,lzma) + +dist-xz: + $(Q)$(call dist,xz,xz) + +dist: dist-$(archiveFormat) # # Prevent make from removing any build targets. # -.SECONDARY: $(CLEAN) +.SECONDARY: $(clean) + +.PHONY: all clean distclean install install-data install-exec +.PHONY: install-desktop-entry +.PHONY: dist dist-all dist-gzip dist-bzip2 dist-xz dist-lzma + +endif # menuconfig