LZHAM Packer per Emscripten nach JavaScript kompilieren?!?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hätte gern https://github.com/richgel999/lzham_codec/ in JavaScript genutzt... (Für PyPyJS, siehe auch: http://www.python-forum.de/viewtopic.ph ... 37#p278537 )

Leider gibt es keine JavaScript Implementierung: https://github.com/richgel999/lzham_codec/issues/9

Aber mit Emscripten könnte man es eigentlich übersetzten.

Ich hab es auch versucht, aber kein Erfolg gehabt :(

Was ich gemacht hab:

Ich hab emsdk-portable.tar.gz unter ~/emsdk_portable ausgepackt und dann:

Code: Alles auswählen

# Vorbereitung:
~ $ sudo apt-get install build-essential cmake nodejs
~ $ cd ~/emsdk_portable

~/emsdk_portable $ ./emsdk update
~/emsdk_portable $ ./emsdk install latest
~/emsdk_portable $ ./emsdk activate latest
Danach gibt es das erste Problem (siehe auch https://github.com/kripken/emscripten/issues/3296 ):

Code: Alles auswählen

~/emsdk_portable $ emcc -v
WARNING  root: cannot check node version: [Errno 2] No such file or directory
INFO     root: (Emscripten: Running sanity checks)
Checking JS engine ['node'] failed. Check ~/.emscripten. Details: [Errno 2] No such file or directory
CRITICAL root: The JavaScript shell used for compiling (['node']) does not seem to work, check the paths in ~/.emscripten
Bugfix: in ~/.emscripten die Zeile NODE_JS = 'node' in NODE_JS = 'nodejs' ändern.
Dann funktioniert es anscheinend:

Code: Alles auswählen

~/emsdk_portable $ emcc -v
INFO     root: (Emscripten: Running sanity checks)
emcc (Emscripten gcc/clang-like replacement) 1.33.0
clang version 3.7.0 (https://github.com/kripken/emscripten-fastcomp-clang/ 2a66b5ffba63f1e36458d41fafc2874a1abf63fe) (https://github.com/kripken/emscripten-fastcomp/ e2939f6878307899c17d1a23f51ba3fe5afbe6af)
Target: i686-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.1
Selected GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8
Candidate multilib: .;@m32
Selected multilib: .;@m32
INFO     root: (Emscripten: Running sanity checks)
Damit sollte emscripten eingerichtet sein und es kann los gehen:

Code: Alles auswählen

~/emsdk_portable $ git clone https://github.com/richgel999/lzham_codec.git
~/emsdk_portable $ cd lzham_codec
~/emsdk_portable/lzham_codec $ mkdir build
~/emsdk_portable/lzham_codec $ cd build
~/emsdk_portable/lzham_codec/build $ cmake ..
...
-- Build files have been written to: ~/emsdk_portable/lzham_codec/build

~/emsdk_portable/lzham_codec/build $ make
Scanning dependencies of target lzhamdecomp
[  5%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_assert.cpp.o
[ 10%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_checksum.cpp.o
[ 15%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_huffman_codes.cpp.o
[ 20%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_lzdecompbase.cpp.o
[ 25%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_lzdecomp.cpp.o
[ 30%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_mem.cpp.o
[ 35%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_platform.cpp.o
[ 40%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_prefix_coding.cpp.o
[ 45%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_symbol_codec.cpp.o
[ 50%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_timer.cpp.o
[ 55%] Building CXX object lzhamdecomp/CMakeFiles/lzhamdecomp.dir/lzham_vector.cpp.o
Linking CXX shared library liblzhamdecomp.so
[ 55%] Built target lzhamdecomp
Scanning dependencies of target lzhamcomp
[ 60%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_lzbase.cpp.o
[ 65%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_lzcomp.cpp.o
[ 70%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_lzcomp_internal.cpp.o
[ 75%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_lzcomp_state.cpp.o
[ 80%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_match_accel.cpp.o
[ 85%] Building CXX object lzhamcomp/CMakeFiles/lzhamcomp.dir/lzham_pthreads_threading.cpp.o
Linking CXX shared library liblzhamcomp.so
[ 85%] Built target lzhamcomp
Scanning dependencies of target lzhamdll
[ 90%] Building CXX object lzhamdll/CMakeFiles/lzhamdll.dir/lzham_api.cpp.o
Linking CXX shared library liblzhamdll.so
[ 90%] Built target lzhamdll
Scanning dependencies of target lzhamtest
[ 95%] Building CXX object lzhamtest/CMakeFiles/lzhamtest.dir/timer.cpp.o
[100%] Building CXX object lzhamtest/CMakeFiles/lzhamtest.dir/lzhamtest.cpp.o
Linking CXX executable lzhamtest
[100%] Built target lzhamtest

~/emsdk_portable/lzham_codec/build $ emmake make
[ 55%] Built target lzhamdecomp
[ 85%] Built target lzhamcomp
[ 90%] Built target lzhamdll
[100%] Built target lzhamtest

und nun die Stelle an der es nicht weiter geht:

Code: Alles auswählen

+ cd lzham_codec
+ cd build
+ emcc -O3 -I../include/ -I../lzhamdll/ ./lzhamdll/liblzhamdll.so ./lzhamdecomp/liblzhamdecomp.so ./lzhamcomp/liblzhamcomp.so -o lzham.js
WARNING  root: emcc: cannot find library "lzhamdll"
WARNING  root: emcc: cannot find library "lzhamdecomp"
WARNING  root: emcc: cannot find library "lzhamcomp"
ERROR    root: no input files
note that input files without a known suffix are ignored, make sure your input files end with one of: ('.c', '.C', '.i', '.cpp', '.cxx', '.cc', '.c++', '.CPP', '.CXX', '.CC', '.C++', '.ii', '.m', '.mi', '.mm', '.mii', '.bc', '.o', '.obj', '.dylib', '.so', '.a', '.ll', '.h', '.hxx', '.hpp', '.hh', '.H', '.HXX', '.HPP', '.HH')
Die Dateien existieren allerdings:

Code: Alles auswählen

~/emsdk_portable $ ls -la lzham_codec/build/lzhamdll
insgesamt 44
drwxr-xr-x 3 jens jens  4096 Jun 16 09:11 .
drwxr-xr-x 7 jens jens  4096 Jun 16 09:11 ..
drwxr-xr-x 3 jens jens  4096 Jun 16 09:11 CMakeFiles
-rw-r--r-- 1 jens jens  2213 Jun 16 09:01 cmake_install.cmake
-rwxr-xr-x 1 jens jens 18194 Jun 16 09:01 liblzhamdll.so
-rw-r--r-- 1 jens jens  7213 Jun 16 09:01 Makefile

~/emsdk_portable $ ls -la lzham_codec/build/lzhamdecomp
insgesamt 164
drwxr-xr-x 3 jens jens   4096 Jun 16 09:11 .
drwxr-xr-x 7 jens jens   4096 Jun 16 09:11 ..
drwxr-xr-x 3 jens jens   4096 Jun 16 09:11 CMakeFiles
-rw-r--r-- 1 jens jens   2145 Jun 16 09:01 cmake_install.cmake
-rwxr-xr-x 1 jens jens 129201 Jun 16 09:01 liblzhamdecomp.so
-rw-r--r-- 1 jens jens  18286 Jun 16 09:01 Makefile

~/emsdk_portable $ ls -la lzham_codec/build/lzhamcomp
insgesamt 152
drwxr-xr-x 3 jens jens   4096 Jun 16 09:11 .
drwxr-xr-x 7 jens jens   4096 Jun 16 09:11 ..
drwxr-xr-x 3 jens jens   4096 Jun 16 09:11 CMakeFiles
-rw-r--r-- 1 jens jens   2223 Jun 16 09:01 cmake_install.cmake
-rwxr-xr-x 1 jens jens 122512 Jun 16 09:01 liblzhamcomp.so
-rw-r--r-- 1 jens jens  13022 Jun 16 09:01 Makefile

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Auf `make` folgt meist ein `make install`. Hattest du das schon aufgerufen? In deinen Shell-Ausgaben sehe ich den Aufruf nämlich nicht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wobei ich den ja nicht installieren will. oder macht es mehr, als die fertigen Dateien an passender Stelle hin kopieren?!?

EDIT: Genau, will Dateien ins System kopieren:

Code: Alles auswählen

+ make install
[ 55%] Built target lzhamdecomp
[ 85%] Built target lzhamcomp
[ 90%] Built target lzhamdll
[100%] Built target lzhamtest
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/lzham_dynamic_lib.h
CMake Error at cmake_install.cmake:36 (FILE):
  file INSTALL cannot copy file
  "/home/jens/emsdk_portable/lzham_codec/include/lzham_dynamic_lib.h" to
  "/usr/local/include/lzham_dynamic_lib.h".


make: *** [install] Fehler 1

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jens hat geschrieben:Wobei ich den ja nicht installieren will. oder macht es mehr, als die fertigen Dateien an passender Stelle hin kopieren?!?
Normalerweise nicht. Ich hatte die Shell-Ausgaben nur oberflächlich betrachtet und nicht gesehen, dass du erstmal nur "bauen" willst.

Als nächstes fällt mir noch diese Zeile ins Auge:

Code: Alles auswählen

emcc -O3 -I../include/ -I../lzhamdll/ ./lzhamdll/liblzhamdll.so ./lzhamdecomp/liblzhamdecomp.so ./lzhamcomp/liblzhamcomp.so -o lzham.js
Ist es richtig, dass die "lzham"-Verzeichnisse überall unter "." (also: aktueller Standort im Verzeichnisbaum) referenziert werden, aber demgegenüber sich "-I../lzhamdll/" auf das höherliegende Verzeichnis bezieht? Ist das möglicherweise ein Tippfehler?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

da bin ich mir nicht sicher. Es gibt auf jeden Fall "../include"

Der ganze Verzeichnisbaum hier -> https://gist.github.com/jedie/f5ea72c35ea6f6aa8183

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, ich halte mich besser zurück. Soviel Erfahrung habe ich dann leider auch nicht mit dem Kompilieren und Verlinken von C-Bibliotheken. Abwarten bis die "üblichen Verdächtigen" sich zu Wort melden... ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

und ich hab damit auch 0 Erfahrung. Und von Emscripten bisher auch nichts gemacht...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Du kannst die .so Dateien nicht für den build-Prozess nehmen, das sind normalerweise shared libs für die spätere Benutzung. Du müsstest entweder das gesamte cmake Projekt auf emcc/LLVM umstellen, oder die Objektdateien (.o) sammeln und mit emcc zu Javascript übersetzen (vorausgesetzt, die liegen schon im LLVM-Format vor). Da ich emscripten noch nie benutzt habe, kann ich Dir nicht sagen, welche Schritte genau vorzunehmen sind. Falls der Code sehr compilernah geschrieben wurde, dürfte schon die Umstellung auf clang/LLVM zum mittelschweren Problem werden.
Antworten