build CFDG with macOS

macOSでcfdgをbuildする

cfdg の command line 版が欲しかったのだけどmacOS版は公式 release package に含まれてないのでどうやら自分で build するしかない。 ググっても全然出てこないのでたぶん必要な人は少なさそうだけど、自分でbuildした顛末を記す。

  • macOS Monterey version 12.0.1
  • Xcode 13.1
  • Homebrew 3.3.5

source は GitHub から取ってくる。

git clone https://github.com/MtnViewJohn/context-free.git

追加で必要なものをhomebrewで入れておく

brew install bison flex libagg libpng

command line 版をbuildするには、 Xcodecontext-free/Context Free.xcodeproj を開いて、 Product → Scheme から cfdg を選んで ⌘B

たぶんbuild errorになるけど、以下、一々fixのやりかた。

(1) code signing

error: No signing certificate "Mac Development" found:

正しくはApple Developer Programに加入すればいいのだろうけどどうせ自分しか使わないので下記でやり過ごすことにする。

  • Project(Context Free) → TARGETS(cfdg) → Signing & Capabilities → Signing
    • Team: None
    • Signing Certificate: Sign to Run Locally

(2) bison が古い問題

macOS付属のbisonが 2.3で、いま必要なbisonは3以上みたいなので、homebrewで入れたやつに差し替える。 homebrew の flexとbisonはOS付属のやつと競合しないようにするために、PATHの通ったところには入らない様子。

  • Project(Context Free) → TARGETS(cfdg) → Build Rules → Lex source files using Script

    • (前) /usr/local/bin/flex
    • (後) $HOMEBREW_PREFIX/opt/flex/bin/flex
  • Project(Context Free) → TARGETS(cfdg) → Build Rules → Yacc source files using Script

    • (前) /usr/local/bin/bison
    • (後) $HOMEBREW_PREFIX/opt/bison/bin/bison

flexのversionは2.6.4でOS付属のやつと同じだったけど念の為flexもhomebrew版にしておく。

(3) libpngとlibaggを追加

#include "agg2/agg_basics.h"

などで not found になるので、libaggとlibpng の header fileのある場所をheader search pathに追加すればよい。

  • Header Search Pathに追加
    • $HOMEBREW_PREFIX/include
  • Libarry Search Pathに追加
    • $HOMEBREW_PREFIX/lib

困ったことに agg で keyword register が compile error になってしまう。

  • homebrew版 Anti-Grain Geometry (AGG) - Version 2.5
  • context free同梱版 Anti-Grain Geometry - Version 2.4

context free同梱版の src-agg だとcompileは通るので、とりあえずそっちに。

  • Header Search Pathに追加(homebrewのinculdeよりも上に)
    • path to context free/src-agg

headerとlibagg.a がズレるけどそこからは目を逸らして。

(4) unicode/ucnv.h が無い

これはどこから持ってくるのが正解なのかよくわからないのだけど、公式っぽい匂いのする https://opensource.apple.com からmacOS 11.5 をたどって WTF を download した。 tar zxvf して中に含まれている icu を header search path に追加したらcompileできた。

  • Header Search Pathに追加
    • path to WTF-7611.3.10.1.3/icu

その icu/README にこんなこと書いてあるのでたぶんこのやりかたで良いはず。

macOS releases include the ICU binary, but not ICU headers.

(5) flex が吐いた source で error

Out-of-line definition of 'LexerInput' does not match any declaration in 'CfdgFlexLexer'
Out-of-line definition of 'LexerOutput' does not match any declaration in 'CfdgFlexLexer'

どうやら FlexLexer.h とズレているっぽいので、 homebrewのflex/includeを header search path に追加してやればよいらしい。

  • Header Search Pathに追加
    • $HOMEBREW_PREFIX/opt/flex/include

ここまででbuildは成功するはず。

(6) 実行時error

code signing の問題で libpng16.16.dylib に対して not valid 的なerror message が出る。

Disable Library Validation にすることで、ここは乗り切る。

  • Project(Context Free) → TARGETS(cfdg) → Signing & Capabilities → Hardened Runtime
    • [✓] Disable Library Validation

使い方

cfdg -s 500 input/tree.cfdg tree.png

例 フォルダ内にある *.cfdg ファイルを全て png 化する bash スクリプト

for f in *.cfdg ; do cfdg -s 500 $f ${f%.*}.png ; done