我有一个正在维护的构建机器服务器,它使用 Makefiles 基础结构。
作为该基础架构的一部分,我将一些参数从构建机器传递给 Makefile(例如:用户、构建服务器名称,以及仅在为特定项目编译时才知道的各种构建变量)。
其中一些变量使用 gcc -D 指令聚合到代码中
-DSOME_VAR=VAL
我现在被要求将一个 Iar 项目迁移到我的构建系统中。这本身不是问题,只是我找不到任何方法来使用 iarbuild.exe 命令行工具引入预处理器定义。
我想我可以使用现有的 H 文件并在编译之前对其进行编辑(例如使用 sed),但这是一个丑陋的 hack,如果可以的话我宁愿避免。
如何使用 IAR 正确实现这一点?
最佳答案
我最近使用选项 #2 和 iarbuild.exe 的 -varfile argvarfile 选项的组合解决了这个问题。对于我的情况,我正在控制 cpputest 的输出。我需要易于阅读的 IDE 构建输出,但构建服务器构建需要 junit 格式的输出。这是我的设置示例。
在 IDE 中创建一个全局变量。工具->配置自定义参数变量... 选择全局选项卡。创建组 JUNIT。创建变量 USE_JUNIT。将值设置为 0。
在 Project->Options->C/C++ Compiler->Preprocessor 部分添加一个条目
JUNIT_OUTPUT=$USE_JUNIT$
在代码中使用
#if JUNIT_OUTPUT == 1 #define FLAGS "-ojunit" #else #define FLAGS "-v" #endif
创建一个名为 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>
使用正常选项加上 -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/