5

我正在将 GNU Makefile 转换为 Microsoft Visual Studio Makefile。我有三个疑问:

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. 如何以相同的方式添加后缀。

4

2 回答 2

10

在环境变量或内部 nmake 变量中获得字符串后,您可以使用以下命令将一个固定字符串替换为另一个:

$(MY_VAR:REPLACE_THIS=WITH_THIS)

“WITH_THIS”可以是一个空字符串。

示例生成文件:

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

输出:

XX345XX345XX345
345345345

从微软文档:

宏替换区分大小写并且是字面的;string1 和 string2 不能调用宏。替换不会修改原始定义。您可以替换任何预定义宏中的文本,除了$$@.

冒号前没有空格或制表符;冒号后面的任何内容都被解释为文字。如果 string2 为 null,则从宏的定义字符串中删除所有出现的 string1。

于 2013-09-27T19:40:16.967 回答
5

NMAKE除了子串替换之外没有太多的字符串处理,甚至不能进行宏扩展。但是,由于 NMAKE 支持 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=<< $@
LIST = $(PREFIX)$$(LIST: =$(SUFFIX)$(SEP)$(PREFIX))$(SUFFIX)
LIST = $$(LIST:$(PREFIX)$(SUFFIX)$(SEP)=)
<<NOKEEP

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

target1:
    @echo.$@
    @echo.$(LIST)

target2:
    @echo.$@
    @echo.$(LIST)
!ENDIF

唯一需要注意的是命令行宏不会传递给递归调用,因此不再有用。

于 2014-01-09T23:38:57.713 回答