【问题标题】:How do I substitute a string and add a prefix or suffix in Microsoft NMake?如何在 Microsoft NMake 中替换字符串并添加前缀或后缀?
【发布时间】:2023-03-24 07:25:01
【问题描述】:

我正在将 GNU Make 生成文件转换为 Microsoft Visual Studio 生成文件。我有三个疑问:

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. 如何用同样的方法添加后缀。

【问题讨论】:

  • 快速浏览NMake documentation 表明这可能很困难,因为没有任何字符串处理的迹象。

标签: nmake


【解决方案1】:

在环境变量或内部 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 文档:

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

冒号前没有空格或制表符;冒号后面是 解释为字面意思。如果 string2 为 null,则所有出现的 string1 从宏的定义字符串中删除。

【讨论】:

    【解决方案2】:

    NMAKE除了子串替换之外没有太多的字符串处理,甚至不能进行宏扩展。但是,由于 NMAKE 支持 makefile 包含,因此您可以利用一种明显的技术,尽管它的实现有些复杂。

    这个想法是创建一个临时的 makefile,通过包含在递归调用中,在需要的地方执行另一个宏扩展轮。这可用于向字符串列表添加变量前缀、后缀或分隔符。如有必要,可以同样执行进一步的扩展轮次。

    下面的 sn -p 说明了这个方法。它将列表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
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2016-12-25
      • 1970-01-01
      相关资源
      最近更新 更多