オフィスアワーがそろそろ始まるよ!()

ビルドコマンド

Zenコンパイラには様々なコマンドが実装されています。ここでは、Zenコンパイラが備えているコマンドについて説明します。

Zenコンパイラのビルドコマンドおよびビルドオプションを表示するには、次のコマンドを実行します。

zen

すると次のような出力が見られます。

The Zen Language Compiler
VersionID 0.7.0+57e8cff5 (stage1)
Copyright (C) 2015-18 Andrew Kelley.
Copyright (C) MMXVIII kristopher tate & connectFree Corporation.
All rights reserved. Visit us online at https://www.zen-lang.org/
Usage: zen [command] [options]

Commands:
  build                        build project from build.zen
  build-exe [source]           create executable from source or object files
  build-lib [source]           create library from source or object files
  build-obj [source]           create object from source or assembly
  builtin                      show the source code of that @import("builtin")
  cc                           C compiler
  fmt                          parse files and render in canonical zen format
  id                           print the base64-encoded compiler id
  init-exe                     initialize a `zen build` application in the cwd
  init-lib                     initialize a `zen build` library in the cwd
  libc [paths_file]            Display native libc paths file or validate one
  run [source] [-- [args]]     create executable and run immediately
  translate-c [source]         convert c code to zen code
  translate-c-2 [source]       (exp) self-hosted translate-c
  targets                      list available compilation targets
  test [source]                create and run a test build
  version                      print version number and exit
  meditation                   find meaning in zen

Compile Options:
  --c-source [options] [file]  compile C source code
...

ここでは、ZenのコマンドであるCommandsについて解説します。

プロジェクト初期化コマンド

Zenプロジェクトのテンプレートを生成するコマンドです。作成したテンプレートプロジェクトは、zen buildコマンドでビルドすることが可能です。

  • init-exe
  • init-lib

init-exe

カレントディレクトリにアプリケーションプロジェクトを作成するためのコマンドです。プロジェクト名 (バイナリ名) は、デフォルトではカレントディレクトリ名となります。

$ mkdir init-exe && cd $_
$ zen init-exe
Created build.zen
Created src/main.zen

Next, try `zen build --help` or `zen build run`

これでテンプレートプロジェクトが自動生成されます。ディレクトリ構造は次のようになっています。

├── build.zen
└── src
    └── main.zen

1 directory, 2 files

このプロジェクトは、次のコマンドでビルドおよび実行することができます。

zen build run

ビルドされたバイナリは、zen-cache/bin下にinit-exeというファイル名で生成されています。

init-lib

カレントディレクトリにライブラリプロジェクトを作成するためのコマンドです。プロジェクト名 (ライブラリ名) は、デフォルトではカレントディレクトリ名となります。

$ mkdir init-lib && cd $_
$ zen init-lib
Created build.zen
Created src/main.zen

Next, try `zen build --help` or `zen build test`

これでテンプレートプロジェクトが自動生成されます。ディレクトリ構造は次のようになっています。

.
├── build.zen
└── src
    └── main.zen

1 directory, 2 files

このプロジェクトは、次のコマンドでビルドすることができます。

ノート: ライブラリプロジェクトは実行バイナリを生成しないことに注意して下さい。

zen build

ビルドされたライブラリは、zen-cache/lib下にlibinit-lib.aというファイル名で生成されています。

また、次のコマンドでプロジェクト内のテストを実行することができます。

zen build test

ビルドコマンド

ソースコードをビルドするためのコマンドです。

  • build
  • build-exe
  • build-lib
  • build-obj

build

buildコマンドはZenのビルドスクリプトbuild.zenでプロジェクトをビルドするためのコマンドです。zen buildコマンドはプロジェクトのディレクトリ内であれば、どこからでも利用することができます。Zenコンパイラは、カレントディレクトリもしくは親ディレクトリを辿ってbuild.zenがないかどうか探します。

例えば、次のコマンドを実行した時、zen buildは全て成功します。

$ mkdir build && cd $_
$ zen init-exe
$ ls
build.zen  src
# カレントディレクトリに`build.zen`がある
$ zen build

$ cd src
# 親ディレクトリに`build.zen`がある
$ zen build

$ mkdir child && cd $_
# 親の親ディレクトリに`build.zen`がある
$ zen build

--build-fileオプションでビルドスクリプトを指定することも可能です。

