2016-02-24 67 views
0

內這是有關scons - always install after buildSCons的安裝忽略默認規格腳本

有了scons的2.3.2,我試圖讓使用SCons來安裝被內置到其預先定義的位置,而無需額外的運行命令的目標。上述鏈接中提出的解決方案對我無效。所以我試圖使用默認目標。 假設我的源代碼位於src/a,我安裝到/dst-path/a。在src/a SConscript(稱爲從父SConscript)我有:

result = env.MyBuild(some_tgt, some_src) 
env.Install('/dst-path/a', result) 

如果我輸入src/ascons -u,它建立但不安裝。如果我在相同的位置輸入scons -u /dst-path/a,它將生成並安裝。我可以添加env.Alias('install', '/dst-path/a'),然後安裝scons -u install。這在用戶指南中有所描述。但我想只運行scons -u來構建和安裝。

所以我的想法是將/dst-path/a添加到默認目標,並且只能爲可以爲該位置生成內容的位置。因此,在src/a那SConscript,我做

env.Default('/dst-path/a') 
from SCons.Script import DEFAULT_TARGETS, BUILD_TARGETS 
print "DEFAULT_TARGETS in %s is %s" % (env['MY_SOURCE_DIR'], map(str, DEFAULT_TARGETS)) 
print " BUILD_TARGETS in %s is %s" % (env['MY_SOURCE_DIR'], map(str, BUILD_TARGETS)) 
# env['MY_SOURCE_DIR'] tracks current source path and evaluates to 'src/a' in this case 

據推測,這相當於我在呼喚scons -u /dst-path/a現在我刪除/dst-path/a,運行scons -usrc/a,看到

DEFAULT_TARGETS in src is [] 
BUILD_TARGETS in src is [] 
DEFAULT_TARGETS in src/a is ['/dst-path/a'] 
BUILD_TARGETS in src/a is ['/dst-path/a'] 

- 但什麼也沒有發生! 。但是,如果我跑scons -u /dst-path/a,我看到

DEFAULT_TARGETS in src is [] 
BUILD_TARGETS in src is ['/dst-path/a'] 
DEFAULT_TARGETS in src/a is ['/dst-path/a'] 
BUILD_TARGETS in src/a is ['/dst-path/a'] 

- 現在它只是像以前一樣製造和安裝。我的代碼沒有效果。

  1. 那麼,爲什麼它完全忽略了我的默認規範,即使它甚至使它進入BUILD_TARGETS?這是一個錯誤嗎?

  2. 我怎麼會迫使SCons安裝它一步到位的東西呢?

順便說一句,不知道是否它很重要,但我也使用VariantDir從源頭分離中間文件。

+0

從您的構建的頂級文件夾中調用它時,SCons是否爲您做了正確的事情?在討論這個問題時,我們能否擺脫所有'-u'的東西?如果是,請相應編輯您的問題。它看起來好像這個問題也是相關的http://stackoverflow.com/questions/25560291/how-to-get-scons-install-to-behave-the-same-way-as-build-at-different-層次。 – dirkbaechle

+0

是的,相關 - 我正在採取另一個刺。我需要能夠構建(並安裝)一個子樹,所以我需要使用-u,-U或-D。我在這裏發佈了一個試探性的答案,但它還不令人滿意。 –

+0

如果更改爲:install_nodes = env.Install('/ dst-path/a',result)會發生什麼情況。 env.Default(install_nodes) – bdbaddog

回答

0

好吧,我已經瞭解到「-u」會影響事物。它不會構建任何默認目標,根據選項幫助(我認爲--ignore_defaults選項將是一個更好的方法,但哦...)

因此,對於SCons不忽略默認值,應該使用「-D」或「-U」。 「-D」在整個構建樹中選擇默認值,而不管當前位置如何 - 這不是我想要的。然而,「-U」表示根據當前位置設置的默認值。

現在真正的問題竟然是安裝路徑!我試過將安裝位置從/dst-path/a更改爲install/a(即在構建樹中),現在,神奇的是,一切正常!即使「-u」按預期工作(沒有額外的默認設置),安裝文件,當它不存在。如果我將安裝路徑設置爲默認值,那麼「-U」就會起作用。但通過/dst-path/a路徑,「-U」表示它找不到默認目標。如果我只改變了路徑而沒有改變,那麼它會突然發現它們並建立。

基本上,如果我在樹中安裝了路徑,從一開始就可以正常工作。但爲什麼我想要在源子樹中安裝?這是一個瘋狂的限制。我會稱這是一個錯誤。

因此,此解決方案只適用於您安裝在樹中,並且按預期工作,沒有任何欺騙。這仍然不能回答如何在樹外安裝。

......而事實並非如此。您必須在scons命令中明確調用安裝目標/路徑。一些示例如下:

scons -u /dst-path/a # as seen in manual and FAQ 
scons -u src/a  # if you have Alias('src/a', '/dst-path/a') 
         # but "scons -u" or "scons -u '.'" from src/a won't work! 

另一種說法是:當涉及到外部路徑時,行爲會有所不同。無論您在「安裝」,「別名」或「默認」中做什麼,SCons都不會在頂層路徑之外構建任何內容,直到將外部路徑(或其別名)作爲目標傳遞給scons命令爲止。這與-u/-U等無關。

+0

供參考:-u和-U之間的區別在手冊頁中有解釋。 「-U 與-u選項完全相同,除了處理默認目標的方式之外。使用此選項並且在命令行上未指定目標時,SConscript中定義的所有默認目標(s )建立在當前目錄中,而不管目標結果是以什麼目錄結束。「 – bdbaddog

+0

對於您的未解決問題的答案,您可能需要查看我們的[常見問題列表](http://scons.org/faq.html)中的「常見問題解答」中的#2,即頂部的頁面。 – dirkbaechle

+0

感謝FAQ指針!安裝問題非常受歡迎,原因很簡單 - 實施與IMO不兼容。結果完全取決於位置。雖然常見問題解答並沒有增加任何新內容。 'scons {some-absolute-path}'的例子已經在手冊中了。別名和默認示例使用子目錄。我的實驗顯示**在頂部路徑之外安裝的唯一方法是將安裝路徑作爲scons命令**中的明確參數,無論是通過Alias還是通過默認值完成。所以,我的問題的答案似乎是_「不可能」_ –