最近在編寫android編譯系統時,需要遍歷每乙個目錄下每乙個資料夾下的makefile,網上的方法有些繁瑣 ;就直接貼上自己遍歷子目錄深度為1;(for temporary)(之後會繼續更新)
下面是我的乙個簡單例項工程:
資料夾目錄層次:
#獲取當前目錄下的子目錄名字
2 subdir = $(shell ls -l | grep ^d | awk''
)34.phony : all clean $ null56
all: $
7$ : null
8make -c $@ clean
9make -c $@
1011 #make clean可以直接去掉各層目錄下的*.o檔案,而在android編譯系統中會直接刪除out路徑就可以了
12clean:
13find ./ -name '
*.o' | xargs -i{} rm -f {}
14null:
15#:為空語句
16 @:
1 #pwd = "reference:shell pwd
"2 cc := gcc
3#shell pwd是比較好一點的
4 inc_dir := $(shell pwd)/inc/
5 src_dir := $(shell pwd)/src/
6 obj_dir := $(shell pwd)/obj/
7 bin_dir := $(shell pwd)/bin/
8 lib_dir := $(shell pwd)/lib/910
#目標檔名
11 target := $(bin_dir)/main
1213
14 cflags := -g
15 cflags += -wall
16 cflags += -d_fortify_source=2
1718
19 #patsubst 是替換萬用字元,會把第乙個%.c替換成第二個引數的%.c,
20#wildcard 是把指定目錄 $(src_dir)下面的.c檔案全部展開
21#notdir 是把展開的檔案去掉路徑資訊
22 sources := $(patsubst %.c,%.c,$(notdir $(wildcard $(src_dir)/*
.c))) \
2324
objects := $(addprefix $(obj_dir)/, $(sources:.c=.o))
2526
27.phony : clean all $(target) $(objects)
2829
incpaths := \
30-i. \
3132
libdirs := \
33-l. \
3435
libs := \
36-lpthread \
3738
$(target) : $(objects)
39@mkdir -p $(lib_dir) $(bin_dir) 2> /dev/null
40$(cc) $(cflags) -o $@ $(objects)
41$(objects) : $(obj_dir)/%.o : $(src_dir)/%.c
42@mkdir -p $(obj_dir) 2> /dev/null
43$(cc) -c $(cflags) $< -o $@
4445
all: $(objects) $(target)
4647
clean:
48find ./ -name '*.*.swp' | xargs -i{} rm -f {}
49rm -f $(objects) $(target)
乙個通用Makefile的編寫
我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多.c的原始檔。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這樣大大提高了開發效率。但是makefile的...
乙個通用的makefile詳解
一般整個工程的makefile分為3類 1.頂層目錄的makefile 2.頂層目錄的makefile.build 3.各級子目錄的makefile 1 頂層目錄的makefile 它除了定義obj y來指定根目錄下要編程序式去的檔案 子目錄外,主要是定義工具鏈 編譯引數 鏈結引數 就是檔案中用ex...
編寫乙個簡單通用的makefile
author 李超 date 2012 05 06 縱然makefile 的規則還是相當多的,編寫乙個大規模的軟體,良好的 makefile 架構是方便維護程式編譯的關鍵。學習 makefile 的時間週期還是比較長的,為了寫出規範的 需要在很短的時間內編寫乙個 makefile 這裡給給出乙個 m...