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

时间:2017-03-23 12:55:11

标签: makefile gnu

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

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

APPS + = client_app

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

APPS + = server_app

APPS 变量用于包含的Makefile( Makefile.include ),它会检查APPS是否已定义,然后在设置时解析它。< / p>

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

...这可以在构建客户端或服务器时构建目标并回显APPS。但是,Makefile.include永远不会将APPS视为已设置。我假设这是一个具有目标特定变量的怪癖。

我如何确保我的包含的Makefile也能看到这个变量?

2 个答案:

答案 0 :(得分:2)

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

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

all: client server

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

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

include ../Makefile.include

答案 1 :(得分:1)

此处包含附加的makefile不是问题。无论如何都不会看到变量。

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

而是完全删除对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