1、目標名稱,擺脫手動設置目標名稱
TARGET = $(notdir $(CURDIR))
all:$(TARGET)
CMD....
$(CURDIR) 表示Makfile當前目錄全路徑
$(notdir $(path)) 表示把path目錄去掉路徑名,只留當前目錄名
這樣就可以得到Makefile當前目錄名稱,用目錄名作爲目標程序名是一個不錯的選擇
2、使用include,把所有Makefile共享的設置包含進來
BASE_DIR = /root/DM36x
include $(BASE_DIR)/Rules.make
XDC_PATH = $(DMAI_INSTALL_DIR)/packages
DMAI_INSTALL_DIR在Rules.make中已經設置過,這樣,需要使用DMAI_INSTALL_DIR變量的時候只要include 這個Rules.make接可以了
3、遍歷遍歷所有特定的源文件
SOURCES = $(wildcard *.c)
HEADERS = $(wildcard *.h)
如果當前目錄先有 main.c func.c func.h
這樣SOURCES變量就等於main.c func.c
HEADERS變量就等於func.h
這樣就每次添加源文件後 就不需要重新修改makefile了
4、替換文件名稱
OBJFILES = $(SOURCES:%.c=%.o)
如果SOURCES等與3中的main.c和func.c
這樣OBJFILES就等於main.o func.o
同樣擺脫了手動修改編譯的中間文件名
5、交叉編譯設置
VERBOSE = @
COMPILE.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(C_FLAGS) $(CPP_FLAGS) -c
LINK.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(LD_FLAGS)
6、編譯
$(OBJFILES): %.o: %.c $(HEADERS)
@echo Compiling $@ from $<..
$(COMPILE.c) -o $@ $<
7、
install: $(if $(wildcard $(TARGET)), install_$(TARGET))
install_$(TARGET):
@install -d $(EXEC_DIR)
@install $(TARGET) $(EXEC_DIR)
@install $(TARGET).txt $(EXEC_DIR)
@echo
@echo Installed $(TARGET) binaries to $(EXEC_DIR)..
先判斷當前目錄是否有$(TARGET),如果有,就執行僞目標install_$(TARGET),這個展開了就相當於install_app,如果$(TARGET)等於app的話