[英]scons error using Glob in SConscript
我一直遇到一個相當奇怪的錯誤,涉及在SConscript中使用scons函數Glob
。 我的實際構建腳本更加復雜,但是我將其范圍縮小到以下最小示例。
在基本的SConstruct中:
SConscript('SConscript',
variant_dir='build')
然后,在SConscript中:
Glob('*.cc')
這將退出,並顯示錯誤消息TypeError : Tried to lookup Dir 'build' as a File.
v2.1.0和v2.3.0均已對此進行了測試。
我發現了許多變通辦法,但都不是完全令人滿意的。
build
,則scons可以正常運行。 但是,這需要額外的步驟,並且空目錄在git中不能很好地發揮作用。 Execute(Mkdir('build'))
。 但是,使用scons -n
進行scons -n
運行時,此方法不起作用。 duplicate=False
調用SConscript,以防止發生錯誤。 但是,據我了解的文檔,這可能會導致生成錯誤,具體取決於包含文件的位置。 我四處摸索,但並沒有真正理解問題的根本原因。 有沒有解決這個問題的解決方案?
編輯:有人要求我添加我的意圖的其他詳細信息,而不僅僅是導致錯誤消息的代碼。 我正在嘗試制作一個用於同時交叉編譯linux可執行文件和Windows可執行文件的構建文件。
首先,在SConstruct中設置編譯環境。
import os
win32 = Environment()
win64 = Environment()
linux = Environment()
#Define the working directory
win32['SYS'] = 'win32'
win64['SYS'] = 'win64'
linux['SYS'] = 'linux'
#Define the compilers
win32.Replace(CXX='i686-w64-mingw32-g++')
win64.Replace(CXX='x86_64-w64-mingw32-g++')
#Define the appropriate file formats
win32.Replace(SHLIBPREFIX='')
win32.Replace(SHLIBSUFFIX='.dll')
win32.Replace(PROGSUFFIX='.exe')
win32.Append(LINKFLAGS='-static')
win64.Replace(SHLIBPREFIX='')
win64.Replace(SHLIBSUFFIX='.dll')
win64.Replace(PROGSUFFIX='.exe')
win64.Append(LINKFLAGS='-static')
for env in [win32,win64,linux]:
build_dir = os.path.join('build',env['SYS'])
exe = SConscript('SConscript',
variant_dir=build_dir,
exports=['env'])
然后,在SConscript中具有實際的構建規則。
Import('env')
env.Append(CPPPATH=['include'])
for main in Glob('*.cc'):
env.Program([main, Glob('src/*.cc')])
當使用scons -n
調用時,這將顯示上面顯示的錯誤消息。
您的問題是您正在使用variant_dir將構建文件夾“鏈接”到“”。 作為您的源目錄。 結合默認的“ duplicate = 1”選項,這意味着SCons嘗試將所有源復制到“ build”中,但是后者也是源文件夾的一部分。 這為各種復雜性和循環依賴性打開了大門。
干凈的解決方案是將所有源代碼放入它們自己的子目錄中,例如“ src”,以便您可以將包含的SConscript引用為
SConscript('src/SConscript', variant_dir='build')
這將使正確的事情發生。 這是首選設置,即使您不喜歡此約定,也應采用此約定,以免您日后頭疼。
附加提示:您可以(並且應該)通過使用節省一些啟動時間
win32 = Environment()
win64 = win32.Clone()
linux = win32.Clone()
代替
win32 = Environment()
win64 = Environment()
linux = Environment()
。 在后一種情況下,您將迫使SCons連續三遍搜索系統中的編譯器/工具...只需執行一次,然后將clone()復制到不同的環境,並使用特定於構建的設置進一步修飾它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.