如何表示生成两个文件的 scons 构建器?

问题描述 投票:0回答:1

我们有这个 scons 构建器,它生成两个文件 foo.asc 和 foo.pnr。有没有办法来表示呢? 例如,通过指定

suffix = [".asc", ".pnr"]
.

据我们所知,假设构建器只生成一个文件,我们不想运行构建器两次,生成两个文件两次。我认为如果一个或两个输出文件丢失,构建器只会运行一次。

pnr_builder = Builder(
    action=(
        "nextpnr-ice40 --{0}{1} --package {2} --json $SOURCE --asc $TARGET "
        "--report {3}.pnr --pcf {4} {5}"
    ).format(
        FPGA_TYPE,
        FPGA_SIZE,
        FPGA_PACK,
        TARGET,
        PCF,
        "" if VERBOSE_ALL or VERBOSE_PNR else "-q",
    ),
    suffix=".asc",
    src_suffix=".json",
)
env.Append(BUILDERS={"PnR": pnr_builder})
scons
1个回答
0
投票

我建议向您的构建器添加一个发射器。

然后,该发射器可以设置您的

TARGETS
以按特定顺序排列它们,然后您可以在构建器的命令行中使用它们。

以下是有关发射器的用户指南信息:https://scons.org/doc/production/HTML/scons-user.html#id1459

请注意,我们有一个不和谐服务器,如果您愿意,您可以在其中交互式提问。

重写。请注意,我还没有尝试过这段代码。 VERBOSE_ALL/VERBOSE_PNR 可能需要一些调整。下面的代码期望所有

FPGA_TYPE,FPGA_SIZE,FPGA_PACK,VERBOSE_ALL,VERBOSE_PNR
都是环境变量。或者在对构建器的调用中设置。 另外,我建议添加
PNR_ASC_SUFFIX
PNR_SUFFIX
作为环境变量来指定这些后缀。

另一个注意事项,此代码期望在调用此构建器时将 .asc 和 .pnr 文件名指定为目标,如果这不是合理的期望,那么您需要向此发射器添加逻辑以生成 .asc 和.pnr 后缀的文件可能来自源文件名。

def pnr_emitter(target, source, env):
    """
    Alter target list so we can predict which element of the list is .asc and which is .pnr
    """
    asc_file = None
    pnr_file = None
    for t in target:
        if t.endswith('.asc'):
            asc_file = t
        elif t.endswith('.pnr'):
            pnr_file = t
    if pnr_file and asc_file:
        target = [pnr_file, asc_file]

    return target, source

pnr_builder = Builder(
    action=(
        "nextpnr-ice40 --${FPGA_TYPE}${FPGA_SIZE} --package ${FPA_PACK} --json $SOURCE --asc ${TARGETS[1]} "
        "--report ${TARGETS[0]} --pcf ${(VERBOSE_ALL or VERBOSE_PNR) and '' or '-q'"
    ),
    src_suffix=".json",
    emitter=pnr_emitter,
)
env.Append(BUILDERS={"PnR": pnr_builder})
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.