さくらインターネットのスタンダードプランでflam3をインストールする

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++)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする