我有一个为PPC构建的项目,工具链工作正常,我可以在/opt/poky/1.5下安装sysroot时构建。现在我试图将该安装移动到项目目录(它不是那里的存储库的一部分,它只是安装在那里,所以它不依赖于该修复路径,所以每个人都可以检查项目并构建它没有设置在固定文件夹下的sysroot)。
为实现这一点,我将CMAKE_SYSROOT设置为" $ {PROJECT_SOURCE_DIR} / poky"在执行自定义构建脚本时将安装poky(项目还需要构建一个安全的映像,因此使用构建脚本而不是其他任何东西更简单,这对jenkins来说也很方便)。
由于CMAKE_SYSROOT是从与CMakeTestCCompiler项目不同的PROJECT_SOURCE_DIR构建的,因此cmake调用无法告诉我CCompiler当然坏了。所以我想知道,我应该如何使用相同的CMAKE_SYSROOT变量来编译CMakeTestCCompiler项目,而不改变CMakeTestCCompiler项目本身(当然)。
不知怎的,我无法在任何地方找到答案,似乎没有人遇到过这个问题(坦率地说我无法理解,这应该是我认为的常见设置)。 (或者,就CMAKE而言,我可能只是一个菜鸟太多了,我很乐意承认)
我对以下解决方案不感兴趣:"只需安装一个固定路径"或者......请,我需要这样的设置,我有理由。
THX用于阅读/尝试/回答/帮助 祝你有愉快的一天
在CMakeLists.txt(顶级CMakeFile所以任何版本都应该使用它):
`SET(CMAKE_SYSROOT "${PROJECT_SOURCE_DIR}/poky/sysroots")`
在ToolchainCMake中(以cMAKE_TOOLCHAIN_FILE的形式提供给cmake的那个):
`SET(CMAKE_SYSTEM_NAME Linux)`
`SET(CMAKE_SYSTEM_VERSION 1)`
`SET(CMAKE_SYSROOT "${PROJECT_SOURCE_DIR}/poky/sysroots")`
`SET(COMPILER_ROOT ${PROJECT_SOURCE_DIR}/poky/sysroots/i686-pokysdk-linux/usr/bin/powerpc-poky-linux-gnuspe)`
`SET(CMAKE_C_COMPILER ${COMPILER_ROOT}/powerpc-poky-linux-gnuspe-gcc)`
`SET(CMAKE_CXX_COMPILER ${COMPILER_ROOT}/powerpc-poky-linux-gnuspe-g++)`
`MESSAGE("CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")`
`MESSAGE("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")`
`MESSAGE("COMPILER_ROOT: ${COMPILER_ROOT}")`
`SET(CMAKE_FIND_ROOT_PATH ${SYS_ROOT}/ppce500v2-poky-linux-gnuspe)`
`SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)`
`SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)`
`SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)`
我用过
`set(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "")`
`set(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "")`
设置模拟CMakeTestCCompiler构建成功并意识到我面临一些额外的问题:似乎在系统而不是CMAKE_SYSROOT文件夹中查找包。甚至试过
`SET(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})`
尝试强制搜索,但没有运气。在CMakeError.log中我可以看到,编译器本身配置了前缀选项,该选项指向/opt/poky/1.5,我想要的路径"覆盖",现在我不确定是否编译器甚至可以处理备用路径。
我觉得有必要添加这些信息,但它们并没有真正增加手头的问题。
我在上面的cmake中也发现了一些错误:
`SET(CMAKE_SYSROOT "${PROJECT_SOURCE_DIR}/poky/sysroots")`
必须是
`SET(CMAKE_SYSROOT "${PROJECT_SOURCE_DIR}/poky/sysroots/ppce500v2-poky-linux-gnuspe")`
而不是
`SET(CMAKE_FIND_ROOT_PATH ${SYS_ROOT}/ppce500v2-poky-linux-gnuspe)`
更改为
`SET(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})`
答案 0 :(得分:1)
编辑:整个答案已更改。
我首先怀疑问题是${PROJECT_SOURCE_DIR}
中CMAKE_TOOLCHAIN_FILE
的值未知,因为它是在 CMakeLists.txt
之前处理。但这不是真的。
我有类似的问题(CMake 2.8.12.2),一切正常,当我通过CC
环境变量和--sysroot
选项传递交叉编译器时,即调用CMake如下:
CC="arm-linux-gnueabi-gcc --sysroot=/path/to/sysroot" cmake /path/to/sources
当我切换到使用工具链文件时,CMake开始报告C编译器无法正常工作。
要解决此问题,我使用CMakeForceCompiler包。零件工具链文件(以及评论)我认为是相关的:
include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
# Force compiler - only option that actually works
cmake_force_c_compiler (${TOOLCHAIN_PATH}/bin/arm-linux-gnueabi-gcc GNU)
cmake_force_cxx_compiler(${TOOLCHAIN_PATH}/bin/arm-linux-gnueabi-g++ GNU)
# NOTE: CMAKE_SYSROOT doesn't work as expected
add_definitions("--sysroot=${TOOLCHAIN_SYSROOT}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${TOOLCHAIN_SYSROOT}" CACHE INTERNAL "" FORCE)
请注意,TOOLCHAIN_PATH
和TOOLCHAIN_SYSROOT
是我之前设置的本地变量。