Clangではコンパイルオプションをconfigファイルから読み込むことができるそうなので、macOS環境で試してみました。
Clangのconfigファイルとは
Clangのconfigファイルとは、コンパイルオプションを指定するための設定ファイルのことです。例えば、ある特定のターゲットに対してのコンパイルオプションを事前に設定しておいて、コンパイル時に指定するときなどに役立ちます。Clang Compiler User's Manual1には、例として-L
、-I
、-l
、--sysroot
、codegen
などコンパイル環境依存で設定されるようなオプションが挙げられています。
設定例
--configオプションによる指定
--config
オプションで直接指定する方法です。これが最も一般的だと思います。
$ clang++ --config=a.cfg a.cpp
configファイルにはオプションをそのまま指定します。
-std=c++23
例として、C++23のフィーチャー(std::print2)のために-std=c++23
オプションをa.cfg(ファイル名は任意)で指定することができました。
#include <print>
int main() {
std::print("{}\n", "print");
return 0;
}
オプションは追記して指定することもできます。
-std=c++23
-Wall
また、複数のconfigファイルを読み込ませることもできます。
$ clang++ --config=x.cfg --config=y.cfg a.cpp
デフォルト
デフォルトで参照されるconfigがあるかどうかは、環境依存かと思いますが、筆者の環境でインストールされているClang(Homebrew clang version 19.1.7)では、/opt/homebrew/etc/clang/arm64-apple-darwin24.cfg
が参照されるようになっていました。
このファイルに追記すると、オプションを明示的に指定しなくとも読み込まれるようになります。
ただし、デフォルトのconfigファイルには--isysroot
などシステムライブラリに必要なオプションが設定されていることもあるので、あまり不用意に変更しないほうが良さそうです。
$ clang -v
Homebrew clang version 19.1.7
Target: arm64-apple-darwin24.1.0
Thread model: posix
InstalledDir: /opt/homebrew/Cellar/llvm/19.1.7_1/bin
Configuration file: /opt/homebrew/etc/clang/arm64-apple-darwin24.cfg
--config-user-dir, --config-system-dirでデフォルト参照先を変更する
コンパイル時に--config-user-dir
や--config-system-dir
というオプションを使用することで、userとsystemのデフォルトのconfigディレクトリを変更することができます。上の例での/opt/homebrew/etc/clang
にあるconfigファイルを探索する代わりに、このオプションで設定したディレクトリを探索することになります。
Clang Compiler User's Manual1によると、--config-system-dir
と--config-user-dir
オプションは指定されたディレクトリを探索して、<triple>-<driver>.cfg
という名称のconfigファイルがあれば、それが使われます。(詳しい探索規則は、上記のマニュアルを参照していただければと思います。)
筆者が調べたところの注意点としては、以下がありました。
- 読み込まれるconfigファイルは1つだけ
- 探索規則に沿っていないファイル名(a.cfgなど)は指定ディレクトリ下に存在していても読み込まれない
- このオプションを指定すると、デフォルトのconfigは参照されなくなる
例えば、下記の例では2種類の.cfgファイルのうち、arm64-apple-darwin24-clang++.cfg
が優先的に読み込まれます。1ファイルしか読み込まれないので、arm64-apple-darwin24.cfg
は読み込まれません。
$ ls <path_to_config_dir>
arm64-apple-darwin24.cfg
arm64-apple-darwin24-clang++.cfg
$ clang++ --config-user-dir=<path_to_config_dir> a.cpp
環境
Apple M1
macOS Sequoia 15.1.1
Homebrew clang 19.1.7