我们有这个 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})
我建议向您的构建器添加一个发射器。
然后,该发射器可以设置您的
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})