在SCons中转义替换路径

时间:2015-10-10 13:04:35

标签: scons

在Wesnoth构建的这段代码中,$ TESTFILE变量被替换为给定的路径。但是在Windows上路径变得无效,因为默认情况下,SCons subst()不会在路径中转义反斜杠。有没有办法做到这一点 - 获取带有转义反斜杠的SCons File节点的绝对文件名?或者在替换时逃避反斜杠?

test_program = '''
    #include <SDL_mixer.h>
    #include <stdlib.h>

    int main(int argc, char **argv)
    {
        Mix_Music* music = Mix_LoadMUS("$TESTFILE");
        if (music == NULL) {
            exit(1);
        }
        exit(0);
    }
\n
'''
print Environment(TESTFILE = File("data/core/music/main_menu.ogg").rfile().abspath). \
          subst(test_program)

输出:

 #include <SDL_mixer.h>
 #include <stdlib.h>

 int main(int argc, char **argv)
 {
     Mix_Music* music = Mix_LoadMUS("E:\wesnoth\scons\data\core\music\main_menu.ogg");
     if (music == NULL) {
         exit(1);
     }
     exit(0);
 }

2 个答案:

答案 0 :(得分:0)

来自python 2.7 docs的os.path.normpath怎么样??

  

os.path.normpath(path)

     

通过折叠冗余来规范化路径名   分隔符和上级引用,以便A // B,A / B /,A /./ B和   A / foo /../ B都变为A / B.这个字符串操作可能会改变   包含符号链接的路径的含义。在Windows上,它   将正斜杠转换为反斜杠。要规范化案例,请使用   normcase()。

答案 1 :(得分:0)

克隆Wesnoth repo并检查实际的构建文件后,我发现您描述的问题发生在配置环境中。这在原始问题中并未明确,并且我的第一次尝试答案无用(使用SConf.SConfBase.TryRun构建器,请参阅历史记录)。 据我所知,SCons目前没有内置选项来处理你正在寻找的双反斜杠。我现在能想到的最简洁的方法是克隆方法TryRunWithArgs(例如将其命名为AddTest()),使其接受其他程序参数,并使用{{1}}将其添加到配置上下文中然后重写测试程序,使其接受文件名作为第一个参数。