# $(call source-to-object,source-file-list($1)) source-to-object = $(subst .c,.o,$(filter %.c,$1)) # 产生库文件相对路?被每个库程序的module.mk文件使用. # $(subdirectory) subdirectory = $(patsubst $(SOURCE_DIR)/%/module.mk,%, \ $(word \ $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))) # 产生库文件规?被每个库程序的module.mk文件使用. $(call make-library,library-name($1),source-file-list($2)) define make-library libraries += $1 sources += $2 $1: $(call source-to-object,$2) $(QUIET)$(AR) $(ARFLAGS) $$@ $$^ $(ENULL) @echo "$$(INFO_C)AR $$@ done";echo endef # 产生依赖文件. # $(call make-depend,source-file($1),object-file($2),depend-file($3)) define make-depend $(CC) -MM -MF $3 -MP -MT $2 $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $1 endef SOURCE_DIR := ../app MQTT_DIR := ../mqtt PRODUCT := $(MAKECMDGOALS) CONFIG_FILE := $(SOURCE_DIR)/include/config.h VERSION_FILE := $(SOURCE_DIR)/include/version.h VERSION_LIB := version.a DATE_STRING := `date "+%Y.%m.%d %k:%M:%S"` VERSION_STRING := "3.2.1.6" MV := mv -f RM := rm -rf SED := sed TEST := test MKDIR := mkdir -p # 交叉编译设置 #DEFARCH = PC DEFARCH = MYiR ifeq ($(DEFARCH), PC) CROSS_COMPILE = CC = $(CROSS_COMPILE)gcc AR = $(CROSS_COMPILE)ar CFLAGS = -g -Wall -funwind-tables -rdynamic -DHAVE_CONFIG_H else ifeq ($(DEFARCH), MYiR) CFLAGS += -g -Wall -funwind-tables -rdynamic -DHAVE_CONFIG_H endif LDLIB := -lreadline -lncurses -pthread -lm -ldl -lrt -lpaho-mqtt3as -lssl -lcrypto -lsqlite3 # 这里如果是‘@’则隐藏具体的编译命? #QUIET := @ ENULL := > /dev/null INFO_C := "\\33[32mInfo\\33[0m " ERROR_C := "\\33[31mInfo\\33[0m " modules := $(patsubst $(SOURCE_DIR)/%/module.mk,%, \ $(shell find $(SOURCE_DIR) -name module.mk)) # 该变量仅用于产生输出目录,不做任何其他使用. create-output-directories := $(shell for f in $(modules); \ do \ $(TEST) -d $$f || $(MKDIR) $$f; \ done) programs := sources := libraries := objects = $(call source-to-object,$(sources)) dependencies = $(subst .o,.d,$(objects)) include_dirs := $(SOURCE_DIR)/include $(MQTT_DIR)/include CPPFLAGS += $(addprefix -I ,$(include_dirs)) vpath %.h $(include_dirs) vpath %.c $(SOURCE_DIR) .PHONY: empty empty: @echo "Please explicitly specify the Makefile target!!!Example \"make PDMonitor\"." include $(patsubst %,$(SOURCE_DIR)/%/module.mk,$(modules)) $(VERSION_LIB): $(CONFIG_FILE) $(libraries) version.c $(QUIET)$(RM) $(VERSION_FILE) @echo "/* WARNING: Don't modify this file anywhere!!! */" >> $(VERSION_FILE) @echo "#ifndef _VERSION_H_" >> $(VERSION_FILE) @echo "#define _VERSION_H_" >> $(VERSION_FILE) @echo "" >> $(VERSION_FILE) @echo "#define VERSION \"$(VERSION_STRING)\"" >> $(VERSION_FILE) @echo "#define DATE \"$(DATE_STRING)\"" >> $(VERSION_FILE) @echo "" >> $(VERSION_FILE) @echo "char* version_get();" >> $(VERSION_FILE) @echo "char* version_date_get();" >> $(VERSION_FILE) @echo "" >> $(VERSION_FILE) @echo "#endif" >> $(VERSION_FILE) @echo "/* WARNING: Don't modify this file anywhere!!! */" >> $(VERSION_FILE) @echo "COMPILE version.o" $(QUIET)$(COMPILE.c) -o version.o version.c $(QUIET)$(AR) $(ARFLAGS) $(VERSION_LIB) version.o $(ENULL) @echo "$(INFO_C)AR $@ done";echo PDMonitor: $(CONFIG_FILE) $(libraries) $(VERSION_LIB) # 使用两次$(libraries)避免库文件之间的交叉引用问题. $(QUIET)$(LINK.o) -rdynamic $(libraries) $(VERSION_LIB) $(LDLIB) -o $@ @echo "$(INFO_C)LINK $@ done";echo # $(QUIET)cp $@ //home//embed//LandPower// CableMQTT: $(CONFIG_FILE) $(libraries) $(VERSION_LIB) # 使用两次$(libraries)避免库文件之间的交叉引用问题. $(QUIET)$(LINK.o) -rdynamic $(libraries) $(libraries) $(VERSION_LIB) $(LDLIB) -L $(MQTT_DIR)/lib -o $@ @echo "$(INFO_C)LINK $@ done";echo # $(QUIET)cp $@ //home//embed//LandPower// .PHONY: libraries libraries: $(libraries) .PHONY: clean clean: $(RM) $(modules) $(CONFIG_FILE) $(VERSION_FILE) PDMonitor CableMQTT $(VERSION_LIB) version.o ifneq "$(MAKECMDGOALS)" "clean" -include $(dependencies) include config.mk endif %.o: %.c @echo "COMPILE $@" $(QUIET)$(call make-depend,$<,$@,$(subst .o,.d,$@)) $(QUIET)$(COMPILE.c) -o $@ $<