我正在分发我的cpp文件和makefile。现在,makefile与cpp文件位于同一目录中。
makefile中的变量(如果有)是什么允许我检索makefile所在的当前目录?通过这种方式,我可以使用该变量来指定我的cpp路径进行编译。
我的makefile如下:
all:
g++ ($makeFileDir)/main.cpp ($makeFileDir)/hello.cpp ($makeFileDir)/factorial.cpp -o ($makeFileDir)/hello.exe
编辑:我在Windows上运行我的makefile
答案 0 :(得分:7)
我记得我有同样的问题。据我所知,这是不可能的。 你可以拥有的最好的选择是将其作为变量传递。这是跨平台的并且保证可以工作,因为你知道调用时的makefile目录(否则你不能调用它)。
另外,你可以做一个非常脏的技巧,这意味着你尝试将当前路径(你可以用gnu make中的$(CURDIR)获得)和makefile调用的路径(这可能很棘手,并取决于你的品牌)
答案 1 :(得分:1)
对于'cygwin'和'linux'使用我通过直接从makefile中的规则调用pwd来解决这个问题:
do.%: %.cpp
echo "Running command in " `pwd`
somecommand $^
答案 2 :(得分:0)
你可以使用$(srcdir)
然后./configure --srcdir =“/ your / path / to / the / source / directory”
答案 3 :(得分:0)
这是获取Makefile目录的跨平台方法,该目录应完全与Shell无关。
makeFileDir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
请注意,这将为您提供当前正在解释的 Makefile的目录。如果您使用了另一个语句中的Malefile,则可能会感到意外(或意外!)。
如果您使用Windows的make的最新实现,即Chocolatey's,就足够了。
根据您在Windows上使用的make版本,反斜杠的处理可能会不一致。您可能需要以下变体之一。例如GnuWin's make 3.81 binary就是这种情况。
\
和/
即可获得相反的行为。根据我的经验(使用GnuWin的make),您可能必须使用正斜杠才能将此类变量用于make include
语句或在VPATH
中使用。
但是,您当然需要在DOS外壳程序中以及因此在配方中使用反斜杠。您可能需要该变量的两个版本,但至少要确保路径分隔符的一致性,否则替换必须确保!
makeFileDir := $(subst \,/,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
abspath
函数已损坏,并且不处理带有驱动器号的路径。这也是一种解决Windows绝对路径(带有驱动器号)的解决方法。然后,您可以使用它来获取Makefile的目录(此处也用路径分隔符替代)。
我不会解释细节,但是如果该路径已经是Windows绝对路径,即如果路径的根中有:
,则变通方法仅返回该参数,否则使用内置的abspath
。 define fixabspath
$(if $(findstring :,$(firstword $(subst /, ,$(subst \,/,$(1))))),$\$
$(1),$\
$(abspath $(1)))
makeFileDir := $(subst \,/,$(dir $(call fixabspath,$(lastword $(MAKEFILE_LIST)))))
备注
fixabspath
定义中,$\
只是为了便于阅读而分隔行。MAKEFILE_LIST
变量包含正在解释的Makefile的列表,最后一个是当前的。请参阅相应的manual page。