我在app特定目录中有几个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/
I tried using $(CURDIR) ,像这样:
OUTPUT_PATH = /project1/bin/$(CURDIR)
但相反,我把二进制文件埋在整个路径名中,如下所示: (notice the redundancy)
/project1/bin/projects/users/bob/project1/apps/app_typeA
我该怎么做才能获得执行"current directory"以便我只知道 app_typeX 以便将二进制文件放在各自的类型文件夹中?
10 回答
shell函数 .
您可以使用shell函数:
current_dir = $(shell pwd)
. 或者shell
与notdir结合使用,如果不需要绝对路径:current_dir = $(notdir $(shell pwd))
.更新 .
给定解决方案仅在从Makefile的当前目录运行
make
时才有效 .正如@Flimm所说:
以下代码适用于从任何目录调用的Makefile:
取自here;
显示为;
希望这可以帮助
如果您使用的是GNU make,$(CURDIR)实际上是一个内置变量 . 它是Makefile驻留当前工作目录的位置,可能是Makefile所在的位置,但并非总是如此 .
请参阅http://www.gnu.org/software/make/manual/make.html中的附录A快速参考
我尝试了很多这些答案,但在我的AIX系统上使用gnu make 3.80我需要做一些旧学校的事情 .
事实证明,直到3.81才添加
lastword
,abspath
和realpath
. :(正如其他人所说的那样,并不是最优雅的,因为它会两次调用shell,而且它仍然存在空间问题 .
但由于我的路径中没有任何空格,无论我如何开始,它都适用于我:
make
:make -f ../wherever/makefile
make -C ../ wherever
make -C~ / wherever
cd ../wherever;使
对于
current_dir
,所有给我wherever
,为mkfile_dir
给出wherever
的绝对路径 .我喜欢所选择的答案,但我认为实际展示它的工作比解释它更有帮助 .
/tmp/makefile_path_test.sh
输出:
NOTE: 函数
$(patsubst %/,%,[path/goes/here/])
用于去除尾部斜杠 .示例供您参考,如下:
文件夹结构可能如下:
有两个Makefile,每个Makefiles如下;
现在,让我们看看Makefile的内容 .
现在,执行sample / Makefile,as;
解释是,parent / home目录可以存储在environment-flag中,并且可以导出,以便它可以在所有子目录makefile中使用 .
这是使用shell语法获取
Makefile
文件的绝对路径的单行程序:这里是基于@0xff answer的没有shell的版本:
通过打印测试它,如:
如果make变量包含Relative路径是 ROOT_DIR
他们获取绝对路径只是使用下面的方法 .
它在GNUMake中工作得很好......
更新2018/03/05 finnaly我用这个:
它可以在相对路径或绝对路径中正确执行 . 执行正确的crontab调用 . 在其他shell中执行正确 .
显示示例,a.sh打印自我路径 .
老:我用这个:
如果在其他shell和其他目录中执行,它可以显示正确 .