コンテンツへスキップ

コンパイル時フラグ

コンパイル時フラグは、マクロメソッドを介してコンパイラから提供されるブール値です。これにより、コンパイル時の条件に基づいてコードの含め除外を条件付きで行うことができます。

コンパイラオプションとターゲットプラットフォームに関する情報を含む、コンパイラによって提供されるいくつかのデフォルトフラグがあります。ユーザー提供のフラグはコンパイラに渡され、機能フラグとして使用できます。

フラグの照会

フラグは、設定されているかどうかの名前付き識別子です。状態は、マクロメソッドflag?を介してコードから照会できます。文字列またはシンボリテラルとしてフラグの名前を受け取り、フラグの状態を示すboolリテラルを返します。

次のプログラムは、ターゲットOSファミリを出力することにより、コンパイル時フラグの使用を示しています。

{% if flag?(:unix) %}
  puts "This program is compiled for a UNIX-like operating system"
{% elsif flag?(:windows) %}
  puts "This program is compiled for Windows"
{% else %}
  # Currently, all supported targets are either UNIX or Windows platforms, so
  # this branch is practically unreachable.
  puts "Compiling for some other operating system"
{% end %}

また、ホストプラットフォームにフラグが設定されているかどうかを返すマクロメソッドhost_flag?もあります。これは、クロスコンパイル中にターゲットプラットフォーム(flag?で照会)とは異なる場合があります。

コンパイラ提供のフラグ

コンパイラは、いくつかの暗黙的なフラグを定義します。ターゲットプラットフォームまたはコンパイラオプションのいずれかを記述します。

ターゲットプラットフォームフラグ

プラットフォーム固有のフラグは、ターゲットトリプルから派生します。プラットフォームサポートで、サポートされているターゲットプラットフォームのリストを参照してください。

crystal --versionは、コンパイラのデフォルトのターゲットトリプルを表示します。これは、--targetオプションで変更できます。

次の表の各フラグは、*(派生)*とマークされているものを除いて、相互に排他的です。

アーキテクチャ

ターゲットアーキテクチャは、ターゲットトリプルの最初のコンポーネントです。

フラグ名 説明
aarch64 AArch64アーキテクチャ
avr AVRアーキテクチャ
arm ARMアーキテクチャ
i386 x86アーキテクチャ(32ビット)
wasm32 WebAssembly
x86_64 x86-64アーキテクチャ
bits32 (派生) 32ビットアーキテクチャ
bits64 (派生) 64ビットアーキテクチャ

ベンダー

ベンダーは、ターゲットトリプルの2番目のコンポーネントです。これは通常使用されないので、最も一般的なベンダーはunknownです。

フラグ名 説明
macosx Apple
portbld FreeBSDバリアント
unknown 不明なベンダー

オペレーティングシステム

オペレーティングシステムは、ターゲットトリプルの3番目のコンポーネントから派生します。

フラグ名 説明
bsd (派生) BSDファミリ(DragonFlyBSD、FreeBSD、NetBSD、OpenBSD)
darwin Darwin(MacOS)
dragonfly DragonFlyBSD
freebsd FreeBSD
linux Linux
netbsd NetBSD
openbsd OpenBSD
solaris Solaris/illumos
unix (派生) UNIXライク(BSD、Darwin、Linux、Solaris)
windows Windows

ABI

ABIは、ターゲットトリプルの最後のコンポーネントから派生します。

フラグ名 説明
android Android(Bionic Cランタイム)
armhf (派生) ハードフロート付きARM EABI
gnu GNU
gnueabihf ハードフロート付きGNU EABI
msvc Microsoft Visual C++
musl musl
wasi Web Assembly System Interface
win32 (派生) Windows API

コンパイラオプション

コンパイラは、コンパイラの構成に基づいてこれらのフラグを設定します。

フラグ名 説明
release コンパイラはリリースモードで動作します(--releaseまたは-O3 --single-module CLIオプション)
debug コンパイラはデバッグシンボルを生成します(--no-debug CLIオプションなし)
static コンパイラは静的にリンクされた実行可能ファイルを作成します(--static CLIオプション)
docs コードはAPIドキュメントを生成するように処理されます(crystal docsコマンド)
interpreted インタプリタで実行中(crystal i

ユーザー提供のフラグ

ユーザー提供のフラグは自動的には定義されません。これらは、--defineまたは-Dコマンドラインオプションを介してコンパイラに渡すことができます。

これらのフラグは通常、破壊的な新機能またはレガシー機能、新機能のプレビュー、またはまったく異なる動作(デバッグ目的など)を有効にする機能を有効または無効にします。

$ crystal eval -Dfoo 'puts {{ flag?(:foo) }}'
true

標準ライブラリの機能

これらのフラグは、Crystalプログラムをビルドするときに標準ライブラリの機能を有効または無効にします。

フラグ名 説明
gc_none ガベージコレクションを無効にします(#5314
debug_raise raiseロジックのデバッグフラグ。発生させる前にバックトレースを出力します。
preview_mt マルチスレッドプレビューを有効にします。0.28.0で導入されました(#7546
skip_crystal_compiler_rt Crystalのネイティブcompiler-rt実装を除外します。
tracing ランタイムトレースのサポートを有効にしてビルドします。
use_libiconv iconvシステムライブラリの代わりにlibiconvを使用します
use_pcre2 正規表現エンジンとしてPCRE2を使用します(従来のPCREの代わりに)。1.7.0で導入されました。
use_pcre 正規表現エンジンとしてPCREを使用します(PCRE2の代わりに)。1.8.0で導入されました。
win7 Windows 7にWin32 WinNT APIを使用します
without_iconv iconv/libiconvをリンクしません
without_openssl OpenSSLサポートなしでビルド
without_zlib Zlibサポートなしでビルド

コンパイラ機能

これらのフラグは、Crystalプログラムをビルドするときのコンパイラ機能を有効または無効にします。

フラグ名 説明
no_number_autocast 数値式は自動型変換されません。リテラルのみです。
no_restrictions_augmenter 拡張された制限拡張機能を無効にします。1.5で導入されました(#12103)。
preview_dll Windowsでの動的リンクを有効にします。実験的です。
preview_overload_order defオーバーロード間のより堅牢な順序付けを有効にします。1.6で導入されました(#10711)。
preview_win32_delay_load Windowsで全てのDLLの遅延読み込みを有効にします。実験的です。
strict_multi_assign 一対多の代入に対して厳密なセマンティクスを有効にします。1.3.0で導入されました(#11145, #11545)

コンパイラビルド機能

これらのフラグは、Crystalコンパイラをビルドするときの機能を有効または無効にします。

フラグ名 説明
without_ffi libffiなしでコンパイラをビルドします。
without_interpreter インタプリタサポートなしでコンパイラをビルドします。
without_playground playground (crystal play) なしでコンパイラをビルドします。
i_know_what_im_doing コンパイラの意図しないビルドに対する安全ガードです。

ユーザーコード機能

カスタムフラグは、コンパイラ提供のフラグや他のユーザー定義のフラグと衝突しない限り、ユーザーコードで自由に使用できます。シャード固有のフラグを使用する場合は、シャード名をプレフィックスとして使用することをお勧めします。