如何获得您的Makefile的当前相对目录?

我有这样的应用程序特定的目录中的几个Makefiles:

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

每个Makefile在这个path中包含一个.inc文件:

 /project1/apps/app_rules.inc 

在app_rules.inc里面,我设置了目标位置,当我想要二进制文件被放置的时候。 我希望所有的二进制文件都在它们各自的app_typepath中:

 /project1/bin/app_typeA/ 

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

 OUTPUT_PATH = /project1/bin/$(CURDIR) 

而是我把这些二进制文件埋在整个path名中,如下所示:( 注意冗余)

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

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

shell函数。

你可以使用shell函数: current_dir = $(shell pwd) 。 或者shellnotdir结合使用,如果不需要绝对path: current_dir = $(notdir $(shell pwd))

更新。

给定的解决scheme只有在从Makefile的当前目录运行make时才起作用。
正如@Flimm所指出的那样:

请注意,这将返回当前工作目录,而不是Makefile的父目录。
例如,如果你运行cd /; make -f /home/username/project/Makefile cd /; make -f /home/username/project/Makefilecurrent_dirvariables将是/ ,而不是/home/username/project/

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

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

从这里拿走;

 ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) 

显示为;

 $ cd /home/user/ $ make -f test/Makefile /home/user/test $ cd test; make Makefile /home/user/test 

希望这可以帮助

如果你正在使用GNU make,$(CURDIR)实际上是一个内置variables。 它是Makefile驻留 在当前工作目录位置,可能是Makefile所在位置 ,但并非总是如此

 OUTPUT_PATH = /project1/bin/$(notdir $(CURDIR)) 

请参阅http://www.gnu.org/software/make/manual/make.html中的附录A快速参考;

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

我尝试了很多这样的答案,但是在我的AIX系统上用gnu make 3.80我需要做一些老派的事情。

lastword ,直到3.81, lastwordabspathrealpath才被添加。 🙁

 mkfile_path := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) mkfile_dir:=$(shell cd $(shell dirname $(mkfile_path)); pwd) current_dir:=$(notdir $(mkfile_dir)) 

正如其他人所说,不是最优雅的,因为它调用了两次壳,它仍然有空间问题。

但是因为我的路上没有空间,所以无论我如何开始make ,它都适用于我:

  • make -f ../wherever/makefile
  • 使-C .. /其他
  • 使-C〜/任何地方
  • cd ../其他; 使

所有给我的wherever current_dir和绝对pathmkfile_dir wherever

综合这里给出的例子,这给出了makefile的完整path:

 # Get the location of this makefile. ROOT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) 

示例供您参考,如下所示:

文件夹结构可能如下所示:

在这里输入图像说明

哪里有两个Makefiles,每个如下;

 sample/Makefile test/Makefile 

现在,让我们看看Makefiles的内容。

采样/生成文件

 export ROOT_DIR=${PWD} all: echo ${ROOT_DIR} $(MAKE) -C test 

testing/ Makefile文件

 all: echo ${ROOT_DIR} echo "make test ends here !" 

现在执行sample / Makefile,如下所示;

 cd sample make 

OUTPUT:

 echo /home/symphony/sample /home/symphony/sample make -C test make[1]: Entering directory `/home/symphony/sample/test' echo /home/symphony/sample /home/symphony/sample echo "make test ends here !" make test ends here ! make[1]: Leaving directory `/home/symphony/sample/test' 

说明是,父/主目录可以存储在环境标志中,并且可以导出,以便它可以在所有子目录的makefile中使用。

我使用这个:

MAKEFILE_PATH:= $(PWD)/ $({0%/ *})

它可以显示正确的,如果在其他shell和其他目录执行