やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

cscスクリプト(複数ファイルをビルド&実行)

 子孫ディレクトリにあるコードも対象。再帰的。

成果物

コード

 実行コマンド。

csbuild

Run() {
    . "$(cd $(dirname $0); pwd)/csbuild.sh"
    BuildAndRun $@
}
Run $@

 ライブラリ。

csbuild.sh

CallCsc() { csc -nologo -recurse:*.cs $@; }
CallChmod() { chmod ${2:-755} ${1:-Program.exe}; }
RunExe() { ./${1:-Program.exe}; }
BuildAndRun() {
    CallCsc $@
    CallChmod
    RunExe
}

説明

 ポイントは以下。

CallCsc() { csc -nologo -recurse:*.cs $@; }
  • カレントディレクトリ配下にある.csファイルすべてをビルドする
  • ロゴを出さない
  • csbuildコマンド引数をそのままcscに渡す

実行

最小限

 以下のC#コードを用意する。

Program.cs

class Program { static void Main() => System.Console.WriteLine("Hello world"); }

 ビルドスクリプトを実行する。

csbuild

 実行までされるため、以下の出力がされる。

Hello world

複数ファイルもOK

 子孫ディレクトリにあるファイルもOK。

  • Program.cs
  • sub/
    • Code0.cs

Program.cs

class Program { static void Main() { new Code0().Run(); } }

Code0.cs

class Code0 { public void Run() => System.Console.WriteLine("Code0"); }

 ビルドスクリプトを実行する。

csbuild

 実行までされるため、以下の出力がされる。

Code0

問題

  • エントリポイントstatic void Main()が必要
  • エントリポイントを含んだクラスの名前はProgram固定のみ
    • さもなくば実行ファイルは生成されても実行できない

所感

 次回はこの問題を解決するスクリプトを書きたい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux