2014-01-17 63 views
1

所以我的代碼在Makefile.am文件(automake的)這個片段:一個Makefile裏的命令中指定的變量目標

RUNNER = \ 
    for asm in $${TEST_ASSEMBLIES}; do \ 
      echo -e "Running tests on $${asm}..."; \ 
      $(ENV_OPTIONS) $(NUNIT_CONSOLE) -nologo -noshadow $$asm; \ 
      echo $$?; \ 
    done 

test: 
    @pushd $(DIR_BIN) &>/dev/null; \ 
    export TEST_ASSEMBLIES="$(TEST_ASSEMBLIES)"; $(RUNNER); \ 
    popd &>/dev/null; 

聲明echo $$?;作品:它打印0的測試工作時和1時,失敗。

但我想要做的是有一個全局變量稱爲GLOBAL_EXIT_CODE什麼的,這將有0,如果所有的測試運行良好,或1如果測試的任何失敗。但在我的生活中,我甚至無法在變量中捕捉到$$?的值。我已經嘗試了很多東西:導出,通過簡單的「VAR = $$?」分配,還有+=運算符......等等。 :(

我想有一個變量GLOBAL_EXIT_CODE的原因是這樣我就可以在test目標做exit $GLOBAL_EXIT_CODE,以防其值大於零,纔能有命令make test返回一個錯誤。

+0

爲什麼不使用automake的內置測試套件支持? – DanielKO

+0

你能詳細說明一下嗎?給出一個URL記錄的地方? – knocte

+1

手冊在這裏:http://www.gnu.org/software/automake/manual/html_node/Tests.html它可能是簡單地指定一個'TESTS'變量(而不是'TEST_ASSEMBLIES')的問題,自定義'LOG_DRIVER'或'LOG_DRIVER'(可能是你的'RUNNER')。 – DanielKO

回答

3

你不能這樣做,你必須記住配方運行在調用的shell中。這是一個獨立的進程,不在make過程中。 shell(一個子進程)可以改變make(父進程)的任何方面,比如設置一個make變量shell退出,它所擁有的所有信息都已丟失。唯一能讓shell恢復的是最終的退出代碼;這就是決定命令是成功還是失敗的方法。

要做到這一點的唯一方法是將值寫入文件,然後使讀取文件並將結果值放入make變量中。

ETA:

但是,如果你想要做的是保持在殼體內的退出代碼(如您的編輯說的),那麼你並不需要一個make可變的。你需要一個shell變量,這很容易。另外請注意,make總是調用/bin/sh這是一個POSIX shell,而pushdpopd是bash shell的特性,所以這個makefile是不可移植的。幸運的是,無論如何,pushdpopd沒有任何意義,因爲工作目錄(在POSIX系統中)是單個進程(本例中爲shell)的一個功能,因此在shell中進行的任何目錄更改僅影響該shell並在殼退出時消失。

因此,嘗試這樣的事情:

RUNNER = \ 
    RETURN=0; \ 
    for asm in $${TEST_ASSEMBLIES}; do \ 
     echo -e "Running tests on $${asm}..."; \ 
     $(ENV_OPTIONS) $(NUNIT_CONSOLE) -nologo -noshadow $$asm \ 
      || RETURN=$$?; \ 
    done 

test: 
     @export TEST_ASSEMBLIES="$(TEST_ASSEMBLIES)"; \ 
     $(RUNNER); \ 
     exit $$RETURN 

我真的不明白爲什麼你的shell變量TEST_ASSEMBLIES設置爲使變量$(TEST_ASSEMBLIES)的價值。這不是必要的,但它會起作用。

+0

已編輯的問題添加關於GLOBAL_EXIT_CODE動機的信息 – knocte

+0

好的謝謝,它的工作原理 – knocte

1

我正在將我的評論擴展爲答案;這是解決問題的automake方法,因爲另一個答案着重於簡單的make。

假設你TEST_ASSEMBLIES是可以在單機方式運行的程序列表:

TESTS = $(TEST_ASSEMBLIES) 

完成。做一個make check,你應該看到測試的總結。默認情況下,automake將使用自己的測試驅動程序,它運行每個測試,將輸出重定向到日誌文件,並打印出摘要。

如果需要通過特殊的程序來運行測試,使用LOG_COMPILER變量:

TESTS = $(TEST_ASSEMBLIES) 
LOG_COMPILER = $(NUNIT_CONSOLE) 
AM_LOG_FLAGS = -nologo -noshadow 

如果您需要設置環境變量(是什麼ENV_OPTIONS呢?),你可以使用AM_TESTS_ENVIRONMENT爲那。