簡體   English   中英

在scons中創建SConscript對象

[英]creating SConscript objects in scons

我在json文件中指定了我的項目目標(二進制文件和庫)。

我可以為指定目標創建環境,而不會出現任何問題。 現在,我正在嘗試支持特定的構建目錄。

我對scons的了解仍然很基礎,但似乎正確的方法是將SConscript與VariantDir一起使用。 但是我已經在json中指定了我的目標,並且為每個目標創建一個SConscript文件將是多余的(加上維護成本)。

所以我的問題是:是否可以在運行時動態創建SConscript對象?

提前致謝。

您可以使用VariantDir()函數或在SConscript()調用中指定構建目錄。 這里討論了所有不同的選項。 考慮到你不想使用幾個SConstruct文件,你應該只使用VariantDir()函數更詳細的描述在這里

這是一個簡單的示例:

env = Environment()

# It may be as simple as setting src_dir='.', but set accordingly
# duplicate=0 tells SCons NOT to copy source files to variantDir, set accordingly
# VariantDir() can be called multiple times so as to change dirs per builder call
VariantDir(variant_dir = 'pathToBuildDir', src_dir = 'pathToSource', duplicate=0)
# Now call the builders here

仍然不清楚為什么要將JSON與SCons混合使用。 除非您有非常令人信服的理由,否則建議將其全部保存在SCons(Python)中。

編輯:我剛剛意識到你問有關創建一個SConscript對象,而不是一個文件。

我瀏覽了SCons編程API,沒有找到任何可以創建SConscript對象的東西。 實際上,我認為SConscript對象的概念不存在,因為它只是將對SConscript()函數的調用視為需要打開和處理的文件,並且幾乎將它們視為SConstruct的擴展。

因此,總結一下:您要么必須創建輔助SConscript文件,要么使用對VariantDir()的調用。 根據您的項目目錄結構,可能沒有必要創建SConscript文件。 您可以從根SConstruct進行所有操作。 沒有必要的SConscript文件,它們只是有助於更好地組織構建腳本。

VariantDir不能與SConscturct文件一起使用(可能是我錯了,但是我找不到任何方法來執行此操作)。 只需創建帶有變體dir的SConscript文件並執行所需的操作即可。

#SConsruct
env = CreateEnvironment()
SConscript('SConscript', variant_dir = 'mybuilddir', exports = 'env', duplicate = 0)

# Do all work in SConscript
Import('env')
env.Program(...)
env.SharedLibrary(...)
...

另外,您可以將過程分為2個狀態。 狀況1 - 生成SConscript文件。 狀態2-運行生成的SConscript文件。

if 'generate' in COMMAND_LINE_TARGETS:
  # your code to generated SConscript from json
  Exit(0)

sconscriptFiles = getSconscriptFiles() # some code to get your sconscript, by mask for example
if len(sconscriptFiles) < 1:
    print "You need to generate files at first: scons generate"
    Exit(1)
for file in sconscriptFiles :
   SConscript(file, variant_dir = 'build' + file, duplicate = 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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