我有几个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,以便将二进制文件放在各自的类型文件夹中?
壳层函数。
您可以使用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))))
举例如下,供参考:
文件夹结构可能是这样的:
其中有两个makefile,分别如下所示;
sample/Makefile
test/Makefile
现在,让我们看看Makefiles的内容。
样品/ Makefile
export ROOT_DIR=${PWD}
all:
echo ${ROOT_DIR}
$(MAKE) -C test
测试/ Makefile
all:
echo ${ROOT_DIR}
echo "make test ends here !"
现在,执行样例/Makefile,如;
cd sample
make
输出:
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'
解释一下,父/home目录可以存储在environment-flag中,并且可以导出,这样就可以在所有子目录的makefile中使用。
据我所知,这是唯一的答案,正确的空格:
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/
更新2018/03/05
最后我用这个:
shellPath=`echo $PWD/``echo ${0%/*}`
# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
shellPath=${shellPath2}
fi
它可以在相对路径或绝对路径上正确执行。
由crontab调用的已执行正确。
在其他shell中执行正确。
显示示例,a.sh打印自路径。
[root@izbp1a7wyzv7b5hitowq2yz /]# more /root/test/a.sh
shellPath=`echo $PWD/``echo ${0%/*}`
# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
shellPath=${shellPath2}
fi
echo $shellPath
[root@izbp1a7wyzv7b5hitowq2yz /]# more /root/b.sh
shellPath=`echo $PWD/``echo ${0%/*}`
# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
shellPath=${shellPath2}
fi
$shellPath/test/a.sh
[root@izbp1a7wyzv7b5hitowq2yz /]# ~/b.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]# /root/b.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]# cd ~
[root@izbp1a7wyzv7b5hitowq2yz ~]# ./b.sh
/root/./test
[root@izbp1a7wyzv7b5hitowq2yz ~]# test/a.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz ~]# cd test
[root@izbp1a7wyzv7b5hitowq2yz test]# ./a.sh
/root/test/.
[root@izbp1a7wyzv7b5hitowq2yz test]# cd /
[root@izbp1a7wyzv7b5hitowq2yz /]# /root/test/a.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]#
旧:
我用这个:
MAKEFILE_PATH := $(PWD)/$({0%/*})
如果在其他shell和其他目录下执行,可以显示正确。