有沒有一種方法可以測試編譯多個作業(-jN,其中N> 1)時出現的缺失依賴關係?如何測試缺少依賴關係的Makefile?
我經常遇到包,主要是開源的,只要我使用-j1或-jN,其中構建過程工作正常,其中N是一個相對較低的值,如4或8,但如果我使用較高的值喜歡48 ,有點不尋常,它由於缺少依賴關係而開始失敗。
我試圖構建自己的bash腳本,給定目標,找出所有依賴關係,並嘗試使用-j1顯式構建每個這些依賴關係,以驗證沒有任何依賴關係缺失。它似乎可以使用小型/中型軟件包,但對於uClibc等更重要的軟件包卻失敗了。
我在這裏分享我的腳本,因爲有些人可能更好地理解我的意思是通過閱讀代碼。我也希望有一個更強大的解決方案存在並且可以共享回來。
#!/bin/bash
TARGETS=$*
echo "TARGETS=$TARGETS"
for target in $TARGETS
do
MAKE="make"
RULE=`make -j1 -n -p | grep "^$target:"`
if [ -z "$RULE" ]; then
continue
fi
NEWTARGETS=${RULE#* }
if [ -z "$NEWTARGETS" ]; then
continue
fi
if [ "${NEWTARGETS}" = "${RULE}" ]; then
# leaf target, we do not want to test.
continue
fi
echo "RULE=$RULE"
# echo "NEWTARGETS=$NEWTARGETS"
$0 $NEWTARGETS
if [ $? -ne 0 ]; then
exit 1
fi
echo "Testing target $target"
make clean && make -j1 $target
if [ $? -ne 0 ]; then
echo "Make parallel will fail with target $target"
exit 1
fi
done
我不知道確切的問題是什麼......我不認爲有一個爲詳盡比一個驗證並行正確性什麼更好的方法您已經描述過:爲每個目標運行構建並驗證它是否有效。不過,我不認爲你必須限制構建到'-j1'。如果他們在'-j1'上失敗,那麼他們肯定會在更高的'-j'上失敗,所以你不妨加快你的構建。 – MadScientist 2014-09-23 17:50:16
這對大型項目有什麼影響?它是否以實際的方式失敗或僅僅是從運行時間/手動調用角度的困難? – 2014-09-23 17:59:50
我認爲迫使'-j1'口罩儘可能多的prereq問題,因爲它迫使公開。假設prereq是按照列出的順序構建的,那麼任何'target:prereqA prereqB',其中'prereqA'依賴於'prereqB',而不會聲明失敗時使用'-j1',但可能使用'-jN'來傳遞。反轉這些先決條件的順序('prereqB prereqA')和'-j1'永遠不會失敗,但是'-jN'可能會(但是同樣可能不會,你必須確定prereq順序)。 – 2014-09-23 18:09:31