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

RetroBSD Makefile转CMake:Shell输出重定向编译问题解决

迁移RetroBSD Makefile到CMake:Shell管道编译的问题与解决

将RetroBSD项目的Makefile迁移至CMake时,卡在了模拟原Makefile中Shell脚本输出重定向到编译器的逻辑上。原Makefile通过printf生成代码,再通过管道传给编译器编译成目标文件。尝试用add_custom_target实现时,无论是否设置VERBATIM,生成的Makefile都会出现引号或转义字符问题,导致编译器无法识别CFLAGS参数,最终通过移除CMAKE_C_FLAGS定义中的引号和COMMAND中的引号解决了问题。

原始Makefile片段

all:            ../libc.a

../libc.a:      ../ar ../ranlib $(OBJS)
                ../ar rc $@ $(OBJS)
                ../ranlib $@

$(OBJS):     $(LIBCDIR)/mips/sys/SYS.h
                @echo creating $*.o
                @printf '#include "SYS.h"
SYS($*)
' | $(CMAKE_C_COMPILER) $(CMAKE_C_FLAGS) - -c -o $*.o

尝试的CMakeLists.txt片段

cmake_minimum_required(VERSION 3.20)
project(myRetroBSD_native_libc LANGUAGES C)

set(OBJ_FILES
__sysctl
accept
)

set(OBJECT_OUTPUT_DIR ${CMAKE_BINARY_DIR}/objs)

file(MAKE_DIRECTORY ${OBJECT_OUTPUT_DIR})

foreach(OBJ_FILE ${OBJ_FILES})

    file(GENERATE OUTPUT ${OBJECT_OUTPUT_DIR}/${OBJ_FILE}.sh CONTENT "printf '#include \"SYS.h\"\nSYS(${OBJ_FILE})\n'")
    
    add_custom_target(
        ${OBJ_FILE} ALL
        COMMAND bash "${OBJECT_OUTPUT_DIR}/${OBJ_FILE}.sh | ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} - -c -o ${OBJECT_OUTPUT_DIR}/${OBJ_FILE}.o "
        VERBATIM
    )

endforeach()

错误信息

mips-sde-elf-gcc: error: unrecognized argument in option '-mips32r2 -EL -msoft-float -nostdinc -fshort-double -Os -I/home/gartnerd/code/myretrobsd/include -x assembler-with-cpp -c -B/home/gartnerd/code/myretrobsd/lib/ -I/home/gartnerd/code/myretrobsd/src/libc/mips/sys -I/usr/local/mips-2013.11/mips-sde-elf/include/sys -DLWHI=lwr -DLWLO=lwl -DSWHI=swr -DSWLO=swl'
mips-sde-elf-gcc: note: valid arguments to '-mips' are: 1 2 3 32 32r2 4 64 64r2

解决方案

修正CMAKE_C_FLAGS定义

移除CFLAGS定义中的引号,让每个编译选项作为独立参数传递:

set(CMAKE_C_FLAGS -mips32r2 -EL -msoft-float -nostdinc -fshort-double -Os -I${TOPSRC}/include -x assembler-with-cpp -c -B${TOPSRC}/lib/)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -I${TOPSRC}/src/libc/mips/sys -I/usr/local/mips-2013.11/mips-sde-elf/include/sys -DLWHI=lwr -DLWLO=lwl -DSWHI=swr -DSWLO=swl)

修改COMMAND行

去掉COMMAND中的引号,确保管道命令能正确解析每个参数:

COMMAND bash ${OBJECT_OUTPUT_DIR}/${OBJ_FILE}.sh | ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} - -c -o ${OBJECT_OUTPUT_DIR}/${OBJ_FILE}.o 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:08:30