我有几个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,以便将二进制文件放在各自的类型文件夹中?
举例如下,供参考:
文件夹结构可能是这样的:
其中有两个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中使用。
我尝试了许多这些答案,但是在我的AIX系统上,我需要使用gnu make 3.80做一些老派的事情。
最后一个词,abspath和realpath直到3.81才加入。:(
mkfile_path := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
mkfile_dir:=$(shell cd $(shell dirname $(mkfile_path)); pwd)
current_dir:=$(notdir $(mkfile_dir))
正如其他人所说,它不是最优雅的,因为它调用了shell两次,而且它仍然有空格问题。
但由于我的路径中没有任何空间,无论我如何开始制作,它都适用于我:
Make -f ../where /makefile ./
make -C ../任意位置
make -C ~/where
cd . . /的地方;使
都为我提供了current_dir的where和mkfile_dir的where的绝对路径。
我喜欢选定的答案,但我认为实际展示它比解释它更有帮助。
/ tmp / makefile_path_test.sh
#!/bin/bash -eu
# Create a testing dir
temp_dir=/tmp/makefile_path_test
proj_dir=$temp_dir/dir1/dir2/dir3
mkdir -p $proj_dir
# Create the Makefile in $proj_dir
# (Because of this, $proj_dir is what $(path) should evaluate to.)
cat > $proj_dir/Makefile <<'EOF'
path := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
cwd := $(shell pwd)
all:
@echo "MAKEFILE_LIST: $(MAKEFILE_LIST)"
@echo " path: $(path)"
@echo " cwd: $(cwd)"
@echo ""
EOF
# See/debug each command
set -x
# Test using the Makefile in the current directory
cd $proj_dir
make
# Test passing a Makefile
cd $temp_dir
make -f $proj_dir/Makefile
# Cleanup
rm -rf $temp_dir
输出:
+ cd /tmp/makefile_path_test/dir1/dir2/dir3
+ make
MAKEFILE_LIST: Makefile
path: /private/tmp/makefile_path_test/dir1/dir2/dir3
cwd: /tmp/makefile_path_test/dir1/dir2/dir3
+ cd /tmp/makefile_path_test
+ make -f /tmp/makefile_path_test/dir1/dir2/dir3/Makefile
MAKEFILE_LIST: /tmp/makefile_path_test/dir1/dir2/dir3/Makefile
path: /tmp/makefile_path_test/dir1/dir2/dir3
cwd: /tmp/makefile_path_test
+ rm -rf /tmp/makefile_path_test
注意:函数$(patsubst %/,%,[path/goes/here/])用于去除后面的斜杠。