我正在将GNU Make makefile翻译为Microsoft Visual Studio Makefile.我有三个疑问:
1)如何替换字符串.例如在包含以下内容的文件夹中
namespace_type_function1.cpp
namespace_type_function2.cpp
namespace_type_function3.cpp
Run Code Online (Sandbox Code Playgroud)
我想改变类型让我们说"INT"字符串,所以我终于得到了
namespace_INT_function1.cpp
namespace_INT_function2.cpp
namespace_INT_function3.cpp
Run Code Online (Sandbox Code Playgroud)
2)如何以类似的方式添加前缀3.如何以相同的方式添加后缀.
在环境变量或内部nmake变量中包含字符串后,可以使用以下内容将一个固定字符串替换为另一个:
$(MY_VAR:REPLACE_THIS=WITH_THIS)
Run Code Online (Sandbox Code Playgroud)
"WITH_THIS"可以是空字符串.
示例makefile:
MY_VAR=123451234512345
ALL:
@echo $(MY_VAR:12=XX)
@echo $(MY_VAR:12=)
Run Code Online (Sandbox Code Playgroud)
输出:
XX345XX345XX345
345345345
Run Code Online (Sandbox Code Playgroud)
从Microsoft文档:
宏替换区分大小写并且是字面的; string1和string2无法调用宏.替换不会修改原始定义.您可以替换除任何预定义宏中的文本
$$@
.冒号前面没有空格或制表符; 任何冒号后都被解释为文字.如果string2为null,则从宏的定义字符串中删除所有出现的string1.
NMAKE除了替换子字符串外,没有太多的字符串处理功能,即使这样做也无法执行宏扩展。但是,由于NMAKE支持包含makefile,所以可以使用一种显而易见的技术,尽管其实现有些复杂。
这个想法是创建一个临时的makefile,通过将其包含在递归调用中,在需要时执行另一轮宏扩展。这可用于在字符串列表中添加变量前缀,后缀或分隔符。如有必要,也可以执行进一步的扩展回合。
以下代码段说明了该方法。它将列表a b c d e
转换为[a];[b];[c];[d];[e]
(即在元素之间添加前缀,后缀和分隔符)。原始的生成文件(如果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
Run Code Online (Sandbox Code Playgroud)
唯一需要注意的是,命令行宏不会传递给递归调用,因此不再有用。
归档时间: |
|
查看次数: |
3711 次 |
最近记录: |