web-dev-qa-db-ja.com

CMakeクロスコンパイル:ツールチェーンファイルからのCフラグは無視されます

クロスコンパイルにはcmakeを使用しています。私のツールチェーンファイルには行があります

_SET(CMAKE_C_FLAGS "-std=gnu99")
_

この変数は、CMakeLists.txtでは再度設定されません。

_cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .._を実行すると、このフラグは無視されます。

詳細:_flags.cmake_の行は、空の_C_FLAGS =_行を示しています。しかし、_CMakeOutput.log_には、_Build flags: -std=gnu99_という行があります。

_cmake .._(ツールチェーンファイルを指定してもしなくても同じ)を2回実行すると、この問題が修正されることがわかりました。

しかし、cmakeを初めて実行したときに設定されないのはなぜですか?

編集:MNWEを追加

CMakeLists.txt:

_cmake_minimum_required(VERSION 2.6)
project(myproject)

SET(files src/main.c)

add_executable(myexec ${files})
_

avr.cmake:

_SET(CMAKE_SYSTEM_NAME Generic)

SET(CMAKE_C_COMPILER avr-gcc)

SET(CMAKE_C_FLAGS "-std=gnu99")
_
21
ejoerns

行を置き換えることで一時的な解決策を見つけました

SET(CMAKE_C_FLAGS "-std=gnu99")

沿って

SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
22
ejoerns

いくつかの背景情報を追加したかっただけです(たとえば、ここで説明します ツールチェーンごとにcmake_c/xx_flagsを設定する方法は? )。

つまり、CMAKE_<LANG>_FLAGS変数は設計によりCMake<Lang>Information.cmakeスクリプトにキャッシュされます(つまり、構成手順の後でCMakeのGUIアプリケーションで変数を変更できます)。

したがって、 Toolchain ファイルに設定する場合は-最初にキャッシュに配置する必要があります。 CMake独自のスクリプト(ツールチェーンファイルの後に実行)にはFORCEが付属していないため、再度上書きされることはありません。

CMakeCInformation.cmake(share\cmake-2.8\Modulesから)を見てください:

set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}")
# avoid just having a space as the initial value for the cache
if(CMAKE_C_FLAGS_INIT STREQUAL " ")
  set(CMAKE_C_FLAGS_INIT)
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING
     "Flags used by the compiler during all build types.")

ご覧のとおり、これを行う公式の方法は、CMAKE_C_FLAGS_INITを使用して追加のフラグを挿入することです。問題は、ツールチェーンファイルのその後の変更が認識されないことです(キャッシュは上書きされません。上記を参照)。

これらすべてを考慮に入れると、一時的な解決策が正しい選択です。確かに、ツールチェーンファイルは構成/生成プロセス中に2回解析されるため、ツールチェーンファイルにCMAKE_C_FLAGSを設定する前にUNSET呼び出しを追加することもできます。

UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)

もう1つのよく見られる解決策は、次のようなものを使用することです。

add_definitions(" -std=gnu99")

コンパイルフラグを挿入します(ただし、変数定義がそうであるように、これはビルド構成に対応していません)。参照 CMakeclangおよびc ++ 0x

CMake 2.8.12では、新しいコマンドが導入されたため、次のことが可能になりました(テストされていません。可能性を示すためだけです)。

add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")

詳細については、 CMakeで一般的なコンパイルフラグを設定するための最新の方法は何ですか? および CMakeジェネレータ式、C/C++コードを区別する を参照してください。

14
Florian