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

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

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

#include "nanigashi.c"

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

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

ここのアンサー見るとlist(REMOVE_ITEM…)を使う方法と、list(FILTER EXCLUDE…)を使う方法が提示されてた。パッと見てREMOVE_ITEMのほうがシンプルで良さそうだったのだが、ちょうどディレクトリ構造を頻繁に変えてるところだったので、ある程度ファイルパスがガバガバでも許されるように正規表現を使いたかった。公式のドキュメント眺めてみたけれども、REMOVE_ITEMで正規表現使えるかよくわからんかったので、あからさまにREGEX使えそうなFILTERでやってみることにした。

# cファイルをビルド対象に加える
file(GLOB_RECURSE SOURCES "*.c")
# ただし「nanigashi.c」はビルド対象から外す
list(FILTER SOURCES EXCLUDE REGEX ".*nanigashi.c$")
# 実行ファイル作る
add_executable(unko ${SOURCES})

とりま、これでうまく目的のファイルがビルド対象から除外されていることを確認できた。やったぜ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)