1. 程式人生 > >makefile出現錯誤卻不停止,卻繼續執行

makefile出現錯誤卻不停止,卻繼續執行

原文地址:http://www.crifan.com/makefile_not_stop_on_error/

【問題】

寫了個makefile:

#goto every sub foler(single book)'s src dir to do 'make xxx' action
clean clean_all clean_release all release release_copy:
	@echo "Current path="`pwd`;
	@echo "LS_OUTPUT="$(LS_OUTPUT);
	for each_item in $(LS_OUTPUT); \
	do \
	    if [ -d $$each_item/src ]; then \
	            cd  $$each_item/src && \
	            echo `pwd` && \
	            if [ -f Makefile ]; then \
	                make 
[email protected]
; \ fi; \ cd ../..; \ fi; \ done;

然後對應的src中的子makefile中,是去執行對應的動作。

比如執行make release_copy,其會對於每一個子資料夾去執行此make release_copy。

現在問題是,對於某個子資料夾下面,單獨執行make release_copy,是會出現錯誤,並且makefile會正常的停止繼續執行的。

但是對於頂層的去執行makefile release_copy的話,其雖然也同樣顯示錯誤,但是卻會繼續執行後續的動作。

【解決過程】

1。預設makefile遇到錯誤就會停止,對於此處卻失效了。所以很是悲劇。

但是我此處就是已經有了此現象了,想不讓其遇到錯誤卻繼續執行,但是卻沒有相應的引數可以用。

那是因為對於子makefile執行的結果,沒有判斷返回值,所以導致子makefile錯誤的時候,其實是停止了,然後返回錯誤值了,但是上層的makefile卻沒有判斷返回值,導致會繼續執行,所以表現形式就是雖然makefile執行過程中出錯,但是卻還是繼續執行。

然後照葫蘆畫瓢去改為:

#goto every sub foler(single book)'s src dir to do 'make xxx' action
clean clean_all clean_release all release release_copy:
	@echo "Current path="`pwd`;
	@echo "LS_OUTPUT="$(LS_OUTPUT);
	for each_item in $(LS_OUTPUT); \
	do {\
	    if [ -d $$each_item/src ]; then \
	            cd  $$each_item/src && \
	            echo `pwd` && \
	            if [ -f Makefile ]; then \
	                make 
[email protected]
; \ fi; \ cd ../..; \ fi; \ } || exit "$$?";\ done;

結果問題依舊,遇到錯誤,還是繼續執行。

然後注意到,是需要在對子makefile返回值做判斷,所以又改為:

#goto every sub foler(single book)'s src dir to do 'make xxx' action
clean clean_all clean_release all release release_copy:
	@echo "Current path="`pwd`;
	@echo "LS_OUTPUT="$(LS_OUTPUT);
	for each_item in $(LS_OUTPUT); \
	do \
	    if [ -d $$each_item/src ]; then \
	            cd  $$each_item/src && \
	            echo `pwd` && \
	            if [ -f Makefile ]; then \
	                make [email protected] || exit "$$?"; \
	            fi; \
	            cd ../..; \
	    fi; \
	done;

如此,就可以了,遇到錯誤,就會停止了。

【總結】

makefile執行錯誤,結果還會繼續執行,此處是由於是上層makefile呼叫下層子makefile,子makefile執行出錯,停止返回到上層後,上層沒有判斷返回值,導致還是會繼續執行。

解決辦法是,對於子makefile呼叫,判斷返回值,

比如將:

make [email protected];

改為:

make [email protected] || exit "$$?";

這樣make執行錯誤返回值為非0,然後就可以執行後面的exit而退出了。


相關推薦

makefile出現錯誤停止繼續執行

原文地址:http://www.crifan.com/makefile_not_stop_on_error/ 【問題】 寫了個makefile: #goto every sub foler(single book)'s src dir to do 'make xxx'

-lrt問題即:shm_open的標頭檔案存在編譯通過提示undefined

