You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Python构建脚本向GCC正确传递Git短哈希字符串?

问题:将Git短哈希传递给GCC编译器时出现编译错误

问题背景

使用Python编写RT-Thread项目构建脚本,已成功通过以下代码获取Git短哈希:

def get_git_revision_short_hash() -> str:
    return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()

GIT_REV = get_git_revision_short_hash()

但尝试通过CFLAGS += ' -DGIT_REV=' + GIT_REV传递给编译器时,出现编译错误:

<command-line>: error: 'fa23128' undeclared (first use in this function)

项目中通过RT-Thread的LOG_I宏使用该宏:

LOG_I("Git Revision:%s", GIT_REV);

错误原因

直接传递-DGIT_REV=fa23128时,C预处理器会将GIT_REV替换为标识符fa23128,而非字符串常量。C编译器会尝试查找该标识符的定义,导致"未声明"错误。

解决方案

需要将Git哈希以字符串常量的形式传递给编译器,即在哈希值两端添加引号。在Python脚本中拼接CFLAGS时,要正确处理引号的转义:

正确的CFLAGS拼接方式

替换原脚本中注释掉的行,推荐使用更简洁的f-string写法:

CFLAGS += f' -DGIT_REV=\"{GIT_REV}\"'

也可以用传统字符串拼接:

CFLAGS += ' -DGIT_REV=\"' + GIT_REV + '\"'

这样传递给GCC的参数会变成-DGIT_REV="fa23128",预处理器会将GIT_REV替换为字符串常量"fa23128",符合C代码中%s格式化符的要求。

修改后的完整构建脚本

import os
import subprocess

def get_git_revision_short_hash() -> str:
    return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()


# toolchains options
ARCH='arm'
CPU='cortex-a'
CROSS_TOOL='gcc'

if os.getenv('RTT_CC'):
    CROSS_TOOL = os.getenv('RTT_CC')

# only support GNU GCC compiler.
PLATFORM    = 'gcc'
EXEC_PATH   = r'/usr/bin'
GIT_REV = get_git_revision_short_hash()

print(GIT_REV)

if os.getenv('RTT_EXEC_PATH'):
    EXEC_PATH = os.getenv('RTT_EXEC_PATH')
EXEC_PATH = '/home/rain/opt/gcc-arm-none-eabi-10.3-2021.10/bin'

BUILD = 'debug'

if PLATFORM == 'gcc':
    # toolchains
    PREFIX = 'arm-none-eabi-' 
    CC = PREFIX + 'gcc'
    CXX = PREFIX + 'g++'
    AS = PREFIX + 'gcc'
    AR = PREFIX + 'ar'
    LINK = PREFIX + 'gcc'
    TARGET_EXT = 'elf'
    SIZE = PREFIX + 'size'
    OBJDUMP = PREFIX + 'objdump'
    OBJCPY = PREFIX + 'objcopy'
    STRIP = PREFIX + 'strip'

    #DEVICE = ' -march=armv7-a -mcpu=cortex-a7 -marm -msoft-float '
    DEVICE = ' -mcpu=cortex-a7 -marm -msoft-float '    
    #DEVICE = ' -march=armv7-a'
    CFLAGS = DEVICE + ' -Wall' #+ ' -mfpu=neon-vfpv4' + ' -mfloat-abi=hard'
    AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ -I.'
    LINK_SCRIPT = 'link.lds'
    LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors'+
                      ' -T %s' % LINK_SCRIPT

    CPATH = ''
    LPATH = ''

    # generate debug info in all cases
    AFLAGS += ' -gdwarf-2'
    CFLAGS += ' -g -gdwarf-2'

    if BUILD == 'debug':
        CFLAGS += ' -Ofast'
    else:
        CFLAGS += ' -O2'
        
    # 正确传递Git哈希为字符串常量
    CFLAGS += f' -DGIT_REV=\"{GIT_REV}\"'

    CXXFLAGS = CFLAGS + ' -Woverloaded-virtual -fno-exceptions -fno-rtti'

    M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC '
    M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC'
    M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\
                                    ' -shared -fPIC -nostartfiles -nostdlib -static-libgcc'
    M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n'

    POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' +\
                  SIZE + ' $TARGET \n'

内容的提问来源于stack exchange,提问作者rain62ster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:45:08