2017-03-23 27 views
1

我的項目中有兩個目標,我們稱它們爲client.c和server.c。在包含的Makefiles中獲取目標特定變量

如果我建立了客戶端,我想設置一個變量,應用是:

APPS + = client_app

如果我建的服務器,我像組d這個變量是:

APPS + = server_app

APPS變量是在一個包括米,用來akefile(Makefile.include),它檢查APPS是否已定義,然後在已設置的情況下解析它。

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從來沒有看到APPS被設置。我假設這是一個具有目標特定變量的怪癖。

我該如何去確保我包含的Makefile也能看到這個變量?

回答

2

你不能這樣做。特定於目標的變量是只有the recipe for the target的上下文中設置。所以,當包含的makefile被解析時,它們沒有任何價值;這不屬於任何特定規則的情況。

不知道什麼等等等等實際上在您的生成文件中做了很難建議的替代品。但是,假設你不能簡化這一點,它必須是一個ifdef內一套化妝指令,那麼你可以使用遞歸make做到這一點:

all: client server 

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

client server: 
     $(MAKE) APPS=$(APPS) [email protected]$(TARGET) 

include ../Makefile.include 
+0

起初,我雖然第二次有事情做吧。你真的瞭解你的makefile。 +1我簡單地使用MAKECMDGOALS是最簡單的。 – 2501

+0

謝謝!我會試試這個! – mbadd

+0

抱歉,花了我很長時間才得以解決這個問題。奇蹟般有效。謝謝! – mbadd

1

額外的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