代码之家  ›  专栏  ›  技术社区  ›  07_05_GuyT

为父名称动态创建文件夹

  •  0
  • 07_05_GuyT  · 技术社区  · 6 年前

    我需要根据父目录创建dir

    例如:

    如果我喜欢以下项目

    project1
    -File1
    -Makefile
    

    在make文件中,我想执行如下操作

    mkdir project1

    然后看起来应该是

    project1
    -File1
    -Makefile
    -project1
    

    但我想动态地做。 mkdir parent folder ,因为假设在makefile中 不知道 父文件夹的名称是什么。有可能吗?它应该是具有父文件夹名称的空文件夹。

    作为先决条件,它应该始终有一个父文件夹

    我尝试了以下建议:

    all: build
    
    build:
        mkdir $(basename "$PWD")
    

    这创建了以下内容:

    project1
    -File1
    -Makefile
    -WD
    

    WD ,这是错误的,应该是 project1

    1 回复  |  直到 6 年前
        1
  •  2
  •   Renaud Pacalet    6 年前

    我假设:

    1. 你只有“ 合理的 “文件名和目录名没有空格、特殊字符甚至更糟。如果你命名你的makefile“ my favorite make file

    / 文件系统或 不 像话 “文件名和目录名。把它放在Makefile的开头,在任何 include

    DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
    BASE := $(notdir $(patsubst %/,%,$(DIR)))
    DIRNAME := $(DIR)$(BASE)
    

    接下来,您需要创建子目录而不出错,即使它已经存在:

    $(DIRNAME):
        mkdir -p $@
    

    $@ $(DIRNAME) 在这种情况下,强烈建议尽可能使用这些自动变量。别忘了 -p 选项,否则如果子目录存在,则配方将失败。

    最后,必须确保在实际需要子目录之前执行命令。例如,假设你有一个 all 但您希望子目录在构建 目标。您可以编写一个简单的依赖关系:

    all: $(DIRNAME)
        <all-recipe>
    
    $(DIRNAME):
        mkdir -p $@
    

    但在这种情况下,每次修改子目录的内容时,都将重建 全部的 目标,可能是无用的。这就是 order-only prerequisites 是有用的。它们必须存在,但make不考虑它们的最后修改日期。

    DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
    BASE := $(notdir $(patsubst %/,%,$(DIR)))
    DIRNAME := $(DIR)$(BASE)
    
    all: | $(DIRNAME)
        <all-recipe>
    
    $(DIRNAME):
        mkdir -p $@
    

    注意 |

    有关生成要创建的子目录的名称的说明:

    1. 可以从其他目录调用make:

      make -C <path-to-project>
      make -f <path-to-project>/Makefile
      

      所以, $(shell basename "$$PWD") $(notdir $(PWD)) )只有在从Makefile所在的目录调用make时,它才起作用。获取Makefile的绝对路径的正确方法是 $(abspath $(lastword $(MAKEFILE_LIST))) . 记得把它放在任何 包括 指令。扩展结果示例: /home/john/project1/Makefile .

    2. $(dir <some-path>) 只保留目录部分,删除文件部分。例子: /home/john/project1/ .

    3. $(patsubst %/,%,<some-path>) / /home/john/project1 .

    4. $(notdir <some-path>) / . 例子: project1 .

    /主页/john/project1/Makefile /主页/约翰/项目1 具有 make -C make -f ,的 DIR BASE DIRNAME 变量将展开为:

    DIR: /home/john/project1/
    BASE: project1
    DIRNAME: /home/john/project1/project1
    
    推荐文章