This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR5969:在编译之前存储符号值?

Guru**** 2554900 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/757188/ccs-msp430fr5969-storing-a-symbol-value-before-building

器件型号:MSP430FR5969

工具/软件:Code Composer Studio

在编译代码之前、我正在尝试获取代码的 git 标记信息。 在命令 shell 中,我只需运行以下命令即可将信息存储在环境变量中:

Git 描述> temp.txt
set /p <temp.txt del temp.txt

这些步骤在编译中执行得很好、但当编译引用了 version_number 的 main.c 时、符号仍然未定义。 设置此设置的正确方法是什么? 这些步骤是在 生成的 makefile 文件中执行、还是在调用编译器之前关闭的 shell 中执行? 下面是我将这些命令放入预编译步骤的方法:

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Paul Shepherd17"]这些步骤是在 生成的 makefile 文件中执行,还是在调用编译器之前关闭的 shell 中执行?

    后者是正确的、因此 CCS 或编译器不会仅通过此预编译步骤知道该变量。 您可以使用 setx、但由于这仅适用于新 shell、因此我发现 CCS 在重新启动后才知道它。  此页面 显示了如何将 CCS 变量与 C 源文件变量相关联、但此处的示例使用 CCS 变量的硬编码值。

    另一种方法是编写一个脚本、将此变量写入头文件(作为#define)、并在预编译步骤中调用该脚本。 然后可以将头文件包含在构建中。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 AartiG:

    我一直在研究第二个选项... 创建分析'git restring'返回字符串并生成要包括的 version.h 文件的 bash 脚本,但我意识到了为什么通常不建议这样做。 风险是、如果有人获取 version.h 文件、但在构建之前未更新该文件、则所有版本信息都是错误的。  

    进一步阅读后、自动生成 makefile 似乎是底层 eclipse IDE 的一项功能、并且无法将其他语句插入到该 makefile 中。 唯一的选项显示为全自动或全手动。 我认为将我们的代码库从自动转换为手动 makefile 是最有意义的。

    FWiw、我们正在尝试在我们的主编译服务器上实现该系统、但我必须具有一个等效项、我可以在 CCS 内的工作站上运行该系统。 将 Eclispe makefile 文件从循环中取出似乎可以修复我的工作站和构建服务器之间的其他不一致之处。 (将版本信息纳入软件的链接: https://embeddedartistry.com/blog/2016/10/27/giving-you-build-a-version )

    谢谢、

    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Paul Shepherd17]\n 风险是、如果有人获取 version.h 文件、但在构建之前未对其进行更新、则所有版本信息都是错误的。  [/报价]

    由于预编译步骤始终在主编译之前运行、因此如果此步骤涉及/更新 version.h 文件、则无法确保获得正确的文件?

    [引用 user="Paul Shepherd17]]进一步阅读后、似乎自动生成 makefile 是基础 eclipse IDE 的一项功能、并且无法将其他语句插入到该 makefile 中。 [/报价]

    这种情况大多是真实的。 但是、有一些功能可以扩展 Eclipse (TI 不使用)提供的 makefile 行为。 有关 详细信息、请参阅此文章。 您可以尝试研究 makefile.init 是否能满足此目的。

    [引用 user="Paul Shepherd17"]我认为将我们的代码库从自动转换为手动 makefile 最有意义。

    手动 makefile 当然可以为您提供更多的控制和灵活性。  最终、您必须决定 哪些最适合您的环境。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aarti、

    您指向 makefile.init 信息的链接是银色项目符号。 太完美了!

    首先、我们可以尝试让每个人都使用一致的 CCS 项目设置、但无法保证。 将此信息放入 makefile 文件是一种更具项目符号性的解决方案、因为正如我说过的、如果编译版本信息超出范围、它将会出错、而不是可能从磁盘上的文件中拾取旧的编译信息。

    谢谢、

    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aarti、

    再执行一个后续操作以关闭循环。 我们能够使用 makefile.init 使一切正常运行、并通过 GEN_opts__flag 变量将符号定义推入编译步骤、该变量是在包含 makefile.init 之前定义的。 这是在 Windows 上运行的 makefile.init 代码段。 它包含在用于检测平台的 if 语句中、我们的 Linux Build Server 也有类似的版本。

    version:=$(SUBST-,,$(外壳 git 描述--long --脏--tags ))
    commit:=$(条带$(word 3,$(version))
    commit_last:=$(条带$(word 2,$(version))
    脏:=$(条带$(word 4,$(version))
    ifneq ($0))
    build_info_commits:=.$(commit_past)
    endif
    ifneq ($(脏)、)
    build_info_m脏:=+
    endif
    
    version_tag:=$(strip $(word 1、$(version)))
    build_info:=$(commit)$(build_info_commit)$(build_info_m脏)
    build_date:=$(sshell date /T)、$(shell time /T)
    build_machine:=$(build_info!!!!!!!!!@
    
    
    
    
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    --define=version_build_info="\"$(build_info)\"\
    --define=version_build_machine="\"$(build_machine)\"\
    --define=version_build_date="\"$(build_date)\""
    

    再次感谢对 eclipse makefile 生成的输入和输出的帮助!

    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Paul、

    感谢您的跟进和发布有关您的解决方案的详细信息。 对于寻找类似内容的其他用户而言、这绝对是一个有用的参考。