2016-12-14 9 views
1

ARM 32/64プラットフォーム用のjavascript評価用にDuktapeを使用します。 特定のプラットフォーム&アーキテクチャ用にのみDuktapeを構築したいと思います。すべての範囲ではありません。特定のプラットフォーム用のDuktapeを構築する(ARM 32/ARM 64)

私が成功し、それを構築することができ、そうです:

python tools/configure.py \ 
    --source-directory src-input \ 
    --platform linux \ 
    --architecture arm32 \ 
    --config-metadata config/ \ 
    --option-file arm32_config.yaml \ 
    --output-directory /tmp/arm32  

arm32_config.yaml:

DUK_USE_32BIT_PTRS: true 
DUK_USE_64BIT_OPS: false 
DUK_USE_FATAL_HANDLER: false 

ビルド・パスusually.Thatの偉大な!

ラズベリーパイ(単にテストのためにそれを使用)で

#include "duktape.h" 

int main(int argc, char *argv[]) { 
    duk_context *ctx = duk_create_heap_default(); 
    duk_eval_string(ctx, "print('Hello world!');"); 
    duk_destroy_heap(ctx); 
    return 0; 
} 

Makefile.helloファイル:

DUKTAPE_SOURCES = src/arm32/duktape.c 

# Compiler options are quite flexible. GCC versions have a significant impact 
# on the size of -Os code, e.g. gcc-4.6 is much worse than gcc-4.5. 

CC = gcc 
CCOPTS = -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer 
CCOPTS += -I./src/arm32 # for combined sources 
CCLIBS = -lm 
CCOPTS += -DUK_USE_32BIT_PTRS 
CCOPTS += -DUK_USE_64BIT_OPS 
CCOPTS += -DUK_USE_FATAL_HANDLER 

# For debugging, use -O0 -g -ggdb, and don't add -fomit-frame-pointer 

hello: $(DUKTAPE_SOURCES) hello.c 
    $(CC) -o [email protected] $(DEFINES) $(CCOPTS) $(DUKTAPE_SOURCES) hello.c $(CCLIBS) 

私はのhello.cを持って

それも動作します!

しかし、私は、私はいつもrecivedきた ./helloプログラムを起動しようとしているとき: セグメンテーションフォールト

は私のミスで指摘してもらえ、私が見逃している何? ありがとうございます!

PS:gccのバージョン4.9.2(Raspbian 4.9.2-10)

答えて

1

あなたが最も可能性が高い持っている主な問題は、(2.0.0のリリースとなります)Duktapeマスターから作業しているということです組み込みの "print()"バインディングは提供されなくなりました。そのため、エラーがスローされます。

致命的なエラーが発生するように、eval呼び出しをラップする保護された呼び出しがないため、このエラーは検出されません。意図的なsegfault(これはデバッガがアタッチできるようにする)を引き起こすデフォルトの致命的なエラー動作を引き起こす致命的なエラーハンドラ(duk_create_heap()またはDUK_USE_FATAL_HANDLERを使用)を提供しないためです。

したがって、最も簡単な修正は、print()バインディングを定義し、致命的なエラーハンドラおよび/またはevalの保護された呼び出しを追加することです。ここでは(evalのを実行する前に)結合プリントを追加する例は()です:

static duk_ret_t native_print(duk_context *ctx) { 
    duk_push_string(ctx, " "); 
    duk_insert(ctx, 0); 
    duk_join(ctx, duk_get_top(ctx) - 1); 
    printf("%s\n", duk_safe_to_string(ctx, -1)); 
    return 0; 
} 

/* ... before doing eval(): */ 
duk_push_c_function(ctx, native_print, DUK_VARARGS); 
duk_put_global_string(ctx, "print"); 

その他のマイナーコメント:

  • Duktapeのduk_config.hは、プラットフォームを検出し、あなたが構築しているターゲット。 Duktapeは実際にはバイナリに関する限り、 "すべてのターゲットに対して"ビルドすることはありません。だから、duk_config.hに複数のプラットフォームを置いても、結果はそれほど大きくなりません。
  • arm32_config.yamlに値は必要ありません。 ARM32は自動的に検出されるはずです。
  • あなたが使用しているMakefile.helloは、Duktape 1.xから(適応しています)、コンパイルしているコードはDuktapeマスターからです。CCOPTSオプションは、Duktapeのマスター(tools/configure.pyに入ります)によって無視され、例のフォーマットが間違っています。 -DUK_USE_FATAL_HANDLERは、プリプロセッサ値UK_USE_FATAL_HANDLERを定義します。
+0

詳細な説明をありがとうございました! –

+0

低メモリデバイス用にduktapeを最適化する必要がある場合はどうすればよいですか?私は 'config.yaml'を使ってコンパイルのステップでそれを行う必要があると考えました。 ' DUK_USE_JX:偽 DUK_USE_DEBUG_BUFSIZE:1024 .... ' は、それはまだ有効ですか? –

+0

https://github.com/svaarala/duktape/blob/master/doc/low-memory.rstに記載されている、多くのメモリ不足のオプションがあります(ここにリストするには多すぎます)。低メモリオプションは通常、フットプリントを得るために何か(パフォーマンスまたは機能性)をトレードオフするので、最適なオプションは特定のターゲットアプリケーションに依存します。たとえばを使用します。 'DUK_USE_LIGHTFUNC_BUILTINS:false'、' DUK_USE_JX:false'はフットプリントを減らすためのすべての可能なステップです。 –

関連する問題