获取MakeFile目录

时间:2010-01-05 08:19:27

标签: makefile

我正在分发我的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

4 个答案:

答案 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的较早版本的问题

根据您在Windows上使用的make版本,反斜杠的处理可能会不一致。您可能需要以下变体之一。例如GnuWin's make 3.81 binary就是这种情况。

  • 使路径分隔符保持一致。下面的语句仅使用正斜杠,只需交换\/即可获得相反的行为。根据我的经验(使用GnuWin的make),您可能必须使用正斜杠才能将此类变量用于make include语句或在VPATH中使用。 但是,您当然需要在DOS外壳程序中以及因此在配方中使用反斜杠。您可能需要该变量的两个版本,但至少要确保路径分隔符的一致性,否则替换必须确保!
makeFileDir := $(subst \,/,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
  • GnuWin make 3.81的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
  • 如果我没记错的话,这也适用于macOS的本地品牌。
相关问题