旧make版本上具有非标准makefile名称的递归make

旧make版本上具有非标准makefile名称的递归make,makefile,Makefile,我有一个调用自身的makefile,以便在编译任何东西之前获得编译器的许可证,并在编译失败时释放许可证,如下所示: .PHONY main_target main_target: @license_grab & @sleep 2 -@$(MAKE) real_target @license_release 如果makefile被命名为“makefile”,这将非常有效。但是,如果我复制一个makefile来试验一些东西,并使用make-f makefil

我有一个调用自身的makefile,以便在编译任何东西之前获得编译器的许可证,并在编译失败时释放许可证,如下所示:

.PHONY main_target
main_target:
    @license_grab &
    @sleep 2
    -@$(MAKE) real_target
    @license_release
如果makefile被命名为“makefile”,这将非常有效。但是,如果我复制一个makefile来试验一些东西,并使用
make-f makefile\u copy
调用它,那么在递归调用中会使用错误的makefile。如果不在makefile本身中硬编码makefile名称,如何防止出现这种情况


编辑:不幸的是,我一直在使用GNU Make版本3.79.1,所以我无法使用MAKEFILE\u列表,这显然是错误的。因此,中的任何答案都不适用于我。

您可以使用
MAKEFILE\u LIST
变量:

THIS_MAKEFILE := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))

.PHONY main_target
main_target:
        @license_grab &
        @sleep 2
        -@$(MAKE) -f $(THIS_MAKEFILE) real_target
        @license_release

您可以在makefile之外设置MAKE变量,以包括makefile名称(当然,除非它被覆盖)。类似这样的内容(用于bash):

或者这个(几乎在任何外壳中):


谢谢,对于make的最新版本来说,这似乎是一个很好的答案。不幸的是,我使用的版本非常过时,并且不支持MAKEFILE_LIST;我在我的问题中添加了这些信息。那么你就不走运了。您必须手动在命令行上设置一个变量,或者对文件名进行硬编码。您可以在make周围编写一个小的shell别名或脚本包装器来为您完成这项工作,但是在makefile中没有真正可靠的方法来完成这项工作。谢谢!这看起来是一个优雅的解决办法。当然,更好的答案是使用较新的
make
支持MAKEFILE\u列表,就像在另一个答案中一样,但这在必要时应该可以做到。我在我的一些程序中使用了这一点-在执行递归make时,在递归调用中传递make和MAKEFLAGS符号(为了确保它们被设置在较低的级别,并被覆盖)。这对bash非常有效,对于csh,我使用了
make=“make-f makefile\u copy”-f makefile\u copy
。这似乎是可行的,但实际上是等效的还是我遗漏了一些微妙的东西?使用“-e”将环境变量传递到程序中只是我很久以前养成的习惯。“make”早就有了
variable=value
语法。
MAKE="make -f makefile_copy" make -e -f makefile_copy
make MAKE="make -f makefile_copy" -f makefile_copy