$ mkdir build && cd $_
$ zen init-exe
# 親ディレクトリに移動
$ cd ..
$ mkdir tmp && cd $_
# そのまま`zen build`を実行すると`build.zen`が見つからず、失敗する
$ zen build
No 'build.zen' file found, in the current directory or any parent directories.
Initialize a 'build.zen' template file with `zen init-lib` or `zen init-exe`,
or see `zen --help` for more options.
# `--build-file`でビルドスクリプトを指定すればビルドできる
$ zen build --build-file ../build/build.zen

ビルドスクリプトには、新しいステップを追加することができます。zen init-exeで作成するプロジェクトテンプレートのビルドスクリプトにはinstall / uninstall / runのステップが追加されています。そのため、zen build runとするとビルドを実行した上で、プログラムを実行します。

ビルドスクリプトについては、10.3 ビルドスクリプトで詳しく説明します。

build-exe

実行ファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。

  • zen build-exe <Zenソースファイル>
  • zen build-exe --object <オブジェクトファイル> --name <実行バイナリ名>
  • zen build-exe --c-source <Cソースファイル>

実行例を示します。

# 新しいディレクトリを作成して移動する
$ mkdir build-exe && cd $_

次の内容でmain.zenを作成します。

const std = @import("std");

pub fn main() anyerror!void {
    std.debug.warn("Hello World!\n");
}

main.zenをビルドします。

$ zen build-exe main.zen

# 実行ファイル`main`とオブジェクトファイル`main.o`が生成される
$ ls
main  main.o  main.zen
# `main`を実行する
$ ./main
Hello World!

Zenのソースファイルからビルドしましたが、オブジェクトファイルから実行ファイルを生成することもできます。

# `--object`オプションで`main.o`を指定する
# `--name`オプションで実行バイナリ名`main_from_obj`を指定する
$ zen build-exe --object main.o --name main_from_obj
$ ./main_from_obj
Hello World!

C言語のソースファイルをビルドすることもできます。次の内容でc_main.cファイルを作成します。

#include <stdio.h>

int main(void) {
    printf("Hello from C World!\n");
    return 0;
}

次のコマンドでビルドを実行します。--libraryオプションについては、10.2 ビルドオプションで説明しますが、ここではC言語の標準ライブラリを利用するために必要です。

# `--c-source`オプションで`c_main.c`を指定する
# libcをリンクするために`--library`オプションを利用する
$ zen build-exe --c-source c_main.c --library c
$ ./c_main
Hello from C World!

build-exeでZenソースファイルを指定する場合、指定するファイルにはpubで公開されたmain関数が必要なことに注意して下さい。

build-lib

ライブラリファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。

  • zen build-lib <Zenソースファイル>
  • zen build-lib --object <オブジェクトファイル> --name <ライブラリ名>
  • zen build-lib --c-source <Cソースファイル>

実行例を示します。

mkdir build-lib && cd $_

次の内容でadd.zenを作成します。

pub fn add(a: u32, b: u32) u32 {
    return a + b;
}

add.zenをライブラリとしてビルドします。

$ zen build-lib add.zen
# `add.h`と`libadd.a`が生成される
$ ls
add.h  add.o  add.zen  libadd.a

ライブラリとしてビルドする場合、ZenコンパイラはデフォルトでC言語からライブラリを利用するためのCヘッダファイルを生成します。今回の場合、add.hの中身は実質、何もありません。C言語にAPIを公開する場合は、C ABIに従う関数を定義しなければなりません。詳細は、14. Cとのインタフェースを参照して下さい。

オブジェクトファイルからライブラリを生成する場合は、以下のコマンドになります。

$ zen build-lib --object add.o --name add_from_obj

C言語のソースファイルからライブラリを作成する場合、以下のコマンドを実行します。

$ zen build-lib --c-source c_add.c

c_add.cは例えば、次のような内容で作成します。この場合、C言語の標準ライブラリを使用していないため、上のコマンドでも--library cは不要です。

int add(int a, int b) {
    return a + b;
}

build-obj

オブジェクトファイルをソースファイルからビルドします。以下のいずれかの形式で利用します。

  • zen build-obj <Zenソースファイル>
  • zen build-obj --c-source <Cソースファイル>

基本的な利用方法はbuild-libと同様です。

実行コマンド

