如何在makefile中写入'cd'命令?

例如,我在我的makefile中有这样的东西:

all:
     cd some_directory

但是当我输入make我只看到'cd some_directory',就像在echo命令中一样。


它实际上正在执行命令,将目录更改为some_directory ,但是,这是在子进程shell中执行的,并且不影响make和您正在使用的shell。

如果您希望在some_directory执行更多任务,则需要添加一个分号并附加其他命令。 请注意,您不能使用换行符,因为它们被make解释为规则的结尾,因此为清晰起见使用的任何换行符都需要使用反斜杠进行转义。

例如:

all:
        cd some_dir; echo "I'm in some_dir"; 
          gcc -Wall -o myTest myTest.c

还要注意,即使添加反斜杠和换行符,每个命令之间也需要分号。 这是由于整个字符串被shell解析为一行。 如注释中所述,您应该使用'&&'来连接命令,这意味着只有在前面的命令成功时才会执行它们。

all:
        cd some_dir && echo "I'm in some_dir" && 
          gcc -Wall -o myTest myTest.c

这在执行破坏性工作(如清理)时尤其重要,因为如果cd出于任何原因失败,您将会破坏错误的东西。

尽管如此,通常的做法是在子目录中调用make,您可能需要查看这些信息。 这里有一个命令行选项,所以你不必自己调用cd ,所以你的规则看起来像这样

all:
        $(MAKE) -C some_dir all

它将变成some_dir并在目标“all”中执行Makefile 。 作为最佳实践,使用$(MAKE)而不是直接调用make ,因为它会小心地调用正确的make实例(例如,如果您为构建环境使用特殊的make版本),并提供使用某些开关运行时稍有不同的行为,如-t

对于记录来说,即使它没有输出,也就是你所看到的,始终会回应它执行的命令(除非明确禁止)。


GNU make 3.82 ,您可以使用.ONESHELL特殊目标在shell的一个实例中运行所有配方行(粗体突出显示):

  • 新的特殊目标: .ONESHELL指示make调用shell的单个实例并为其提供整个配方 ,而不管它包含多少行。 [...]
  • .ONESHELL:
    all:
        cd ~/some_dir
        pwd # Prints ~/some_dir if cd succeeded
    

    这是处理目录和制作的可爱技巧。 而不是使用多行字符串,或“cd;” 在每个命令上,定义一个简单的chdir函数,如下所示:

    CHDIR_SHELL := $(SHELL)
    define chdir
       $(eval _D=$(firstword $(1) $(@D)))
       $(info $(MAKE): cd $(_D)) $(eval SHELL = cd $(_D); $(CHDIR_SHELL))
    endef
    

    那么你所要做的就是按照你的规则调用它:

    all:
              $(call chdir,some_dir)
              echo "I'm now always in some_dir"
              gcc -Wall -o myTest myTest.c
    

    你甚至可以做到以下几点:

    some_dir/myTest:
              $(call chdir)
              echo "I'm now always in some_dir"
              gcc -Wall -o myTest myTest.c
    
    链接地址: http://www.djcxy.com/p/61433.html

    上一篇: How do I write the 'cd' command in a makefile?

    下一篇: gcc makefile error: "No rule to make target ..."