#!/usr/bin/make -f #******************************************************************************# # Include variables and message subsystem # #******************************************************************************# include Makefile.vars Makefile.msg #******************************************************************************# # General targets # #******************************************************************************# # Build everything. all: all-lib # Mostly clean everything. (remove everything but the end results) mostlyclean: mostlyclean-lib mclean: mostlyclean # Clean everything. clean fclean: clean-lib $(call qcmd,$(RM) -r lib$(NAME)-*) # Clean everything, and configuration. mrproper: clean $(call rmsg,Removing configuration.) $(call qcmd,$(RM) Makefile.cfg) # Make a distribution tarball dist: mrproper $(call bcmd,mkdir,lib$(NAME)-$(VERSION),\ $(MD) .dist) $(call bcmd,cp,* lib$(NAME)-$(VERSION),\ $(CP) -R * .dist) $(call qcmd,\ $(MV) .dist lib$(NAME)-$(VERSION)) $(call bcmd,tarball,lib$(NAME)-$(VERSION),\ tar czf lib$(NAME)-$(VERSION).tar.gz \ --exclude .git lib$(NAME)-$(VERSION)) $(call qcmd,$(RM) -r lib$(NAME)-$(VERSION)) # Remake everything. (clean and build) re: clean all .PHONY: all mostlyclean mclean clean fclean dist mrproper re #******************************************************************************# # Configuration (version) checking dependencies # #******************************************************************************# # Define the dependencies. CHECKCFG := $(if $(shell test -f Makefile.cfg || echo y),check-config, \ $(if $(shell [ "$(VERSION)" = "$(CONFIG_VERSION)" ] || echo y), \ check-config-version)) # Define the rules. check-config: @echo -e "\033[1;31mNo configuration file found!" @echo -e "You should configure before re-running this target.\033[0m" @false check-config-version: @echo -e "\033[1;31mConfiguration version is incorrect!" @echo -e "You should re-configure before re-running this target.\033[0m" @false .PHONY: check-config check-config-version #******************************************************************************# # Information getting from the Makefile variables # #******************************************************************************# # Get the project name. getname: @echo lib$(NAME) # Get the maintainer getmaintainer: @echo "$(MAINTAINER_NAME) <$(MAINTAINER_MAIL)>" # Get the project version. getversion: @echo "$(VERSION)" .PHONY: getname getmaintainer getversion #******************************************************************************# # Library-specific targets # #******************************************************************************# # Make the library. all-lib: $(CHECKCFG) lib$(NAME).a # Make an object directory. $(OBJDIR)/ $(DIRS:%=$(OBJDIR)/%): $(call bcmd,mkdir,$@,$(MD) $@) # Make an object out of a source file. define make-obj-rules ifeq ($(shell test -f $(SRCDIR)/$1.c && echo y),y) $(OBJDIR)/$1.o: $(SRCDIR)/$1.c $(INC) | $(dir $(OBJDIR)/$1) $(call bcmd,cc,$$@,$(CC) -c -o $$@ $$< $(CFLAGS)) else $(OBJDIR)/$1.o: $(SRCDIR)/$1.s | $(dir $(OBJDIR)/$1) $(call bcmd,as,$$@,$(AS) -c -o $$@ $$< $(ASFLAGS)) endif endef $(foreach src,$(SRC), \ $(eval $(call make-obj-rules,$(src)))) # Make the library. lib$(NAME).a: $(SRC:%=$(OBJDIR)/%.o) $(call bcmd,ar rcs,$@,$(AR) rc $@ $^) # Remove the objects directory. mostlyclean-lib: $(call rmsg,Removing object directory.) $(call qcmd,$(RM) -r $(OBJDIR)) mclean-lib: mostlyclean-lib # Clean and remove the built library. clean-lib: mclean-lib $(call rmsg,Removing the library.) $(call qcmd,$(RM) lib$(NAME).a) # Remake the library. re-lib: clean-lib all-lib .PHONY: all-lib mostlyclean-lib mclean-lib clean-lib re-lib # End of file.