2016-11-10 150 views
3

CMake文檔建議在交叉編譯時設置CMAKE_CROSSCOMPILING。在我的CMakeLists.txt我有臺詞:如何檢測到我在CMakeLists.txt中進行交叉編譯?

IF(CMAKE_CROSSCOMPILING) 
    message(STATUS "Cross-compiling so skipping unit tests.") 
    option(GAME_PORTAL_UNIT_TEST "Enable unit testing of Game Portal code" OFF) 
ELSE() 
    message(STATUS "Enabling unit testing of Game Portal code") 
    option(GAME_PORTAL_UNIT_TEST "Enable unit testing of Game Portal code" ON) 
ENDIF() 

從運行輸出:

cmake -DCMAKE_TOOLCHAIN_FILE=../crosscompile/raspberry_pi/CMakeCross.txt . 

包括「啓用的遊戲門戶代碼進行單元測試」的文字,如此清楚這個變量沒有被設置無論如何,它無論如何評估爲真。

我試圖修改CMakeCross.txt包括:

set(CMAKE_CROSSCOMPILING ON CACHE BOOL "Cross-compiling" FORCE) 

和清洗老CMakeCache.txt並重新運行我的cmake的命令,我可以看到,新CMakeCache.txt現在包括這個變量之後,但我仍然得到與之前單元測試啓用相同的結果。

如何可靠地檢測到我正在交叉編譯,因此我可以正確禁用單元測試?

按照要求,全交叉編譯文件是:

# Set minimum cmake version required for cross-compiling to work. 
cmake_minimum_required(VERSION 2.6) 
# Build with rm CMakeCache.txt; cmake -DCMAKE_TOOLCHAIN_FILE=/home/crosscompile/dev/raspberry_pi/CMakeCross.txt .. 

# Set target system name. 
SET (CMAKE_SYSTEM_NAME Linux) 

# Set compiler name. 
SET (CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) 
SET (CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) 

# Set path(s) to search for libraries/binaries/headers. 
SET (CMAKE_FIND_ROOT_PATH /home/crosscompile/dev/raspberry_pi/rootfs/) 

# Ensure only cross-compiler directories are searched. 
SET (ONLY_CMAKE_FIND_ROOT_PATH TRUE) 

# search for programs in the build host directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
# for libraries and headers in the target directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

# Set output/install directory to safe place. 
SET (CMAKE_INSTALL_PREFIX /home/crosscompile/dev/raspberry_pi/install/) 

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rpath-link=/lib/arm-linux-gnueabihf") 
set(THREADS_PTHREAD_ARG 0) 
set(CMAKE_CROSSCOMPILING ON CACHE BOOL "Cross-compiling" FORCE) 
+0

從我所看到的是你必須設置這個變量在您的工具鏈文件中爲true。示例:http://stackoverflow.com/questions/6476203/how-can-i-make-cmake-use-specific-compiler-and-flags-when-final-compilation-stag – Hayt

+0

@Hayt:不,它應該是足以在工具鏈文件中設置變量'CMAKE_SYSTEM_NAME'。之後,應該自動設置變量'CMAKE_CROSSCOMPILING'。對於作者:顯示工具鏈文件本身。 – Tsyvarev

+0

@Tsyvarev啊好吧知道:) – Hayt

回答

1

CMAKE_CROSSCOMPILING的測試必須在CMakeLists.txt中的「項目」指令之後。

1

隨着在源版本,一個需要手動清理構建文件當改變配置參數很多。

例如,如果你沒有本地構建之前,然後再決定交叉編譯,則需要進行手動清除:從一個構建類型CMake的不能自動調整build目錄到另一個。

這是爲什麼不推薦使用源內版本的原因之一,應該用源外版本替換。

+0

這是一個乾淨的回購。我根本沒有做過本地構建。此外,我一直在定期清理所有CMake生成的文件。 – AlastairG

+0

我只是做了下面的刪除所有的CMake生成的文件後: 的mkdir建立 CD打造 cmake的-DCMAKE_TOOLCHAIN_FILE = ../.. // crosscompile/raspberry_pi/CMakeCross.txt .. – AlastairG

+0

我可能錯了,但'CMakeCache .txt'不是唯一需要清理以切換到交叉編譯的文件。如果你的源代碼目錄不是乾淨的(從以前的版本),那麼你不能執行源代碼構建。實際上,我無法想象其他原因,爲什麼在工具鏈文件中設置「CMAKE_SYSTEM_NAME」不會導致設置「CMAKE_CROSSCOMPILING」。 – Tsyvarev

0

這是工作在我的例子:

  • 的CMakeLists.txt
 
    cmake_minimum_required(VERSION 3.0) 
    project(STM32F4Examples C)  

    set(CMAKE_CROSSCOMPILE OFF CACHE BOOL "is crosscompiled") 
    message(STATUS "CMAKE_CROSSCOMPILE ${CMAKE_CROSSCOMPILE}") 
  • CMakeToolChain_STM32F4.txt
 
    # cmake toolchain 
    # Use this file with cmake -DCMAKE_TOOLCHAIN_FILE=[PATH/TO/This/FILE] PATH/TO/SOURCES 

    set(CMAKE_CROSSCOMPILE ON CACHE BOOL "is crosscompiled" FORCE)