【问题标题】:Targets containing parent folder `..`包含父文件夹`..`的目标
【发布时间】:2019-11-11 13:38:02
【问题描述】:

如果我的 makefile 中的 preqequisite 指的是例如到%/../some.file%/../some.file 的配方没有运行。

我的 makefile 包含一个配方

dir/file:
  recipe

%/file2: %/../file
  recipe

其中 % 与 dir/subdir 匹配。如果我make dir/subdir/file2,请抱怨它知道No rule to make target dir/subdir/file2。即使我make dir/subdir/../file,它也知道No rule to make target dir/subdir/../file。但是,如果我 make dir/filemake dir/subdir/file2,一切正常。

显然,引用父目录在先决条件中有效,但在目标中无效。你知道如何解决这个问题吗?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    看起来 Make 确实将“..”字面上作为文件夹名称,但没有意识到它指的是父文件夹。因此“文件”与“子目录/../文件”不同。从技术上讲,这是真的,因为 'subdir' 可能是一个符号链接,但我找不到对此的任何引用。

    解决方法:为每个文件夹添加 helper 依赖项

    dir/%/../file: dir/file
    

    它并不完美,因为 '%' 可以匹配 dir/x1/x2/file。但根据源代码树的结构,这可能就足够了。

    我注意到以下方法会起作用:

    dir/subdir/../file: dir/file
    

    但只有在可以枚举的文件很少的情况下才会起作用。

    【讨论】: