亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 SCons 的 VariantDir 和 Repository 使用自定義生成器進行構建

使用 SCons 的 VariantDir 和 Repository 使用自定義生成器進行構建

慕的地8271018 2021-12-29 20:01:35
我有一個幾乎可以工作的 SConstruct 文件。我目前沒有使用任何 SConscript 文件,并且希望我的源存儲庫中不需要任何文件(git,而不是 SCons)??焖倏偨Y——我的問題發生在更改一些參數時,然后返回到之前的參數,重新構建相同的文件。我跑去scons -f Builder_repo/SConstruct 'NameOfTargetLibrary.b'建立一個圖書館,NameOfTargetLibrary.b從NameOfTargetLibrary.src.<lib>.b 應該放置在取決于各種標志(調試/發布、32/64 位、平臺(來自列表))的位置,如下所示:topdir|\-- Builder_repo (containing SConstruct, site_scons\...)|\-- Lib1 (contains lib1.src, bunch of source files)|\-- Lib2 (lib2.src, lib2 sources)\--- BuiltLibs     |\-- Windows     |    |\-- Release_32     |    |    |\-- lib1.b     |    |    |\-- lib2.b     |    |    \--- libn.b     |    |\-- Debug_64     |    |    |\-- lib1.b     |    |    |\-- lib2.b     |    |    \--- libn.b     |    \--- (Debug_32, Release_64)     \--- (etc, other targets, currently just one)命令行類似于(為了可讀性分成多行,但在 SCons/cmdLine 中只有一行)"abspath to exe" "static path and args" --x64 --     "abspath(lib1.src)" "abspath(BuiltLibs)"    "abspath(BuiltLibs/Windows/Release_64)"     "flags for debug/release, target, bitness"“工作” SConstruct 使用具有以下內容的工具generate(env):構建目標目錄(例如BuiltLibs\Windows\Release_32)存儲在env.搜索.src文件獲取包含目錄(使用os.path.dirname)添加 env.Repositories(dirname(lib.src))tgt = env.BLDR(<TARGETDIR>/lib.b, lib.src)env.Alias(lib.b, tgt)然后構建器使用發射器將source任何依賴的<TARGETDIR>/libx.b文件添加到列表中lib.src(從源文件中讀取)。libx.b如果更可取,這些可以改為添加嗎?生成器解析輸入目標和源列表以形成命令行,并返回該命令行。使用當前配置,目標和源都是相對路徑,因此可能Repository不需要調用。
查看完整描述

1 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

正如評論中簡要描述的那樣,重建的原因是使用Decider('make')(即通過時間戳檢查)與源文件的有效全局匹配來捕獲自動生成的文件。


scons --debug=explain按照 bdbaddog 在問題評論中的建議運行時,很容易看到這一點。


雖然有點脆弱,但最簡單的解決方案是修改發射器,留下以下內容(見--->標記):


def _ppl_emitter(target, source, env):

    """ Appends any dependencies found in the .mk file to the list of sources.

        The target should be like [<SD>/A.lvlibp], 

        and the source should be like [<src>/A.lvlib]

    """

    if not source:

        return target, source

    exts_tuple = tuple(env['SRC_EXTS'].split(' '))

    src_files = _get_other_deps(source, exts_tuple)

--->filtered_files = list(filter(lambda x: "Get PPL Version.vi" not in x, src_files))

    if __verbose:

        _print_info("Adding " + str(filtered_files) + " as dependencies")

    env.Depends(target, filtered_files)

    depsList, nodeDepsList = _get_ppl_deps(str(source[0]), env)

    if nodeDepsList:

        source += [os.path.normpath(os.path.join(env['LV_Dirs'].storageDir, str(pplNode))) for pplNode in nodeDepsList]

    return target, source

通過刪除此文件,目標不再顯式依賴生成的文件(這與 Decider 調用無關)。


此外,Decider('make')從 SConstruct 文件中刪除該行允許刪除和重新下載整個源存儲庫,而不會觸發重建。


作為旁注,特定于 Git 的代碼也被刪除并放置在由 Builder 調用的代碼中 - 這樣,它另外(為了減少代碼收益)僅在需要重建時調用(而不是每次都調用) SCons 運行)。


查看完整回答
反對 回復 2021-12-29
  • 1 回答
  • 0 關注
  • 404 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號