簡體   English   中英

在SConscript中使用Glob的scons錯誤

[英]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均已對此進行了測試。

我發現了許多變通辦法,但都不是完全令人滿意的。

  • 如果我將SConscript移到子目錄,則scons可以正常運行。 但是,那將需要將我的整個src樹移到一個子目錄,這感覺很混亂。
  • 如果我在運行scons之前創建目錄build ,則scons可以正常運行。 但是,這需要額外的步驟,並且空目錄在git中不能很好地發揮作用。
  • 我可以在調用SConscript之前添加一行Execute(Mkdir('build')) 但是,使用scons -n進行scons -n運行時,此方法不起作用。
  • 我可以使用plicate 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM