假设我在 / mydir / a / b 中有 x.y 文件(在Linux上)
当我运行waf时,它找不到该文件。
def configure(context):
pass
def build(build_context):
build_context(source='/mydir/a/b/x.y',
rule='echo ${SRC} > ${TGT}',
target='test.out')
结果:未找到来源:bld中的'/mydir/a/b/x.y'(features = [],idx = 1,meths = ['process_rule','process_source' ] ......
好吧,也许你想要一条相对路径,Waf?而你没有告诉我?
def build(context):
path_str = '/mydir/a/b'
xy_node = context.path.find_dir(path_str)
if xy_node is None:
exit ("Error: Failed to find path {}".format(path_str))
# just refer to the current script
orig_path = context.path.find_resource('wscript')
rel_path = xy_node.path_from(orig_path)
print "Relative path: ", rel_path
结果:错误:无法找到路径/ mydir / a / b
但该目录存在!怎么了?
顺便说一下,某些子目录(它可以找到)的相对路径是一次性的。例如当前目录下的a / b导致相对路径“../a/b”。我期待“a / b”
答案 0 :(得分:1)
通常,每个上下文中至少有两个节点对象: - path:指向wscript的位置 - root:指向文件系统根目录
因此,在您的情况下,解决方案是使用context.root
:
def build(context):
print context.path.abspath()
print context.root.abspath()
print context.root.find_dir('/mydir/a/b')
答案 1 :(得分:0)
源文件必须位于顶级目录下。您 可以:
- 创建指向源目录的符号链接
- 将外部源文件复制到构建目录中(如果有要复制的文件夹结构,可能会导致问题)
- 将顶部设置为常用文件夹,例如' /' (可能需要超级使用权限,所以一般来说这是一个坏主意)
结论中的建议是在配置步骤中将符号链接添加到外部目录。我想知道如果我在Linux和Windows上都需要它,那将是如何工作的......
答案 2 :(得分:0)
只需将Node传递给复制规则,而不是传递表示路径的字符串:
def build(build_context):
source_node = build_context.root.find_node('/mydir/a/b/x.y')
build_context(source=source_node,
rule='echo ${SRC} > ${TGT}',
target='test.out')
即使在顶级目录之外,Waf也能找到该文件。