Makefile學習(三)[第二版],makefile學習第二版
make常用內嵌函數
1、函數調用
$(function arguments)#$引用的結果就是函數產生的結果
2、Makefile下常用的函數
1)$(wildcard PATTERN)#匹配目前的目錄下的檔案
例如:src=$(wildcard *.c)#匹配目前的目錄下所有的.c檔案
2)$(patsubst PATTERN,REPLACEMENT,TEXT)#模式替換函數
例如:$(patsubst %.c,%.o,$src)#等價於$(src:%.c=%.o)[常用]
3)shell函數,執行shell命令
例如:$(shell ls –d */)
多級目錄Makefile
#樣本1-所有的編譯均由主目錄下的Makefile完成
CC= gcc
CFLAGS = -Wall -g
BIN = main
SUBDIR = $(shell ls -d */)#SUBDIR儲存了目前的目錄下的子目錄
ROOTSRC = $(wildcard *.c)#ROOTSRC儲存了目前的目錄下的.c檔案
ROOTOBJ = $(ROOTSRC:%.c=%.o)#ROOTOBJ儲存了將ROOTSRC中.c替換為.o檔案之後的結果
SUBSRC = $(shell find $(SUBDIR) -name '*.c')#SUBSRC儲存了所有子目錄下的所有.c檔案
SUBOBJ = $(SUBSRC:%.c=%.o)#SUBOBJ儲存了將SUBSRC中.c替換為.o檔案之後的結果
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@#將所有的.c產生.o檔案
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
#樣本2-各個子目錄下都有想對應的Makefile檔案,各個子目錄負責相應的編譯工作
DIRS = lib intro sockets advio daemons datafiles db environ \
fileio filedir ipc1 ipc2 proc pty relation signals standards \
stdio termios threadctl threads printer exercises
all:
for i in $(DIRS); do \
(cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; \
done
clean:
for i in $(DIRS); do \
(cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; \
done
產生分布在多個目錄下的可執行檔
#每個子目錄都需要產生一個可執行檔,目前的目錄的結構如
#各個檔案的內容如下
//test1/test1.c#include <stdio.h>int main(){ printf("Hello !\n"); return 0;}
#test1/Makefile
.PHONY: all clean print
CC = gcc
CFLAGS = -Wall -g
BIN = test1
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:%.c=%.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^
#$(OBJECTS): $(SOURCES)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
clean:
@echo "---- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
//test2/test2.cpp#include <iostream>using namespace std;int main(void){ cout << "World!" << endl;}
#test2/Makefile
.PHONY: clean all print
CXX = g++
CPPFLAGS = -Wall -g
BIN = test2
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CXX) $(CPPFLAGS) -o $@ $<
%.o: %.cpp #可以省略該行以及下面一行
$(CXX) $(CPPFLAGS) -o $@ -c $<
clean:
@echo "----- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
#Makefile-在主目錄下
SUBDIR = $(shell /bin/ls -d */)
.PHONY: default all clean $(SUBDIR)
default: all
all clean:
$(MAKE) $(SUBDIR) TARGET=$@
$(SUBDIR):
$(MAKE) -C $@ $(TARGET)
#執行make之後的結果
#執行後的目錄結構圖
增添了好多檔案[.o 和 可執行檔]
#執行make clean的結果
#執行之後的結構圖
恢複原樣O(∩_∩)O~
Linux中MakeFile有三個,分別都是幹嘛的?
預設的情況下,make會在工作目錄(執行make的目錄)下按照檔案名稱順序尋找makefile檔案讀取並執行,尋找的檔案名稱順序為:“GNUmakefile”、“makefile”、“Makefile”。
通常應該使用“makefile”或者“Makefile”作為一個makefile的檔案名稱(我們推薦使用“Makefile”,首字母大寫而比較顯著,一般在一個目錄中和目前的目錄的一些重要檔案(README,Chagelist等)靠近,在尋找時會比較容易的發現它)。而“GNUmakefile”是我們不推薦使用的檔案名稱,因為以此命名的檔案只有“GNU make”才可以識別,而其他版本的make程式只會在工作目錄下“makefile”和“Makefile”這兩個檔案。
make工程管理器是什?怎編寫makefile檔案
Copyleft_X 回答的很不錯,就是這樣的,我覺得在寫makefile之前,先自己找個好的makefile學習下,在此基礎上修改下,熟悉了makefile怎麼工作之後,對其有了一定的概念上的了結了之後,那再好好看下跟我一起寫makefile這個東西,記住千萬別寫的很複雜,夠用就好了。