SCons 动态构造变量

SCons Dynamic Construction Variable

我想在 SCons 中有一个动态环境变量。

示例:将 -DFILE_NAME=file.c 添加到构建命令。

env['FILE_NAME'] = ['${str($TARGET).upper()}']
env.Append(CPPDEFINES={'FILE_NAME': '$FILE_NAME'})

我不确定这是否可行,但 _concatsource 的文档或 CCPDBFLAGS 的旧文档使它看起来像是可能的。

使用 SCons 3.1.1

这其实是一个bug。解决方法如下。

import hashlib

env = Environment(platform='darwin')
env['CC'] = 'clang'

# env.Append(CPPDEFINES={'SOURCE': '$SOURCE'})
# env.Append(CPPDEFINES={'TARGET': '$TARGET'})

def fileHashGenerator(env, target, source):
    print("'%s' '%s' '%s'" % (env, target, source))
    if source:
        print("has source")

        fileHash = int(hashlib.sha1(source.path.encode()).hexdigest(), 16) % (10 ** 8)
        print(fileHash)
        h = (fileHash).to_bytes(8, byteorder='big').hex()
        print(h)
        return h
    else:
        print("No target", type(target))
    return 'NOTHING'

env['FILE_HASH'] = '${fileHashGenerator(__env__,TARGET,SOURCE)}'

# env.Append(CPPDEFINES={'FILE_HASH': '$FILE_HASH'})
env.Append(CPPFLAGS=['-DFILE_HASH=$FILE_HASH'])
env.Append(CPPFLAGS=['-DFILE_TARGET=${TARGET}'])
env.Append(CPPFLAGS=['-DFILE_SOURCE=$SOURCE'])
env['fileHashGenerator'] = fileHashGenerator

env.Program('main', ['main.c'])

不要使用 CPPDEFINES,而是将其附加到 CPPFLAGS。感谢@bdbaddog 在 SCons discord 中的协助。