2012-07-19 38 views
3

默認情況下,SCons似乎查看用於構建程序的「配方」,並從中提取隱式依賴關係。例如,假設我的SConstruct包含:如何讓SCons忽略來自命令操作的隱式依賴關係?

Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

而且我已經構建了'foo'('foo'是最新的)。 現在我改變SConstruct(或更實際地,通過不同的選擇),以使得關於「富」的命令變爲:

Command('foo', 'foocreator.py', '/usr/bin/qrsh -V -cwd /usr/bin/python foocreator.py > foo') 

(換言之,潤透所述SGE腳本foocreator.py) 現在SCons的嘗試重建foo,--debug = explain告訴我這是因爲「/ usr/bin/qrsh的新依賴」和「對/ usr/bin/python的依賴關係」)。

如何防止對配方中的依賴關係進行推斷,最好是全局性的?到目前爲止,我還沒有找到這種行爲的規範。我不想說明'foo'並不是真的依賴python或qrsh,因爲我必須爲每個目標以及這些程序的每個可能位置都做這件事。必須有一個「正確」的方式。

編輯:我現在也嘗試過明確將忽略每一個目標,如:

Ignore('foo', '/usr/bin/python') 
Ignore('foo', '/usr/bin/qrsh') 

,甚至這也不行! SCons仍然希望在我通過qrsh進行切換時重建所有內容,而不是。

+0

SCons是否總是試圖重建foo,或者在改變Command()動作之後?如果它只是在改變動作之後,那對我來說這聽起來很合理。 – Brady 2012-07-19 15:57:56

+0

@Brady只有當動作「改變」時。即使環境發生變化,使用不同版本的python(或gcc,或其他),它也會這樣做。我同意這種行爲在許多情況下是有用的,我只想知道如何關閉它。 – Joe 2012-07-19 16:24:03

回答

1

我發現了記錄的解決方案:有一個構造變量IMPLICIT_COMMAND_DEPENDENCIES,它完全控制這種行爲。它被記錄在http://www.scons.org/doc/HTML/scons-man.html(但我通過搜索scons源代碼發現它!)

因此,這給了我想要的行爲基於我的原始示例。

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ...) 
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

(或)

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ...) 
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

我能爲目標 '富' 的兩個定義之間進行切換和scons的也不會想到foo是過時的。

0

林不知道這是否會幫助,但如下這將是更好的做法,改變你的操作字符串:

actionStr = '/usr/bin/qrsh -V -cwd /usr/bin/python $SOURCE > $TARGET' 
Command(target = 'foo', source = 'foocreator.py', action = actionStr) 

SCons的可能無法確定什麼是從操作字符串的源和目標並可能會感到困惑。

可能無法關閉您在上述註釋中建議的行爲,但不必使用自己的構建器,而應使用Ignore()Depends()函數嘗試微調該行爲。最壞的情況是通過調用一個在內部執行qrsh和python的shell腳本來有效地使action字符串不變。

+0

我很確定這和我的例子相同 - 你只是給出命名參數而不是位置參數。 (並使用$ SOURCE和$ TARGET這只是方便 - 在我的真正SConstruct中,名稱是以編程方式構建的,在配方中沒有文件名的硬編碼)。 – Joe 2012-07-19 16:21:59

+0

@Joe,我總是默認命名的參數,並沒有暗示它會有所作爲,顯然它不會:)我的答案的重點是在動作中使用SOURCE和TARGET。就像我在答案中提到的那樣,我不確定它是否會有所幫助,但我認爲這值得一試。我在答案中添加了解決方法。它不會真的關閉行爲,但應該工作。 – Brady 2012-07-19 19:38:37

3

的事情是,scons的做動作的一些最起碼的分析,以確定您所呼叫的,免得

python $SOURCE > $TARGET 

自動添加一個依賴於蟒蛇。它還包括動作的md5中的動作TEXT。所以,如果你把它改爲

anotherprog -cmd python $SOURCE > $TARGET 

它會檢測3個變化:

  1. 取消了對Python的依賴
  2. 增加依賴於anotherprog
  3. 改變了命令行

這是半合理的,因爲如果你改變另一個程序,你應該可以重建。

可以停止scons的通過包括在 '$(' 和 '$)' 的非重要比特檢測命令行的變化,因此改變

anotherprog $(-date $TIME $) $SOURCE > $TARGET 

anotherprog $(-time $DATE $) $SOURCE > $TARGET 

不會引起重建。

所以,如果你有

$(python $) $SOURCE > $TARGET 

$(anotherprog =cmd python $) $SOURCE > $TARGET 

它會做什麼你want.But我還沒有試過,我猜。