macOSでcube20.orgをコンパイルする
目的
CWEBという記法で書かれたソースコードをMacでコンパイル・実行したい。なんかエラーが出た。Linuxはチョットモデキナイ。なんとか解決したい。運良くできて気分がいいので記録しておく。
必要なものとか
OS: macOS High Sierra 10.13.3
brewで以下をインストール:
brew install gcc
(gcc-7 (Homebrew GCC 7.3.0))
brew install cweb
cube20.orgとは
このページを見ている人には不要かと思われますが、一応説明。
cube20.orgは、ルービックキューブがいかなる合法な状態にあっても、そこから20手以下で6面が揃った状態に戻せることを証明した数学者やプログラマーなど計4人のグループによるウェブサイトです。合法な、というのは、小さいキューブをバラバラにしないで、各面の回転のみで実現できる、という意味です。ちなみにルービックキューブ
は登録商標です。
このサイトでは、彼らが証明に用いたルービックキューブのソルバープログラムのソースコードが公開されています。丁寧なことに使い方も説明されています。とりあえず置いてあるファイルを全てダウンロードしておきます。
彼らはこのプログラムをLinux上で動かしたっぽいです。まあVMなりでLinux使えよという話ではありますがMacでできないのかとも思いますよね? 私は思いました。
CWEBって何
このソースコード、拡張子が.w
なのですが、何でしょうこれ。CWeb systemと書いてあります。ググるとこのページが見つかります、分かりやすいと思います。細かいことはよく分かりませんが、どうやら1つのファイルから実行ファイルとそのドキュメントを生成できるようです。さらに、ソースコードはC/C++、ドキュメントはTeXによる記述であるようです。
これのコンパイルにはctangle
とcweave
というコマンドが必要なようです。brew install cweb
によってこの2つのコマンドが使用できるようになります。
ここまでで準備が整ったはずなので、指示通りmake
します。
clang: warning: -O4 is equivalent to -O3 [-Wdeprecated] clang: warning: -O4 is equivalent to -O3 [-Wdeprecated] clang: warning: -O4 is equivalent to -O3 [-Wdeprecated] clang: warning: -O4 is equivalent to -O3 [-Wdeprecated] clang: warning: -O4 is equivalent to -O3 [-Wdeprecated] twophase.w:215:21: error: reference to 'mutex' is ambiguous pthread_mutex_lock(&mutex); ^ twophase.w:204:17: note: candidate found by name lookup is 'mutex' pthread_mutex_t mutex;
なんかwarningが出て、直後にerror: mutex
という参照が曖昧だと怒られました。
warningの雰囲気から、どうもここではclang
ではなくgcc
を使うことが想定されてるっぽいので、素直にそうしてみます。makefile
内に6か所ある$(CXX)
から始まる行がそれで、これはシステムのデフォルトのコンパイラを呼び出すみたいですね。これらを全てg++-7
に置換してしまいましょう。
ここでもう一度make
してみます。私は念のため新しく生成されたファイルは全て削除しました。すると
cubepos.w: In function 'int main(int, char**)': cubepos.w:1620:9: error: 'getpid' was not declared in this scope srand48(getpid()+time(0)) ; ^~~~~~ cubepos.w:1620:9: note: suggested alternative: 'getenv' srand48(getpid()+time(0)) ; ^~~~~~ getenv make: *** [cubepos_test] Error 1
先ほどのエラーは消えましたが、今度はgetpid
なんてものはないと怒られました。ググるとincludeが必要らしいことが分かります。
LinuxだとincludeなしでOKなことがあるんですかね。分かりませんがcubepos.w
の適当な位置に2行追加します。
#include <sys/types.h> #include <unistd.h>
3度目の正直、make
します。
Done. (No errors were found.) This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdftex) restricted \write18 enabled. entering extended mode (./cubepos.tex ! I can't find file `cwebmac'. l.1 \input cwebmac Press Enter to retry, or Control-D to exit) lease type another input file name:
C++ソースコードのコンパイルは無事完了したようです。今度はcwebmac
というファイルがないぞと怒られました。これ何なんですかね、sudo tlmgr install cwebmac
としてみましたがダメでした。どこかからcwebmac.tex
みたいなのをダウンロードしてきて然るべき場所に置けばいいんでしょうか。どなたか教えてください。
ですが今はドキュメントは必要ありませんしそもそもサイトからダウンロードできるのでCtrl+D
で終了します。
これで6つの実行ファイルが生成されたはずです。お疲れ様でした。
参考
CWEBをC/C++に変換する方法 — cube20.orgをコンパイルする
Ambiguous Reference for type pthread_mutex_t
- Stack Overflow
C++のTips - Unix系OSでプロセスIDを取得するには?
[カショ]の表記 | NHK放送文化研究所