コンパイル時フラグ¶
コンパイル時フラグは、マクロメソッドを介してコンパイラから提供されるブール値です。これにより、コンパイル時の条件に基づいてコードの含め除外を条件付きで行うことができます。
コンパイラオプションとターゲットプラットフォームに関する情報を含む、コンパイラによって提供されるいくつかのデフォルトフラグがあります。ユーザー提供のフラグはコンパイラに渡され、機能フラグとして使用できます。
フラグの照会¶
フラグは、設定されているかどうかの名前付き識別子です。状態は、マクロメソッド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 |
コンパイラの意図しないビルドに対する安全ガードです。 |
ユーザーコード機能¶
カスタムフラグは、コンパイラ提供のフラグや他のユーザー定義のフラグと衝突しない限り、ユーザーコードで自由に使用できます。シャード固有のフラグを使用する場合は、シャード名をプレフィックスとして使用することをお勧めします。