最近在搞项目自动化编译,稍有心得。这里简单的笔记下,该脚本可以自动编译指定目录下的C文件。
CONTENTS
build_target.sh
#!/bin/sh TARGET_DIR= if [ -z "$1" ];then echo "please input the target dir " exit 1 else TARGET_DIR=$1 fi #开始编译 make TARGET_DIR=$TARGET_DIR clean make TARGET_DIR=$TARGET_DIR build_target
Makefile
COMPILE_PREX = AR = $(COMPILE_PREX)ar CC = $(COMPILE_PREX)gcc NM = $(COMPILE_PREX)nm CPP = $(COMPILE_PREX)g++ OBJCOPY = $(COMPILE_PREX)objcopy OBJDUMP = $(COMPILE_PREX)objdump LINKFLAGS = CCFLAGS = -g DEFINES = CFLAGS = $(CCFLAGS) $(DEFINES) $(TARGET_INCS) #编译所用变量 ROOT_DIR = $(abspath .) OUTPUT_DIR = $(ROOT_DIR)/output/$(TARGET_DIR) OUTPUT_DIR_OBJS = $(OUTPUT_DIR)/objs #目标基准路径 TARGET_SRC_BASE_DIR = $(ROOT_DIR)/$(TARGET_DIR) TARGET_INC_BASE_DIR = $(ROOT_DIR)/$(TARGET_DIR)/include #目标编译文件 TARGET_SRC_DIRS = $(shell find $(TARGET_SRC_BASE_DIR) -type d) TARGET_SRCS += $(foreach dir, $(TARGET_SRC_DIRS), $(wildcard $(dir)/*.c)) TARGET_SRCS += $(foreach dir, $(TARGET_SRC_DIRS), $(wildcard $(dir)/*.cpp)) TARGET_SRCS += $(foreach dir, $(TARGET_SRC_DIRS), $(wildcard $(dir)/*.s)) TARGET_SRCS += $(foreach dir, $(TARGET_SRC_DIRS), $(wildcard $(dir)/*.S)) #目标头文件 TARGET_INCS = $(addprefix -I , $(shell find $(TARGET_INC_BASE_DIR) -type d) ) #obj命令 TARGET_OBJS = $(addsuffix .o, $(basename $(TARGET_SRCS) ) ) #实际obj地址 TARGET_OBJS_OUT = $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $(TARGET_OBJS)) build_target: $(TARGET_OBJS) $(CC) $(TARGET_OBJS_OUT) $(CFLAGS) $(LINKFLAGS) -o $(OUTPUT_DIR)/linux_entry_$(TARGET_DIR) @echo "Build Target Finish" %.o: %.c @mkdir -p $(dir $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@)); $(CC) $(CFLAGS) -o $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@) -c $< %.o: %.cpp @mkdir -p $(dir $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@)); $(CC) $(CFLAGS) -o $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@) -c $< %.o: %.s @mkdir -p $(dir $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@)); $(CC) $(CFLAGS) -o $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@) -c $< %.o: %.S @mkdir -p $(dir $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@)); $(CC) $(CFLAGS) -D__ASSEMBLER__ -o $(subst $(ROOT_DIR),$(OUTPUT_DIR_OBJS), $@) -c $< .PHONY:clean SHOWARGS clean: rm -rf $(OUTPUT_DIR)
第二种写法
TARGET_ABS_PATH = ...... TARGET_FILES = $(foreach dir, $(shell find $(TARGET_ABS_PATH) -type d), $(wildcard $(dir)/*.c $(dir)/*.cpp $(dir)/*.s $(dir)/*.S)) TARGET_INCLUDE = $(addprefix -I , $(shell find $(TARGET_ABS_PATH) -type d)) TARGET_CFLAGS = $(TARGET_INCLUDE) .PHONY: show_target_params show_target_params: @echo "TARGET_ABS_PATH:\n$(TARGET_ABS_PATH)" @echo "TARGET_FILES:\n$(TARGET_FILES)" @echo "TARGET_INCLUDE:\n$(TARGET_INCLUDE)" @echo "TARGET_CFLAGS:\n$(TARGET_CFLAGS)"
发表评论