鬱! 鬱すぎてうつほ物語になった!w

主に食べたラーメンについて記録を残すために開設されたブログです。他のことも書くかもしれません。

macOSでcube20.orgをコンパイルする

目的

CWEBという記法で書かれたソースコードMacコンパイル・実行したい。なんかエラーが出た。Linuxはチョットモデキナイ。なんとか解決したい。運良くできて気分がいいので記録しておく。

必要なものとか

OS: macOS High Sierra 10.13.3

Homebrew

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による記述であるようです。

これのコンパイルにはctanglecweaveというコマンドが必要なようです。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放送文化研究所