使用 SCons 动态重新创建包含文件

Dynamically Recreate Include File With SCons

我需要修复 SCons 项目,其中包含文件由 SCons 动态生成。我创建了一个简单的例子来说明这个问题。 SConstruct 看起来像这样:

current_time = Command("current_time.h",
                       None,
                       "echo '#define CURRENT_TIME' `date +%H%M` > $TARGET")
test = Program("test", "test.cpp", current_time)
# AlwaysBuild(current_time)

test.cpp:

include <iostream>
#include "current_time.h"
int main() {
    std::cout << "the time is: " << CURRENT_TIME << std::endl;
}

SCons 不会在时间改变时重建项目,因为它不是魔法。解决它的一种方法是将 AlwaysBuild(current_time) 添加到 SCons 文件。

在实际项目中,用AlwaysBuild重建include文件的开销比较大,每天只需要重建一次,因为没有时间,只有日期会变。那么,如何实现文件每天只重新生成一次呢?

解决方案: 我创建了一个函数,returns 生成的包含文件的内容:

def include_file_contents():
    ...
    return file_contents  # str

然后我在依赖项中用Value(include_file_contents())替换了None

    current_time = Command("current_time.h",
                       Value(include_file_contents()),
                       "echo '#define CURRENT_TIME' `date +%H%M` > $TARGET")

像这样的东西应该可以工作:

import time
now=time.strftime("%H:%M",time.localtime())
current_time = Command("current_time.h",
                       Value(now),
                       "echo '#define CURRENT_TIME' %s > $TARGET"%now)
test = Program("test", "test.cpp") 

您不必将 current_time.h 作为来源。 SCons 将扫描 test.cpp 并找到包含的文件。