# Base Makefile providing various standard targets # Part of mklove suite but may be used independently. MKL_RED?= \033[031m MKL_GREEN?= \033[032m MKL_YELLOW?= \033[033m MKL_BLUE?= \033[034m MKL_CLR_RESET?= \033[0m DEPS= $(OBJS:%.o=%.d) # TOPDIR is "TOPDIR/mklove/../" i.e., TOPDIR. # We do it with two dir calls instead of /.. to support mklove being symlinked. MKLOVE_DIR := $(dir $(lastword $(MAKEFILE_LIST))) TOPDIR = $(MKLOVE_DIR:mklove/=.) # Convert LIBNAME ("libxyz") to "xyz" LIBNAME0=$(LIBNAME:lib%=%) # Silence lousy default ARFLAGS (rv) ARFLAGS= ifndef MKL_MAKEFILE_CONFIG -include $(TOPDIR)/Makefile.config endif _UNAME_S := $(shell uname -s) ifeq ($(_UNAME_S),Darwin) LIBFILENAME=$(LIBNAME).$(LIBVER).dylib LIBFILENAMELINK=$(LIBNAME).dylib else LIBFILENAME=$(LIBNAME).so.$(LIBVER) LIBFILENAMELINK=$(LIBNAME).so endif INSTALL?= install INSTALL_PROGRAM?= $(INSTALL) INSTALL_DATA?= $(INSTALL) -m 644 prefix?= /usr/local exec_prefix?= $(prefix) bindir?= $(exec_prefix)/bin sbindir?= $(exec_prefix)/sbin libexecdir?= $(exec_prefix)/libexec/ # append PKGNAME on install datarootdir?= $(prefix)/share datadir?= $(datarootdir) # append PKGNAME on install sysconfdir?= $(prefix)/etc sharedstatedir?=$(prefix)/com localestatedir?=$(prefix)/var runstatedir?= $(localestatedir)/run includedir?= $(prefix)/include docdir?= $(datarootdir)/doc/$(PKGNAME) infodir?= $(datarootdir)/info libdir?= $(prefix)/lib localedir?= $(datarootdir)/locale pkgconfigdir?= $(libdir)/pkgconfig mandir?= $(datarootdir)/man man1dir?= $(mandir)/man1 man2dir?= $(mandir)/man2 man3dir?= $(mandir)/man3 man4dir?= $(mandir)/man4 man5dir?= $(mandir)/man5 man6dir?= $(mandir)/man6 man7dir?= $(mandir)/man7 man8dir?= $(mandir)/man8 # Checks that mklove is set up and ready for building mklove-check: @if [ ! -f "$(TOPDIR)/Makefile.config" ]; then \ printf "$(MKL_RED)$(TOPDIR)/Makefile.config missing: please run ./configure$(MKL_CLR_RESET)\n" ; \ exit 1 ; \ fi %.o: %.c $(CC) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $< -o $@ %.o: %.cpp $(CXX) -MD -MP $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ lib: $(LIBFILENAME) $(LIBNAME).a $(LIBFILENAMELINK) lib-gen-pkg-config $(LIBFILENAME): $(OBJS) $(LIBNAME).lds @printf "$(MKL_YELLOW)Creating shared library $@$(MKL_CLR_RESET)\n" $(CC) $(LDFLAGS) $(LIB_LDFLAGS) $(OBJS) -o $@ $(LIBS) $(LIBNAME).a: $(OBJS) @printf "$(MKL_YELLOW)Creating static library $@$(MKL_CLR_RESET)\n" $(AR) rcs$(ARFLAGS) $@ $(OBJS) $(LIBFILENAMELINK): $(LIBFILENAME) @printf "$(MKL_YELLOW)Creating $@ symlink$(MKL_CLR_RESET)\n" rm -f "$@" && ln -s "$^" "$@" # pkg-config .pc file definition ifeq ($(GEN_PKG_CONFIG),y) define _PKG_CONFIG_DEF prefix=$(prefix) libdir=$(libdir) includedir=$(includedir) Name: $(LIBNAME) Description: $(MKL_APP_DESC_ONELINE) Version: $(MKL_APP_VERSION) Cflags: -I$${includedir} Libs: -L$${libdir} -l$(LIBNAME0) Libs.private: $(patsubst -L%,,$(LIBS)) endef export _PKG_CONFIG_DEF $(LIBNAME0).pc: ../Makefile.config @printf "$(MKL_YELLOW)Generating pkg-config file $@$(MKL_CLR_RESET)\n" @echo "$$_PKG_CONFIG_DEF" > $@ lib-gen-pkg-config: $(LIBNAME0).pc lib-clean-pkg-config: rm -f $(LIBNAME0).pc else lib-gen-pkg-config: lib-clean-pkg-config: endif $(BIN): $(OBJS) @printf "$(MKL_YELLOW)Creating program $@$(MKL_CLR_RESET)\n" $(CC) $(CPPFLAGS) $(LDFLAGS) $(OBJS) -o $@ $(LIBS) file-check: @printf "$(MKL_YELLOW)Checking $(LIBNAME) integrity$(MKL_CLR_RESET)\n" @RET=true ; \ for f in $(CHECK_FILES) ; do \ printf "%-30s " $$f ; \ if [ -f "$$f" ]; then \ printf "$(MKL_GREEN)OK$(MKL_CLR_RESET)\n" ; \ else \ printf "$(MKL_RED)MISSING$(MKL_CLR_RESET)\n" ; \ RET=false ; \ fi ; \ done ; \ $$RET lib-install: @printf "$(MKL_YELLOW)Install $(LIBNAME) to $$DESTDIR$(prefix)$(MKL_CLR_RESET)\n" $(INSTALL) -d $$DESTDIR$(includedir)/$(PKGNAME) ; \ $(INSTALL) -d $$DESTDIR$(libdir) ; \ $(INSTALL) $(HDRS) $$DESTDIR$(includedir)/$(PKGNAME) ; \ $(INSTALL) $(LIBNAME).a $$DESTDIR$(libdir) ; \ $(INSTALL) $(LIBFILENAME) $$DESTDIR$(libdir) ; \ [ -f "$(LIBNAME0).pc" ] && ( \ $(INSTALL) -d $$DESTDIR$(pkgconfigdir) ; \ $(INSTALL) -m 0644 $(LIBNAME0).pc $$DESTDIR$(pkgconfigdir) \ ) ; \ (cd $$DESTDIR$(libdir) && ln -sf $(LIBFILENAME) $(LIBFILENAMELINK)) lib-uninstall: @printf "$(MKL_YELLOW)Uninstall $(LIBNAME) from $$DESTDIR$(prefix)$(MKL_CLR_RESET)\n" for hdr in $(HDRS) ; do \ rm -f $$DESTDIR$(includedir)/$(PKGNAME)/$$hdr ; done rm -f $$DESTDIR$(libdir)/$(LIBNAME).a rm -f $$DESTDIR$(libdir)/$(LIBFILENAME) rm -f $$DESTDIR$(libdir)/$(LIBFILENAMELINK) rmdir $$DESTDIR$(includedir)/$(PKGNAME) || true bin-install: @printf "$(MKL_YELLOW)Install $(BIN) to $$DESTDIR$(prefix)$(MKL_CLR_RESET)\n" $(INSTALL) -d $$DESTDIR$(bindir) && \ $(INSTALL) $(BIN) $$DESTDIR$(bindir) bin-uninstall: @printf "$(MKL_YELLOW)Uninstall $(BIN) from $$DESTDIR$(prefix)$(MKL_CLR_RESET)\n" rm -f $$DESTDIR$(bindir)/$(BIN) generic-clean: rm -f $(OBJS) $(DEPS) lib-clean: generic-clean lib-clean-pkg-config rm -f $(LIBNAME)*.a $(LIBFILENAME) $(LIBFILENAMELINK) \ $(LIBNAME).lds bin-clean: generic-clean rm -f $(BIN)