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
相关产品推荐
相关产品推荐

