c - GCC -D 相当于 iarbuild.exe

标签 c c-preprocessor iar

我有一个正在维护的构建机器服务器,它使用 Makefiles 基础结构。

作为该基础架构的一部分,我将一些参数从构建机器传递给 Makefile(例如:用户、构建服务器名称,以及仅在为特定项目编译时才知道的各种构建变量)。

其中一些变量使用 gcc -D 指令聚合到代码中

-DSOME_VAR=VAL

我现在被要求将一个 Iar 项目迁移到我的构建系统中。这本身不是问题,只是我找不到任何方法来使用 iarbuild.exe 命令行工具引入预处理器定义。

我想我可以使用现有的 H 文件并在编译之前对其进行编辑(例如使用 sed),但这是一个丑陋的 hack,如果可以的话我宁愿避免。

如何使用 IAR 正确实现这一点?

最佳答案

我最近使用选项 #2 和 iarbuild.exe 的 -varfile argvarfile 选项的组合解决了这个问题。对于我的情况,我正在控制 cpputest 的输出。我需要易于阅读的 IDE 构建输出,但构建服务器构建需要 junit 格式的输出。这是我的设置示例。

  1. 在 IDE 中创建一个全局变量。工具->配置自定义参数变量... 选择全局选项卡。创建组 JUNIT。创建变量 USE_JUNIT。将值设置为 0。

  2. 在 Project->Options->C/C++ Compiler->Preprocessor 部分添加一个条目

    JUNIT_OUTPUT=$USE_JUNIT$
    
  3. 在代码中使用

    #if JUNIT_OUTPUT == 1
        #define FLAGS "-ojunit"
    #else
        #define FLAGS "-v"
    #endif
    
  4. 创建一个名为 jUnitOut.txt 的文件并将以下内容放入其中。

    <?xml version="1.0" encoding="iso-8859-1"?>
    
    <iarUserArgVars>
      <group active="true" name="JUNIT">
        <variable>
          <name>USE_JUNIT</name>
          <value>1</value>
        </variable>
      </group>
    </iarUserArgVars>
    
  5. 使用正常选项加上 -varfile jUnitOut.txt 调用 iarbuild.exe

一些观察

关于#1,您实际上不需要创建全局变量,但是当您创建 IAR 时,会创建 ...\AppData\Roaming\IAR Embedded Workbench\global.custom_argvars。该文件必须存在,iarbuild.exe 才能使用您提供的 -varfile。此外,您还可以创建工作区变量。这些存储在本地项目目录中的文件中。可以将此文件添加到源代码管理中,从而避免使用全局变量。 IDE 构建使用全局变量和工作区变量,而 iarbuild 将使用 -varfile

关于#4,我没有找到任何关于如何格式化 argvarfile 的文档。因此,我在 IDE 中创建了一个工作区变量,找到了它创建的用于存储该变量的文件,然后从该文件剪切/粘贴到我的 jUnitOut.txt

关于c - GCC -D 相当于 iarbuild.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27628435/

相关文章:

c - C 中返回结构体指针数组的函数签名的语法是什么?

c++ - C 或 C++ 中的跨平台 GUI 工具包?

转换为函数指针时出现编译器错误

c - 警告 : unknown conversion type character ‘T’ in format [-Wformat]

c - 数据对齐全局变量

c - 为什么 a+++++b 不起作用?

c - 使用带有函数原型(prototype)的预处理器定义

无法解析条件编译 block 内的类函数宏

C编译器错误或程序错误?

c - 如何在 stm32f107 芯片上禁用/启用中断?