top=$(CURDIR) SRC_DIR=$(top)/src BUILD_DIR=$(SRC_DIR) src=$(wildcard $(SRC_DIR)/*.c) obj=$(patsubst $(SRC_DIR)/%.c, %.o, $(src)) target=a.out all: cd ./src && $(MAKE) \ -f $(top)/Makefile a.out CURDIR=$(top) a.out:$(obj) gcc $^ -o $@ .c.o: gcc -c $< clean: rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/$(target)
1.工作目錄
(0)Makefile的工作目錄
Makefile的工作目錄默認繼承為其父進程的工作目錄,即shell的當前目錄,
Makefile的工作目錄使用CURDIR變量,
可以在make時設置CURDIR以改變Makefile的工作目錄
(1)變量定義的工作目錄
Makefile執行時,變量首先被定義,變量定義的工作目錄是 CURDIR
(2)命令執行的工作目錄
命令執行的工作目錄是CURDIR,命令中可以修改本條命令的工作目錄,無法改變其他命令工作目錄。使用 && 除外
cd ./src && $(MAKE) \ -f $(top)/Makefile a.out CURDIR=$(top)
這里 make -f $(top)/Makefile .......的工作目錄被 cd ./src改變,這里修改 CURDIR的原因是,新的Makefile進程執行時,為了正確生成 obj字符串,需要將工作目錄修改。
這里 -f的意思是顯示指定 Makefile文件
注意:
cd ./src pwd
這樣pwd是不會被 cd ./src影響的。
cd ./src && pwd
這樣pwd會被cd ./src影響
2. .c.o
.c.o:
表示 所有的 .o 文件依賴.c 文件