好记性不如铅笔头

C && C++, 编程

C语言自动编译框架

最近在搞项目自动化编译,稍有心得。这里简单的笔记下,该脚本可以自动编译指定目录下的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)"

 

发表评论

7 + 15 =

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据