代码之家  ›  专栏  ›  技术社区  ›  kenorb

如何在Makefile中输入父目录?

  •  1
  • kenorb  · 技术社区  · 7 年前

    我有以下信息 Makefile (GNU Make 3.81):

    CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
    
    all:
            pwd
            cd "$(CWD)/.."
            pwd
            cd ".."
            pwd
    

    以下是输出:

    $ make
    pwd
    /Users/kenorb/temp/foo
    cd "/Users/kenorb/temp/foo/.."
    pwd
    /Users/kenorb/temp/foo
    cd ".."
    pwd
    /Users/kenorb/temp/foo
    

    看来 cd '正在通过发送到父目录 .. 没有任何效果。

    如何将当前工作目录更改为相对于的父目录 生成文件 文件

    1 回复  |  直到 5 年前
        1
  •  3
  •   kenorb    7 年前

    这个问题与以下事实有关:规则配方的每一行都是在一个专用的shell实例中执行的(即:一个新进程)。所以,跑步 cd 在一行中,不会对另一行中的命令产生任何影响,因为这些命令由不同的进程执行。

    更改配方的工作目录

    您可以使用 .ONESHELL (GNU Make 3.82或更高版本)在同一个shell实例中运行所有配方行:

    CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
    
    .ONESHELL:
    all:
            pwd
            cd "$(CWD)/.."
            pwd
            cd ".."
            pwd
    

    或者将所有命令保持在一行中:

    CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
    
    all:
            pwd; cd "$(CWD)/.."; pwd; cd ".."; pwd
    

    工作目录的更改生效 仅限内部 那个食谱。


    请注意,更改 当前工作目录 在调用的shell的makefile中 make 不可能,因为这是进程的属性,并且 制作 将执行的实例 cd光盘 是另一个(子)过程。因此,它只会更改该子流程的工作目录。

    这也是您无法通过执行脚本来更改shell的工作目录的原因 采购 它:因为脚本在一个新的shell实例(即:子进程)中运行。