C programming in the UNIX environment的程式設計手冊,一般都會為程序間用共享記憶體的方法通訊提供兩組方法: 1.      POSIX定義的: int shm_open(const char *name, int oflag, mo

ensp出現錯誤代碼43其他設備均能使用

網絡運維基礎知識一開始問題如圖,在華為論壇,百度等尋找答案,然而接下來就是一連串的問題。其實這一系列的問題都是華為eNSP模擬器跟自帶的最新版Oracle VM VirtualBox不兼容的問題。其實不然,最簡單解決方法,直接更換其他版本。如:版本的eNSP_V100R002C00B380_Setup以及自帶

eclipse建立maven工程時出現目錄結構只有一個resources

之前一直用的idea,想熟悉下eclipse開發maven工程,今天建立了幾個maven springmvc試了下,發現總是目錄不全,就網上各種查詢,試了很多方法 ,最後終於成功,原因在於maven的jar包配置出了問題,maven自帶的jdk版本和自己裝的不一樣,修改下就可

解決dos視窗下執行.class檔案出現錯誤: 找到或無法載入主類 HelloWorld

在D盤下:有個HelloWorld.java檔案: package example; public class HelloWorld { public static void main(Strin

gcc在出現錯誤的時候停止編譯 -Wfatal-errors

有時候我們編譯一個大的專案的時候,會出現很多錯誤使得螢幕堆滿了很多無用的資訊。一般情況下我們需要找到首次出現錯誤的地方,在gcc中新增編譯選項可以使編譯停止在第一次出現錯誤的地方: $ gcc -

出現錯誤 連線MySQL資料庫出現問題:Access denied for user 'root'@'localhost' (using password:YES)

連線MySQL資料庫,出現問題:Access denied for user 'root'@'localhost' (using password:YES)。         經查詢資料發現是ro

hadoop3.1.1下MapReduce操作出現錯誤: 找到或無法載入主類org.apache.hadoop.mapreduce.v2.app.MRAppMaster 問題解決方法

Hadoop3.1.1下成功安裝後,進行MapReduce操作出現錯誤: 錯誤: 找不到或無法載入主類org.apache.hadoop.mapreduce.v2.app.MRAppMaster 解決辦法: 在命令列下輸入如下命令,並將返回的地址複製。 hadoop c

由於找到 MSVCR100.dll無法繼續執行代碼

log clas 安裝程序 安裝 .dll 管家 可能 解決 ges 由於找不到 MSVCR100.dll,無法繼續執行代碼。重新安裝程序可能會解決此問題 360軟件管家中找到 進行安裝即可由於找不到 MSVCR100.dll,無法繼續執行代碼

由於找到 opencv_world320.dll無法繼續執行程式碼

  首先找到自己軟體安裝(解壓)的路徑openCV (安裝(解壓)目錄\opencv\build\x64\vc14\bin)    我的安裝(解壓)目錄是:F:\OpenCV\Three320\opencv\build\x64\vc14\bin

錯誤點選jar包將導致bat檔案和exe視窗執行jar包執行

伺服器部署jar包,在這裡提供兩種執行方式和錯誤點選jar包的解決辦法 1.鍵盤 windows+R鍵輸入cmd 按照以下方式輸入: (1) D:        ==> (2) cd D:\hdd\grjbxx ==>(3)java -jar aaa.j

crontab 執行成功指令碼手動執行成功

請確保手工可以執行該檔案(給sh檔案增加X許可權 chmod +x )確認開始crond服務(service crond status/start/stop)如果看到crond is running 依舊不能執行的話,請重啟crond,依舊不行,那麼給sh檔案制定bash環境

Ajax同步請求出現瀏覽器頁面假死阻塞UI執行緒之解決方案

原始碼:function loadCheckBox(){var busVedioPosition = '';var defer = new jQuery.Deferred();$.ajax({url:rootPath + "/gis/getBusVedioPosition"

try程式碼塊中出現異常後try內程式會繼續執行還是直接丟擲異常?

@Test public void excp() { try { int i = 1/0; System.out.println(1); }catch (Exception e) { e.printStackTrace(); // TODO: hand

關於free()棧的記憶體的時無法繼續執行問題(求助)

最近學習資料結構,用C語言寫了棧的基本操作,卻發現在銷燬棧時,初始尺寸STACK_INIT_SIZE改成10,1000可以順利執行,改成100無法執行(編譯都沒問題),這讓我無法理解。下面是程式碼和執行的結果,希望有懂得朋友能幫助解釋下,是程式碼問題還是其他問題

openwrt 關閉ssh後程式繼續執行的方法(備忘)

由於開啟tcpdump來監視網路資料,要長期開著,當關閉SSH後,會出現tcpdump關閉的現象。解決方法,在openwrt中安裝screen軟體,安裝方法opkg update,opkg install screen。安裝完成後,輸入screen回車,在新的介面下,執行t

eclipse代碼中有錯誤項目中顯示紅叉

tails pen ces style pos mpi btn project trac ***修改eclipse 代碼提示級別1.單個項目修改項目上右鍵-->properties-->java compiler-->building-->enabl

AJax請求處理成功進入success的解決方案(專案遷移至springboot中出現的問題)

之前環境eclipse+ssm 執行一切ok 之後環境idea+maven+springboot 出錯 博主在出現這個問題的時候是在把ssm專案遷移成springboot中時出現的。 也就是說ssm專案中可以正常返回資料,springboot就不行了。 一般這種問

第 2 行出現錯誤:ORA-00932: 資料型別一致: 應為 DATE, 但獲得 NUMBER

問題:  SQL> insert into orderTable  2  values(21,10001,05-01-02,05-01-02);values(21,10001,05-01-02,05-01-02)                     * 第 2 行出

img標籤src引用網路圖片頁面顯示返回403錯誤網路圖片地址在瀏覽器能載入放html能顯示

在html頁面加入<meta name="referrer" content="no-referrer">標籤,就可以解決頁面載入網路圖片的問題,原因大概是網路安全的問題,別人的頁面做了安全防護的問題。<head> <meta chars