CMake调用CMAKE_CA65816_COMPILE_OBJECT时如何拆分<INCLUDES>重复-I参数
问题原因
自定义汇编语言编译规则时,<INCLUDES>内置变量的展开逻辑由对应语言的包含参数前缀配置决定。未给CA65816架构单独配置包含参数前缀时,CMake只会将所有包含目录以空格拼接,仅保留规则里手动写的第一个-I,最终生成不符合ca65参数规范的命令。
解决方法
方法1:原生配置(推荐)
CMake为每个编程语言预留了专门的包含参数前缀配置项,配置后<INCLUDES>会自动为每个包含目录添加指定前缀,无需手动拼接。
在设置编译规则前添加如下配置:
# 配置CA65816语言的包含目录参数前缀 set(CMAKE_INCLUDE_FLAG_CA65816 "-I") # ca65不区分普通包含目录与系统包含目录,配置相同参数即可 set(CMAKE_INCLUDE_SYSTEM_FLAG_CA65816 "-I")
将原编译规则中的-I <INCLUDES>修改为直接引用<INCLUDES>,修改后完整配置:
set( CMAKE_CA65816_COMPILE_OBJECT "<CMAKE_CA65816_COMPILER> --cpu 65816 -s -o <OBJECT> <SOURCE> <INCLUDES>")
配置后生成的编译命令会自动在每个包含目录前添加独立的-I参数,完全符合ca65的参数要求。
方法2:生成器表达式拼接(兼容旧版CMake)
若使用的CMake版本较低,方法1不生效,可以直接通过生成器表达式读取目标包含目录属性,手动拼接参数,无需依赖<INCLUDES>变量。修改后的编译规则配置:
set(CMAKE_CA65816_COMPILE_OBJECT "<CMAKE_CA65816_COMPILER> --cpu 65816 -s -o <OBJECT> <SOURCE> $<IF:$<BOOL:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>>,-I,>$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I >" )
该写法通过$<JOIN>表达式将所有包含目录以-I为分隔符拼接,同时判断包含目录为空的场景,避免输出多余的空参数。
内容的提问来源于stack exchange,提问作者Michael Malura
相关产品推荐
相关产品推荐