ソースコードをビルドし、(ビルドが成功すれば) アプリケーションを実行、もしくは、テストを実行します。

  • run
  • test

run

アプリケーションとしてソースコードをビルドし、アプリケーションを実行します。ソースファイルにpubで公開されたmain関数が存在していなければなりません。

以下は実行例です。

次の内容でmain.zenを作成します。

const std = @import("std");

pub fn main() void {
    std.debug.warn("Hello World!\n");
}

次のコマンドでmain.zenを実行します。

zen run main.zen
Hello World!

test

指定したソースコードとそのソースコードが依存するソースコード内に含まれるテストをビルドし、実行します。

以下は実行例です。

次の内容でadd.zenを作成します。

const std = @import("std");
const ok = std.testing.ok;

fn add(a: u32, b: u32) u32 {
    return a + b;
}

test "test add" {
    ok(add(1, 2) == 3);
}

次のコマンドでadd.zenのテストを実行します。

$ zen test add.zen 
1/1 test "test add"...OK
All tests passed.

コードフォーマッタコマンド

Zenコンパイラ組込みのコードフォーマッタです。Zenで推奨するコーディングスタイルにソースコードを修正します。

  • fmt

コマンドは次の形式で実行できます。

$ zen fmt <ファイル名 or ディレクトリ名>

複数のファイル名とディレクトリ名を指定することも可能です。ディレクトリを指定した場合、ソースコードを再帰的に検索し、フォーマットを実行します。

fmtコマンドのオプションです。

Options:
   --help                 ヘルプを表示します
   --color [auto|off|on]  エラーメッセージを色付きで出力するかどうかを有効化 / 無効化します
   --stdin                標準入力からフォーマットするソースコードを入力し、標準出力に出力します
   --check                ソースコードの修正は行わず、フォーマット違反があった場合のみ、報告します

ヘルプ表示コマンド

Zenコンパイラが保有している情報を表示するためのコマンドです。

  • builtin
  • targets

builtin

Zenコンパイラに組み込まれている型や列挙型の情報を表示します。

zen builtin

表示される内容の詳細は、7.1 組込み定数を参照して下さい。

targets

Zenコンパイラがサポートするターゲット環境一覧を表示します。

$ zen targets

ターゲット環境情報は、アーキテクチャ、OS、ABIがそれぞれ出力されます。これら3つをハイフン (-) で接続し、-targetオプションに指定します。-targetオプションの使用方法は、10.2 ビルドオプションを参照して下さい。

また、Available libscにC言語標準ライブラリのlibcが利用可能なターゲット一覧が表示されます。

C言語コマンド

Zen言語はC言語との相互運用を重要視しています。これらのコマンドは、C言語との相互運用を行うためのものです。

  • cc
  • libc
  • translate-c

cc

Zenコンパイラは、C言語コンパイラ (clang) のドライバを内包しています。このコマンドは、Zenコンパイラを使用して、C言語のソースコードをビルドします。

使用例を示します。

次のCソースファイルmain.cを用意します。

int add(int a, int b) {
    	return a + b;
}

次のコマンドでCソースファイルをコンパイルします。

$ zen cc main.c

a.outが出力されるので実行します。

$ ls
a.out  main.c

$ ./a.out

zen ccclangのドライバであるため、clangのオプションを指定することが可能です。下記コマンドでヘルプを表示できます。

$ zen cc --help

libc

ネイティブ環境にインストールされているlibcを検出し、結果を出力します。結果をファイルに保存し編集すると、クロスコンパイル時にlibcを指定する際に利用することができます。

$ zen libc

次のコマンドでlibcコマンドのヘルプを表示できます。

$ zen libc --help

translate-c

C言語のソースコードをZenのソースコードに変換します。結果は標準出力に出力されるため、ファイルへリダイレクトして使用します。

次のようなmain.cがあるとします。

int add(int a, int b) {
    	return a + b;
}

次のコマンドで、main.cmain.zenに変換します。

$ zen translate-c main.c > main.zen

main.zenの先頭を表示すると、C言語のソースコードがZenのソースコードに変換されていることが確認できます。

pub export fn add(a: c_int, b: c_int) c_int {
    return a + b;
}

main.zenの続きには、C言語で定義されている定数が変換されています。

その他

  • id
  • version
  • meditation

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2019 connectFree Corporation. All rights reserved.
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.