使用 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 并找到包含的文件。
我需要修复 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 并找到包含的文件。