我的项目中有两个目标,我们称之为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也能看到这个变量?
答案 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