2013-08-22 111 views
4

我正在翻譯GNU Make makefile到Microsoft Visual Studio Makefile。我有三個疑問:如何替換字符串並在Microsoft NMake中添加前綴或後綴?

1)如何替換字符串。例如包含的文件夾中:

namespace_type_function1.cpp 
namespace_type_function2.cpp 
namespace_type_function3.cpp 

我想改變類型可以說「INT」字符串,所以我最終得到

namespace_INT_function1.cpp 
namespace_INT_function2.cpp 
namespace_INT_function3.cpp 

2)如何以相似的方式添加前綴 3.如何以相同的方式添加後綴。

+0

快速瀏覽[NMake文檔](http://msdn.microsoft.com/en-us/library/dd9y37ha.aspx)表明這可能很困難,因爲沒有任何字符串處理的跡象。 – Richard

回答

6

一旦有了在任一環境變量或內部NMAKE變量的字符串,可以使用下面的替代一個固定字符串爲另一:

$(MY_VAR:REPLACE_THIS=WITH_THIS) 

「WITH_THIS」可以是一個空字符串。

實施例生成文件:

MY_VAR=123451234512345 
ALL: 
    @echo $(MY_VAR:12=XX) 
    @echo $(MY_VAR:12=) 

輸出:

XX345XX345XX345 
345345345 

從Microsoft文檔:

宏替換是大小寫敏感的,是文字; string1和 string2不能調用宏。替換不會修改原始定義。您可以使用除[email protected]之外的任何預定義宏 中的文本。

冒號前沒有空格或製表符;任何冒號後面都是 解釋爲文字。如果string2爲空,則從宏的定義字符串中刪除所有出現的字符串1 。

4

除了子串替換,NMAKE不會處理很多字符串處理,甚至不能執行宏擴展。但是,由於NMAKE支持makefile包含,所以可以利用一種明顯的技術,儘管它的實現有些複雜。

這個想法是創建一個臨時makefile,它通過包含在遞歸調用中,在需要的地方執行另一個宏擴展。這可用於將可變前綴,後綴或分隔符添加到字符串列表。如有必要,可以進一步擴展輪次。

以下片段說明了該方法。它將列表a b c d e轉換爲[a];[b];[c];[d];[e](即在元素之間添加前綴,後綴和分隔符)。最初的makefile(如果NMAKE支持二次擴展,將執行的規則)大部分沒有改變。最後,NMAKE在整個運行後不留下臨時文件。

# The name of the makefile. 
MAKEFILE = test.mak 

# The list of strings to be processed. The elements can be separated by one or more spaces or tabs. 
LIST = a b c d e 

# The prefix to add to each element. 
PREFIX = [ 

# The suffix to add to each element. 
SUFFIX = ] 

# The separator to add between each element. 
SEP = ; 

##### 

# Replace tabs with spaces. 
# Note: there is a hard tab character between the colon and the equal sign. 
LIST = $(LIST: =) 

!IFNDEF TEMPFILE 
# Write a temporary makefile. 
target1 target2: 
    @$(MAKE) /nologo /C /$(MAKEFLAGS) /F$(MAKEFILE) TEMPFILE=<< [email protected] 
LIST = $(PREFIX)$$(LIST: =$(SUFFIX)$(SEP)$(PREFIX))$(SUFFIX) 
LIST = $$(LIST:$(PREFIX)$(SUFFIX)$(SEP)=) 
<<NOKEEP 

!ELSE 
# Here goes your original makefile. 
! INCLUDE $(TEMPFILE) 

target1: 
    @[email protected] 
    @echo.$(LIST) 

target2: 
    @[email protected] 
    @echo.$(LIST) 
!ENDIF 

從這個唯一要注意的是,命令行宏傳遞給遞歸調用,並且因此沒有太大有用了。