# lib-type may be given from commandline to control # if resulting library will be static or shared # possible values: static, shared lib-type ?= shared # install directories prefix ?= /usr/local bin-dir ?= ${prefix}/bin include-dir ?= ${prefix}/include lib-dir ?= ${prefix}/lib # install programs install ?= install install-bin ?= $(install) -m 755 install-lib ?= $(install) -m 755 install-includes ?= $(install) -m 644 # working variables SRCS := $(wildcard *.c) HDRS := $(wildcard *.h) DEP_IN = ${SRCS} ${HDRS} OBJS := $(patsubst %.c,%.o,$(SRCS)) #################################### # make rules static_lib_name = lib${NAME}.a dynamic_lib_name = lib${NAME}.so prg_name = ${NAME} out_name = ${prg_name} ifeq ($(TYPE),lib) INCLUDES += -I$(CURDIR)/.. ifeq ($(lib-type),static) out_name = ${static_lib_name} else out_name = ${dynamic_lib_name} endif endif default: ${out_name} #static library ${static_lib_name}: ${OBJS} ar -r $@ ${OBJS} # dynamic library ${dynamic_lib_name}: ${OBJS} ${CC} -shared ${DEFS} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS} # executable ${NAME}: ${OBJS} ${CC} ${DEFS} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS} # common rules %.o: %.c ${CC} ${DEFS} ${CFLAGS} ${INCLUDES} -c $< .PHONY: install clean proper proper: clean clean: -@rm -f ${prg_name} ${static_lib_name} ${dynamic_lib_name} *.o *.so *.d core core.* *~ tags Makefile.deps ifneq ($(MAKECMDGOALS),proper) ifneq ($(MAKECMDGOALS),clean) -include $(SRCS:.c=.d) endif endif %.d: %.c @$(CC) -M ${DEFS} $(CFLAGS) $(INCLUDES) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ # -include Makefile.deps # # Makefile.deps: ${DEP_IN} # @echo "" > Makefile.deps # @makedepend -fMakefile.deps -- ${DEFS} ${CFLAGS} ${INCLUDES} -- ${DEP_IN} 2>/dev/null # -@rm -f Makefile.deps.bak # instalation rules ifeq ($(TYPE),lib) # library instalation install: ${out_name} install_dirs $(install-lib) ${out_name} $(lib-dir) @for hdr in ${HDRS} ; do \ $(install-includes) $$hdr $(include-dir)/$(NAME); \ done install_dirs: $(lib-dir) $(include-dir)/$(NAME) else # executable instalation install: ${out_name} install_dirs $(install-bin) ${out_name} $(bin-dir) install_dirs: $(bin-dir) endif # creating install directories $(bin-dir): mkdir -p $(bin-dir) $(lib-dir): mkdir -p $(lib-dir) $(include-dir)/$(NAME): mkdir -p $(include-dir)/$(NAME)