Windows で Keil ARMCC ツールセットを使用して ARM CortexM4 をクロスコンパイルする CMAKE ビルド システムに取り組んでいます
C コンパイラのフラグを次のように設定しました。
set(CMAKE_C_FLAGS "-c --c99 --cpu=Cortex-M4.fp.sp --apcs=interwork --split_sections")
ただし、ARMCC コンパイラには、宛先パスとファイル名の入力を必要とするオプションがあります。たとえば、各 c ソース ファイルについては、オブジェクト ファイルの出力に加えて、次の形式でコンパイラ オプションを追加することで、ソース ブラウザ情報とソースの依存関係も出力する必要があります。
--omf_browse=my_output_path/the_current_source_file.crf and --depend my_output_path/the_current_source_file.d
上記のオプションを CMAKE_C_FLAGS に追加するにはどうすればよいですか?
ありがとう
github.com/vpetrigo/arm-cmake-toolchains を見てください
– ドミトリー・ソコロフ
2020 年 9 月 3 日 16:09
gcc コンパイラには、ファイル名またはパスの入力を必要とするオプションがありません。例からわかるように、gcc コンパイラ フラグは単に「-g3 -Og -Wall -pedantic -DDEBUG」として設定されています。
– チェン
2020 年 9 月 6 日 9:50
基本的に、Thこの質問は、「複数の出力ファイルを生成する 1 つの入力ソース ファイルに対してコンパイラ フラグを設定する方法」と同等です。 armcc コンパイラでは、オブジェクト出力ファイルのほかに、--omf_browse および --depend オプションにより参照情報ファイルと依存ファイルも出力されますが、構文ではファイル名に続いてオプションを指定する必要があります。 Visual Studio C++ コンパイラの PDB ファイルに似ています。CMAKE には、自動的に名前 (サフィックスが異なるソース ファイル名と同じ) を付けるメカニズムが組み込まれています。 armcc コンパイラで同じことを行うにはどうすればよいでしょうか。
– チェン
2020 年 9 月 6 日 10:04
------------------------
簡単な方法は、必要なソース ファイルごとにプロパティ COMPILE_OPTIONS を設定することです。
これがテスト CMakeLists.txt です
project(TestSourceProp)
set(SOURCE_FILES
main.c
file.c
)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
foreach(SRC_ IN LISTS SOURCE_FILES)
get_filename_component(SRC_BASENAME_ ${SRC_} NAME_WE)
set_source_files_properties(${SRC_} PROPERTIES COMPILE_OPTIONS "--omf_browse=${SRC_BASENAME_}.crf;--depend=${SRC_BASENAME_}.d")
get_source_file_property(SRC_PROP_ ${SRC_} COMPILE_OPTIONS)
message(STATUS "${SRC_}: ${SRC_PROP_}")
endforeach()
出力:
...
-- main.c: --omf_browse=main.crf;--depend=main.d
-- file.c: --omf_browse=file.crf;--depend=file.d
-- Configuring done
メイクファイル:
CMakeFiles/TestSourceProp.dir/main.c.obj: ../main.c
@$(CMAKE_COMMAND) -E cmake_echo_color ...
gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) --omf_browse=main.crf --depend=main.d -o CMakeFiles/TestSourceProp.dir/main.c.obj -c ...
もう 1 つの方法は、カスタム CMake ツールチェーン ファイルを作成することだと思います。
1
@Dmirty に感謝します。これは実行可能な回避策でした。それほどエレガントではありませんが、実行可能です。 Scons や Make などの他のビルド システムでは簡単にこれができるのに、CMAKE ではなぜこれほど難しいのかわかりません。
– チェン
2020 年 9 月 9 日 5:52