3

I'm learning/vetting CMake at the moment as I'm thinking of migrating our code to it. One thing we do a lot of with our current make system is to "subproject" common code files. For example, we have a lot of shared, generic headers (plus some c/cpp files) which get included in every project we create. I want to replicate this in CMake but I don't see an easy way of doing it. To be precise, I want to do something like:

Parent CMakeLists.txt

add_subdirectory(shared_folder shared_build_folder)

#Next line should somehow add in the files reference in the shared_folder
add_executable([specific files for this project] build_folder)

Child CMakeLists.txt (shared_folder)

#Somehow have a list of files here that get added to the parent project

So far I've found various "ways" of doing this, but all seem a little hacky. I'm coming to the conclusion that this is in fact the way I have to do things and CMake isn't really geared towards this style of development. For clarity, most of my solutions involve doing something like creating a variable at the parent level which consists of a list of files. This variable (via some shenanigans) can get "passed" to/from any children, filled in and then when I call add_exectuable I use that variable to add the files.

All my solutions involve quite a few macros/functions and seemingly quite a bit of overhead. Is this something other people have tried? Any clues on the best approach for doing this?

Thanks Andrew

4

1 に答える 1

1

私たちはまったく同じ問題に直面しており、しばらく泣いた後、CMake の方法を受け入れました。結果として、構造の一部を変更することを意味していたとしても、より構造化されたプロジェクトになりました。

サブディレクトリを使用する場合、ステートメントが処理されると、ターゲットはプロジェクト全体に自動的にエクスポートされます (後続の add_subdirectory 呼び出しでも) add_subdirectory。共通コードを含むサブプロジェクトはライブラリを作成します。

PARENT_SCOPE変数を親 CMakeLists.txt にエクスポートするために使用できるもあります

「その他の」ものについては、.cmake-files をメインの CMakeLists.txt にinclude. そうすることで、変数を簡単に提供したり、 を変更したりinclude_directories、プロジェクトにグローバルなその他の凝ったことを行うことができます。

cmake 変数間に依存関係がないため、cmake を使用してソース (プロジェクトの機能) を構成するのではなく、ビルド (コンパイラ、インクルード、ライブラリなど) のみを構成します。この分割は、ビルド システム リファクタリングの重要な要素でした。

于 2012-10-09T18:45:06.067 に答える