【CMake】特定のソースコードをビルド対象から除外

# cファイルをビルド対象に加える
file(GLOB_RECURSE SOURCES "*.c")
# 実行ファイル作る
add_executable(unko ${SOURCES})

だいたいCMakeLists.txtを書くとき、こんな感じで「こっから下の階層にあるCファイルを全部ビルド対象に追加しといてねー!シクヨロー!」ってやってるのだけれども、厄介なことにビルド対象から外さないかんソースコードが混ざってるのを忘れてて、ビルドがズッコケちゃう事がある。具体的に言うと、下記のような書き方されてる困ったちゃん。

#include "nanigashi.c"

ちなみに、この「nanigashi.c」は他のCソースからincludeされる前提で書かれてるので、単体でコンパイルすると無慈悲に死ぬ。「ビルドしないんだったらヘッダにしとけばいいじゃん?」と思いはするのだが、古から伝わるソースコードだからおいそれと弄れないのよね。べっ、べつに改造ミスったときに責任負いたくないとかそんなことないんだからね!勘違いしないでよね!

まあ愚痴ってても始まらないので、例のソースをビルド対象から除外する某をCMakeで表現する手段を講じてみよう。この手の案件は基本的に日本語だとあんま情報出てこないので、いつものStackOverFlowとGoogle翻訳の黄金コンビでなんとかしてやろうじゃねえの。
続きを読む 【CMake】特定のソースコードをビルド対象から除外

【CMake】ヘッダファイルの参照を自動で追加したい

CMakeでコンパイラに対してinclude対象のディレクトリを設定するには、include_directories() だとか target_include_directories() がある。現在の推奨は後者らしいのだが、俺の場合わりと小規模なプロジェクト作ることが多いし、引数多いと面倒なので前者を使ってたりする。

# 以降のターゲット全てにincludeディレクトリを適用
include_directories(${INCLUDE_DIRS})
# fuga.exe には上記のinlucdeパスが適用される
add_executable(fuga ${SOURCES})

で、どちらを使うにせよ、予め洗い出しておいたinclude対象パスの一覧をテキトーなリスト(上記で言うところのINCLUDE_DIRS)に入れて渡してやる感じになる。

しかし、色々なディレクトリに参照したいヘッダファイルが散乱してる場合、includeディレクトリを手動で洗い出すのが面倒だ。可能であれば、「ヘッダファイルが入ってるディレクトリ」を勝手に走査して、勝手にリストにぶちこんでほしい。でもそれを外部スクリプトで書いて環境変数にぶちこむのもなんか嫌だし、CMakeLists.txtの中だけで完結させたい。
続きを読む 【CMake】ヘッダファイルの参照を自動で追加したい