2012-03-21 138 views
7

我們正在評估scons作爲一個構建系統,並且我的問題適應了我們的舊系統。在我們的一些源代碼子目錄中,我們有一個「sources.lib」文件,它列出了爲編譯該目錄的目標庫而需要編譯的C++文件的名稱。但是,在同一個目錄中還有其他C++文件,所以我不能只用Glob()來找到合適的文件。scons是否知道SConscript文件位於哪個目錄?

如何找出SConscript文件所在的目錄? os.getcwd()總是返回構建目錄。即使文檔聲明SConscript中的路徑與源目錄相關(否則Glob('* .cpp')將不起作用),只是執行open('sources.lib')失敗,因爲它尋找文件在構建目錄中。最後,該SConscript文件中的構建環境不包含實際的當前源目錄。

編輯this reply它看起來像

File('sources.lib').srcnode().abspath 

返回正確的文件名和目錄,,如果它存在,它不會告訴你(必須使用os.path.isfile爲)。它也出現

Dir('.').srcnode().abspath 

會告訴你在哪裏SConstruct文件駐留。

當定義它的源文件編譯爲一個庫,我不希望使用

lib = env.SharedLibrary('mylib', Glob('*.cpp')) 

而是寧願構造函數,對於「sources.lib的存在首先檢查「如果它不存在,請使用globbing。所以我定義我的圖書館,像這樣

lib = env.SharedLibrary('mylib', env.getSources('*.cpp')) 

,使一個功能讀取該文件,如果它存在

def getSources(self, pattern): 

    # list of source files to assign to a target 
    sources = [] 
    # srcFile = 'sources.lib' # failed 
    # srcFile = os.path.join(os.getcwd(), 'sources.lib') # failed 
    srcFile = File('sources.lib').srcnode().abspath # works 

    # look for sources.lib 
    try: 
     infile = open(srcFile,'r') 
    except IOError: 
     #print "Globbing to get sources" 
     sources = Glob(pattern, strings=True) 
    else: 
     #print "Reading sources.lib" 
     for line in infile.readlines(): 
      line = line.rstrip('\n\r') 
      if line != '': 
       sources.append(line) 

    return sources 

buildEnv.AddMethod(getSources)

這似乎是工作。我不知道File.srcnode()。abspath直到今天。

+0

要確定文件是否存在,你可以使用os.path.exists() – Brady 2012-03-21 14:46:47

+0

我不明白你的問題,建立小例子說明吧。 – Torsten 2012-03-21 14:50:38

+0

你的問題救了我:)'Dir('。')。srcnode()。abspath'爲我工作。我使用這個選項'env.SConscriptChdir(0)'來避免目錄「幻燈片」。謝謝! – Destroyica 2013-10-29 16:23:09

回答

2

有在SCons的3種類型的路徑:

  1. 相對於根SConstruct前面加上 '#' 的路徑
  2. 相對於SConscript不使用 '#'。
  3. 絕對路徑。我認爲這是不言自明的:)

如果您需要處理,其中SConscript是,你應該使用「#」

應該是雙向的在這個例子中,目錄之外的路徑,但與 '#' 路徑似乎更加明確,更加直觀的對我說:

./SConstruct 
./dirA/SConscript - use '#dirA/sources.lib' OR 'sources.lib' 
./dirB/SConscript - use '#dirB/sources.lib' OR 'sources.lib' 

希望這有助於

布雷迪

+0

根據文檔,默認相對路徑是curretn SConstruct文件,而不是執行scons的地方。 – 2012-03-22 14:15:00

+0

你說得對,我也只是測試過。對不起,我會糾正我的答案。我曾經遇到過一個問題,並且確信它與scons被執行的地方相關,例如,如果你在一個子目錄中並使用'scons -u',但看起來並非如此。感謝您的更正。 – Brady 2012-03-23 08:38:01

+1

但是,與當前調用構建器的SConscript相比,* current * SConscript呢?在我的情況下,我試圖設置許多子模塊使用的公共環境 - 這包括在當前SConscript目錄中添加一個include /'dir到CPPPATH。 – 2014-12-26 11:07:01

4

我使用下面的代碼:

this_sconscript_file = (lambda x:x).func_code.co_filename 
code_base = os.path.dirname(this_sconscript_file) 
+0

不'os.path.dirname(__ file __)'做同樣的事情嗎? – tutuca 2013-07-26 16:58:34

+2

不,因爲scons以某種方式包含SConscript,即使在包含的腳本中,__file__也始終引用根腳本。 – olpa 2013-07-26 20:33:53

+0

良好的解決方法。我仍然認爲'Dir('。')。srcnode()。abspath'是更好的解決方案。 – gg349 2014-05-11 13:58:07

相關問題