包含来自其他makefile的相同Makefile

时间:2014-07-17 18:42:03

标签: c linux makefile

我正在尝试使用Makefile的层次结构。使用GNU Make。

让我们说,我有一个目录SRC,它有3个子目录:A,B和C.

每个目录都有自己的Makefile(Make.SRC,Make.A,Make.B和Make.C)。

Make.B和Make.C都需要将Make.A用于某些共享文件。

在SRC目录的Make.SRC文件中,我有以下几行:

include A/Make.A
include B/Make.B
include C/Make.C

但由于我有多个Make.A(总共3次),所以它给了我警告覆盖Make.A内目标的命令。

这种分层Makefile的工作方式应该是什么? 有没有像C头文件这样的技术可以避免重复包含?

1 个答案:

答案 0 :(得分:1)

如果您确实需要能够在自己的make -f Make.B <targets>make -f Make.C <targets>上使用单个makefile,则可以添加Make.A是否已在$MAKEFILE_LIST中或不包括它,只有在它没有的情况下才包含它。

define condinc
    $(eval # Space needed after eval for this to function correctly.
    ifeq (,$(filter %$1,$(MAKEFILE_LIST)))
        include $1
    endif
    )
endef

Make.SRC

$(call condinc,A/Make.A)

Make.BMake.C

$(call condinc,../A/Make.A)

编辑:嗯...不,这不会很正常。它需要一些调整来将路径与过滤器的makefile名称分开并包含部分。正在努力。

如果makefile的基本名称都不匹配,那么在该定义中使用ifeq (,$(filter %$(notdir $1),$(MAKEFILE_LIST)))主要起作用。如果他们这样做,则需要对该功能进行更多更改。但是究竟什么依赖于子makefile包含的行看起来像我想的那样。

$ more {Makefile,{A,B,C}/Make.*} | cat
::::::::::::::
Makefile
::::::::::::::
define condinc
    $(eval
    ifeq (,$(filter %$(notdir $1),$(MAKEFILE_LIST)))
        include $1
    endif
    )
endef

$(info one)
$(call condinc,A/Make.A)
$(info two)
$(call condinc,B/Make.B)
$(info three)
$(call condinc,C/Make.C)
$(info four)
::::::::::::::
A/Make.A
::::::::::::::
$(info Make.A included)
$(info MAKEFILE_LIST is $(MAKEFILE_LIST))
::::::::::::::
B/Make.B
::::::::::::::
$(info Make.B included)
$(info MAKEFILE_LIST is $(MAKEFILE_LIST))

$(call condinc,$(CURDIR)/A/Make.A)
::::::::::::::
C/Make.C
::::::::::::::
$(info Make.C included)
$(info MAKEFILE_LIST is $(MAKEFILE_LIST))

运行上述内容可以获得:

$ make
one
Make.A included
MAKEFILE_LIST is  Makefile A/Make.A
two
Make.B included
MAKEFILE_LIST is  Makefile A/Make.A B/Make.B
three
Make.C included
MAKEFILE_LIST is  Makefile A/Make.A B/Make.B C/Make.C
four
make: *** No targets.  Stop.