Shell應用(10):支援開源庫編譯的Makefile
阿新 • • 發佈:2018-12-22
指令碼原始碼
由於很多應用專案依賴諸多第三方開源庫,這些開源庫各有不同的核心目錄、庫目標和輸出位置,這裡的核心目錄是指僅產生so庫的工程目錄,庫目標是指僅產生so庫的make目標,輸出位置是相對於核心目錄的,但不必是子目錄,可用..來回溯到父目錄的某位置,更高層目錄的位置,依次類推。為了統一支援它們,使用了一些技巧,詳見示例指令碼如下 1.PHONY: all clean lib core
2
3thirdlib=openssl-1.0.1u?build_ssl ACE_wrappers/ace json ncurses-6.0??lib
4coremod=main
5
6dir = `echo [email protected] | awk -F? '{print $$1}'` 7aim = `echo [email protected] | awk -F? '{print $$2}'` 8out = `echo [email protected] | awk -F? '{print $$3}'` 910copy=\cp -Pf ${dir}/${out}/*.so* output
11
12define MAKE_SUBDIR
13echo "${dir},${aim},${out}"; \14if [ "$(MAKECMDGOALS)" !="clean " ]; then\15$(MAKE) ${aim} -C ${dir}; \16if [ "$$is_cp"-eq "1" ]; then\17$(copy); \18fi \19else\20$(MAKE) clean -C ${dir}; \21fi
22endef
23
24all: lib core
25
26lib: $(thirdlib)
27
28$(thirdlib)::
29 @is_cp=1; $(MAKE_SUBDIR)
30
31core: $(coremod)
32
33$(coremod)::
34 @is_cp=0; $(MAKE_SUBDIR)
35
36clean: $(thirdlib) $(coremod)
實現技巧
1)使用?作為分隔符,所分隔的3個域依次為核心目錄、庫目標、輸出位置;使用awk來獲取各域,分別為dir、aim和out;在執行過程中,值dir一定非空,而aim為空則表示預設目標,out為空表示輸出位置即為dir目錄。
2)copy為命令變數,功能為每當一個庫編譯完成後,將輸出的so庫拷貝到output下,並保持軟連結;對於有的開源庫,需在編譯前,使用對應的選項來呼叫configure,使其生成so庫。
3)為了重用程式碼,定義了MAKE_SUBDIR命令包,引數變數為is_cp,當is_cp為1時,表示當前編譯的是依賴庫,否則是主程式。
4)thirdlib和coremod為依賴檔案,使用了雙冒號規則,這樣一來,只要在thirdlib中加入新的依賴庫,指定核心目錄、庫目標和輸出位置即可,其它地方不用改。 posted on 2016-10-19 15:11 春秋十二月 閱讀(2733) 評論(0) 編輯 收藏 引用 所屬分類: System
由於很多應用專案依賴諸多第三方開源庫,這些開源庫各有不同的核心目錄、庫目標和輸出位置,這裡的核心目錄是指僅產生so庫的工程目錄,庫目標是指僅產生so庫的make目標,輸出位置是相對於核心目錄的,但不必是子目錄,可用..來回溯到父目錄的某位置,更高層目錄的位置,依次類推。為了統一支援它們,使用了一些技巧,詳見示例指令碼如下 1.PHONY: all clean lib core
2
3thirdlib=openssl-1.0.1u?build_ssl ACE_wrappers/ace json ncurses-6.0??lib
4coremod=main
5
6dir
11
12define MAKE_SUBDIR
13echo "${dir},${aim},${out}"; \14if [ "$(MAKECMDGOALS)" !="clean
22endef
23
24all: lib core
25
26lib: $(thirdlib)
27
28$(thirdlib)::
29 @is_cp=1; $(MAKE_SUBDIR)
30
31core: $(coremod)
32
33$(coremod)::
34 @is_cp=0; $(MAKE_SUBDIR)
35
36clean: $(thirdlib) $(coremod)
實現技巧
1)使用?作為分隔符,所分隔的3個域依次為核心目錄、庫目標、輸出位置;使用awk來獲取各域,分別為dir、aim和out;在執行過程中,值dir一定非空,而aim為空則表示預設目標,out為空表示輸出位置即為dir目錄。
2)copy為命令變數,功能為每當一個庫編譯完成後,將輸出的so庫拷貝到output下,並保持軟連結;對於有的開源庫,需在編譯前,使用對應的選項來呼叫configure,使其生成so庫。
3)為了重用程式碼,定義了MAKE_SUBDIR命令包,引數變數為is_cp,當is_cp為1時,表示當前編譯的是依賴庫,否則是主程式。
4)thirdlib和coremod為依賴檔案,使用了雙冒號規則,這樣一來,只要在thirdlib中加入新的依賴庫,指定核心目錄、庫目標和輸出位置即可,其它地方不用改。 posted on 2016-10-19 15:11 春秋十二月 閱讀(2733) 評論(0) 編輯 收藏 引用 所屬分類: System