我有几个makefile在应用程序特定的目录,像这样:

/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile

每个Makefile都在这个路径中包含一个.inc文件:

/project1/apps/app_rules.inc

app_rules内部。inc .我正在设置我想要在构建时放置二进制文件的目的地。我希望所有二进制文件都在它们各自的app_type路径中:

/project1/bin/app_typeA/

我尝试使用$(CURDIR),像这样:

OUTPUT_PATH = /project1/bin/$(CURDIR)

但相反,我得到了二进制文件埋在整个路径名,像这样:(注意冗余)

/project1/bin/projects/users/bob/project1/apps/app_typeA

我能做些什么来获得执行的“当前目录”,以便我可以知道app_typeX,以便将二进制文件放在各自的类型文件夹中?


当前回答

THIS_DIR := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))

其他回答

Makefile中的一行就足够了:

= $(notdir $(CURDIR))

壳层函数。

您可以使用shell函数:current_dir = $(shell pwd)。 如果不需要绝对路径,也可以使用shell结合notdir: Current_dir = $(notdir $(shell pwd))。

更新。

给定的解决方案仅在从Makefile的当前目录运行make时有效。 正如@Flimm所指出的:

注意,这将返回当前工作目录,而不是Makefile的父目录。例如,如果您运行cd /;make -f /home/username/project/ makefile,则current_dir变量为/,而不是/home/username/project/。

下面的代码将适用于从任何目录调用的makefile:

mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path))))

据我所知,这是唯一的答案,正确的空格:

space:= 
space+=

CURRENT_PATH := $(subst $(lastword $(notdir $(MAKEFILE_LIST))),,$(subst $(space),\$(space),$(shell realpath '$(strip $(MAKEFILE_LIST))')))

它本质上是通过将'\ '替换为'\ '来转义空格字符,这允许Make正确地解析它,然后它通过做另一个替换来删除makefile在MAKEFILE_LIST中的文件名,这样你就只剩下makefile所在的目录。虽然不是世界上最紧凑的东西,但它确实有效。

你最终会得到这样的结果,所有的空格都被转义了:

$(info CURRENT_PATH = $(CURRENT_PATH))

CURRENT_PATH = /mnt/c/Users/foobar/gDrive/P\ roje\ cts/we\ b/sitecompiler/

下面是使用shell语法获取Makefile文件绝对路径的一行程序:

SHELL := /bin/bash
CWD := $(shell cd -P -- '$(shell dirname -- "$0")' && pwd -P)

下面是没有shell的版本,基于@0xff的答案:

CWD := $(abspath $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))))

通过打印来测试,比如:

cwd:
        @echo $(CWD)

解决方案:https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/

解决方案是:$(CURDIR)

你可以这样使用它:

CUR_DIR = $(CURDIR)

## Start :
start:
    cd $(CUR_DIR)/path_to_folder