如何获得您的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_type
path中:
/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)
。 或者shell
与notdir
结合使用,如果不需要绝对path: current_dir = $(notdir $(shell pwd))
。
更新。
给定的解决scheme只有在从Makefile的当前目录运行make
时才起作用。
正如@Flimm所指出的那样:
请注意,这将返回当前工作目录,而不是Makefile的父目录。
例如,如果你运行cd /; make -f /home/username/project/Makefile
cd /; make -f /home/username/project/Makefile
,current_dir
variables将是/
,而不是/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, lastword
, abspath
和realpath
才被添加。 🙁
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和其他目录执行