fractal flame作成ソフトのflam3をさくらインターネットのスタンダードプランで使用できるようにインストールするメモ。
libpngのインストール
まずlibpngがインストールされていないため、ユーザーローカルにインストールする。適宜サーバーとバージョンは選択。
wget https://sourceforge.net/projects/libpng/files/libpng16/1.6.25/libpng-1.6.25.tar.gz tar zxvf libpng-1.6.25.tar.gz cd libpng-1.6.25 ./configure --prefix=$HOME/local make make install ls $HOME/local/lib
libpng.aなどがインストールされれば成功。次にflam3のソースをダウンロードする。
flam3のインストール
Scott Draves氏のgitがどうも現在の最新版らしく、エラーも少ないようだ。
configureのオプションで、–prefixによってインストール先を、LDFLAGSによってlibpngがインストールされているユーザーローカルを指定する。
ほかのオプションはいらないかも。CFLAGSはsincosのエラーを回避するために入れたが、関係ないようだ。
wget https://github.com/scottdraves/flam3/archive/master.tar.gz tar zxvf master.tar.gz cd flam3-master ./configure CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" CFLAGS="-lm" --prefix=$HOME/local make
このmakeでvariations.cでのコンパイルエラーが起こる。
こんな感じ。どうやらsincosが定義されてないようだ。
variations.c:1968: undefined reference to `sincos' ./.libs/libflam3.a(variations.o): In function `var80_whorl': variations.c:1727: undefined reference to `sincos' ./.libs/libflam3.a(variations.o): In function `var65_lazysusan': variations.c:1438: undefined reference to `sincos' ./.libs/libflam3.a(variations.o): In function `var49_disc2': variations.c:1083: undefined reference to `sincos' ./.libs/libflam3.a(variations.o): In function `var25_fan2': variations.c:633: undefined reference to `sincos'
根本的な理由はわからないので
https://ffmpeg.org/pipermail/ffmpeg-user/2014-July/022383.html
を参考にvariations.cの30行目くらいに以下を追加した
void sincos(double x, double* p_sin, double* p_cos) { *p_sin = sin(x); *p_cos = cos(x); } void sincosf(float x, float* p_sinf, float* p_cosf) { *p_sinf = sinf(x); *p_cosf = cosf(x); } void sincosl(long double x, long double* p_sinl, long double* p_cosl) { *p_sinl = sinl(x); *p_cosl = cosl(x); }
これで修正完了。あとは
make make install
でユーザーローカルにインストールされる。
テストファイルをレンダリングして、00000.png,00001.pngが生成されれば成功。
./flam3-render < test.flam3
以下はメモ
google storageに残っているflam3のソースは古く、libpng周りでエラーが出る。
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/flam3/flam3-3.0.1.tar.gz
png.c: In function ‘read_png’:
png.c:145: error: dereferencing pointer to incomplete type
png.c:164: error: dereferencing pointer to incomplete type
png.c:166: error: dereferencing pointer to incomplete type
png.c:170: error: dereferencing pointer to incomplete type
png.c:171: error: dereferencing pointer to incomplete type
png.c:173: error: dereferencing pointer to incomplete type
png.c:175: error: dereferencing pointer to incomplete type
png.c:176: error: dereferencing pointer to incomplete type
png.c:185: error: dereferencing pointer to incomplete type
png.c:189: error: dereferencing pointer to incomplete type
png.c:195: error: dereferencing pointer to incomplete type
png.c:197: error: dereferencing pointer to incomplete type
png.c:199: error: dereferencing pointer to incomplete type
png.c:220: error: dereferencing pointer to incomplete type
*** [png.lo] Error code 1
http://stackoverflow.com/questions/10507610/libpng-1-5-10-error-dereferencing-pointer-to-incomplete-type
によるとlibpngの新バージョンでは構造体が消去されたせい。以下のようにpng.cを修正して、上記のようにvariations.cを修正すればコンパイルが通った。
145行目
for (y = 0 ; y < info_ptr->height ; y++)
for (y = 0 ; y < png_get_image_height( png_ptr, info_ptr) ; y++)
164行目
if (8 != info_ptr->bit_depth) {
if (8 != png_get_bit_depth(png_ptr, info_ptr)) {
166行目
info_ptr->bit_depth);
png_get_bit_depth(png_ptr, info_ptr));
170行目
*width = info_ptr->width;
*width = png_get_image_width( png_ptr, info_ptr);
171行目
*height = info_ptr->height;
*height = png_get_image_height( png_ptr, info_ptr);
173行目
png_image = (png_byte **)malloc (info_ptr->height * sizeof (png_byte*));
png_image = (png_byte **)malloc (png_get_image_height( png_ptr, info_ptr) * sizeof (png_byte*));
175行目
linesize = info_ptr->width;
linesize = png_get_image_width( png_ptr, info_ptr);
176行目
switch (info_ptr->color_type) {
switch (png_get_color_type(png_ptr, info_ptr)) {
185行目
info_ptr->color_type);
png_get_color_type(png_ptr, info_ptr));
189行目
for (y = 0 ; y < info_ptr->height ; y++) {
for (y = 0 ; y < png_get_image_height( png_ptr, info_ptr) ; y++) {
195行目
for (y = 0 ; y < info_ptr->height ; y++) {
for (y = 0 ; y < png_get_image_height( png_ptr, info_ptr) ; y++) {
197行目
for (x = 0 ; x < info_ptr->width ; x++) {
for (x = 0 ; x < png_get_image_width( png_ptr, info_ptr) ; x++) {
199行目
switch (info_ptr->color_type) {
switch (png_get_color_type(png_ptr, info_ptr)) {
220行目
for (y = 0 ; y < info_ptr->height ; y++)
for (y = 0 ; y < png_get_image_height( png_ptr, info_ptr) ; y++)