在包含的makefile中获取特定于目标的变量

在包含的makefile中获取特定于目标的变量,makefile,gnu,Makefile,Gnu,我的项目中有两个目标,让我们称它们为client.c和server.c 如果我正在为客户端构建,我希望将变量APPS设置为: 应用程序+=客户端应用程序 如果我正在为服务器构建,我希望将此变量设置为: 应用程序+=服务器应用程序 此APPS变量用于包含的Makefile(Makefile.include)中,该文件检查是否定义了应用程序,如果设置了应用程序,则对其进行解析 ifdef APPS blah blah blah endif 我现在正试着这样做 all: client serve

我的项目中有两个目标,让我们称它们为client.c和server.c

如果我正在为客户端构建,我希望将变量APPS设置为:

应用程序+=客户端应用程序

如果我正在为服务器构建,我希望将此变量设置为:

应用程序+=服务器应用程序

APPS变量用于包含的Makefile(Makefile.include)中,该文件检查是否定义了应用程序,如果设置了应用程序,则对其进行解析

ifdef APPS
  blah blah blah
endif
我现在正试着这样做

all: client server
client: APPS += client_app
client: client.$(TARGET)
  @echo $(APPS)
server: APPS += server_app
server: server.$(TARGET)
  @echo $(APPS)
include ../Makefile.include
。。。这将在构建客户端或服务器时构建目标并回显应用程序。但是Makefile.include从未将应用程序视为已设置。我假设这是一个具有目标特定变量的怪癖


如何确保包含的Makefile也可以看到此变量?

您不能这样做。特定于目标的变量仅在的上下文中设置。因此,当解析包含的makefile时,它们没有值;这不是在任何特定规则的上下文中

如果不知道这些废话在makefile中的实际作用,就很难提出替代方案。但是,假设您无法简化此操作,并且它必须是
ifdef
中的一组make指令,那么您可以使用递归
make
来执行此操作:

all: client server

client: APPS += client_app
server: APPS += server_app

client server:
        $(MAKE) APPS=$(APPS) $@.$(TARGET)

include ../Makefile.include

包含额外的makefile不是这里的问题。不管怎样,都不会看到该变量

ifdef将不会看到变量APPS的定义,因为它仅对定义它的特定目标可见

而是完全删除对应用程序的分配,并使用特殊变量MAKECMDGOALS,该变量保存命令行中指定的目标列表:

ifeq ($(MAKECMDGOALS),client)

$(info client)  #do client stuff here

else ifeq ($(MAKECMDGOALS),server)

$(info server)  #and server stuff here

else

$(error Invalid targets)

endif

起初我认为第二关与此有关。你真的知道你的makefile+1我发现使用MAKECMDGOALS最简单。谢谢!我要试试这个!抱歉我花了这么长时间才试出来。工作起来很有魅力。非常感谢。