为什么不能找到存在的路径?

时间:2014-06-20 00:46:39

标签: waf

假设我在 / 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”

3 个答案:

答案 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)

嗯,看起来我在waf-users小组论坛上找到了答案,由Nagy先生自己回答:

  

源文件必须位于顶级目录下。您   可以:

     
      
  • 创建指向源目录的符号链接
  •   
  • 将外部源文件复制到构建目录中(如果有要复制的文件夹结构,可能会导致问题)
  •   
  • 将顶部设置为常用文件夹,例如' /' (可能需要超级使用权限,所以一般来说这是一个坏主意)
  •   

结论中的建议是在配置​​步骤中将符号链接添加到外部目录。我想知道如果我在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也能找到该文件。