Design: Menggunakan WASM untuk mengkompilasi proyek penuh

Dibuat pada 24 Okt 2018  ·  44Komentar  ·  Sumber: WebAssembly/design

Saya melihat demo tank beberapa waktu lalu dan ingin membuat sesuatu seperti itu, tetapi menjadi 16 tahun tanpa pendidikan perguruan tinggi tidak banyak membantu. Saya mengikuti dan berhasil menyelesaikan instruksi instalasi di situs wasm, tetapi tampaknya tidak ada transisi antara kompilasi program "hello world" kecil yang ramah dan kompilasi program besar yang menakutkan seperti yang dilakukan di quakejs.com. Apakah ada sesuatu di luar sana untuk saya pelajari cara mengkompilasi proyek yang sudah jadi?

sumber:
https://github.com/ioquake/ioq3

Semua 44 komentar

Halaman proyek pembangunan emscripten memiliki beberapa dokumen tentang ini.

Tapi saya setuju kita bisa memiliki dokumen yang lebih baik - tutorial untuk membangun sesuatu seperti Bullet atau BananaBread mungkin berguna.

Oke, tampaknya mudah, tetapi konfirmasikan kepada saya bagaimana saya harus menjalankan makefile seperti ini melalui emscripten?:
https://github.com/ioquake/ioq3/blob/master/Makefile

(apakah ada perintah khusus untuk makefiles? kira-kira seperti ini: ./emscripten {makefile} -s USE_SDL=2 -s LEGACY_GL_EMULATION=1 -o q3.html

Makefile biasanya dijalankan oleh perintah make , dan untuk emscripten, Anda harus menjalankan

emmake make

( emmake menyiapkan beberapa env vars sehingga make dapat menemukan emcc dll.)

Baiklah, sebelum saya mencobanya dengan emscripten, saya mencobanya dengan GCC, dan itu bekerja dengan sempurna. Sayangnya, emscripten mengeluarkan daftar kesalahan ini (jika penting, saya menggunakan ubuntu 18.04 sebagai driver harian dan untuk emscripten/GCC):
https://pastebin.com/kZLn42b8

(apakah kesalahan saya karena file saya bukan "llvm bitcode"? bagaimana cara mengonversinya?)

Anda tidak dapat mengonversinya - Anda perlu mendapatkan perintah build untuk menggunakan emcc alih-alih gcc, dan emcc akan memancarkan bitcode untuk Anda.

Apakah emcc dipanggil? Jika Anda sudah membuat dengan gcc di direktori itu, mungkin file (non-bitcode, gcc-emitted) sudah ada di sana, dan tidak dibuat ulang.

Untuk memastikan emcc sedang dipanggil, Anda dapat menjalankan make as make VERBOSE=1 yang akan mencetak setiap perintah yang dijalankan - pastikan emcc ada dalam perintah tersebut, dan bukan gcc atau yang lainnya.

Inilah yang terjadi ketika saya menjalankannya dengan verbose on:
https://pastebin.com/reM44qfx
Bagaimana cara beralih ke EMCC?

"terkini" berarti tidak membangunnya kembali, jadi itu meninggalkan versi non-bitcode di sana.

Dimulai dengan direktori baru dan salinan kode, dan menggunakan perintah di tautan itu ( emconfigure ./configure , emmake make ) harus membuatnya menggunakan emcc. (Namun, beberapa makefile mengabaikan env vars yang diatur oleh emconfigure/emmake, dalam hal ini, Anda mungkin perlu mengedit makefile.)

Btw, permintaan tarik dengan perbaikan untuk dokumen pada tautan itu akan sangat diterima, apa pun yang membuatnya lebih baik untuk Anda akan sangat bagus karena akan membantu orang lain nanti.

Bagaimana cara mengonfigurasi dengan benar dengan ./emconfigure? Saya mengetik "emconfigure ./configure" dan baris perintah melemparkan kesalahan ini: https://Pastebin.com/uqHg80EC

Apakah ./configure berfungsi tanpa konfigurasi? emconfigure hanyalah "pembungkus" di sekitar perintah yang seharusnya sudah berfungsi.

Satu kemungkinan adalah mungkin itu disebut ./configure.sh dalam proyek itu, atau sesuatu yang lain.

Kemungkinan lain adalah Anda mungkin perlu menjalankan perintah itu di bash, emconfigure bash ./configure.sh atau semacamnya.

Sepertinya saya mungkin tidak memiliki direktori itu. Betapa bodohnya aku.
https://Pastebin.com/3rRit3EK

Jika tidak ada konfigurasi, maka jalankan saja langkah make mungkin berhasil. Namun, jika proyek tersebut belum memiliki port emscripten, mungkin ada beberapa pekerjaan yang harus dilakukan untuk menyiapkannya, dan API yang tepat digunakan, dll. Mungkin ada baiknya menanyakan apakah ada port, atau port yang sedang berjalan. Mungkin lebih mudah menggunakan repo quakejs https://github.com/inolen/quakejs

Inilah hasil saya menggunakan perintah inolen yang disediakan di repo:

https://Pastebin.com/xFnNvWQL

Perintah yang digunakan:
buat PLATFORM=js EMSCRIPTEN=../bla bla bla

Berdasarkan output itu, sepertinya tidak menggunakan alat emscripten ( LD build/release-js-x86_64/oa_ded.x86_64 , dan juga kesalahan seperti sys_main.c:(.text+0x6aa): tidak dipancarkan oleh kami).

Mungkin ada masalah di Makefile, opsi tampaknya men-debug atau menulis yang baru.

Maaf, itu tempel yang salah... Saya mencoba repo yang berbeda dan menyalinnya. Inilah pasta yang benar:
https://Pastebin.com/2VvtQB2a

OMONG-OMONG
Terima kasih banyak atas bantuannya yang berkelanjutan :). Saya sedang menulis tutorial untuk pengguna tingkat pemula untuk mengkompilasi proyek lengkap di emscripten, dengan hanya sedikit pengalaman di lingkungan GCC dan perintah sistem file linux

Oke, Runtime.generateStructInfo is not a function adalah masalahnya - itu adalah API lama yang tidak lagi didukung oleh emscripten. Itu perlu diganti, atau kode yang menggunakannya diubah agar tidak lagi membutuhkannya. Lihat juga diskusi terbaru ini: https://github.com/kripken/emscripten/issues/7408#issuecomment -434512284

Sayangnya, mencari tahu bahwa generateStructInfo hal-hal yang keluar mungkin tidak sepele. Menggunakannya sama sekali di port quakejs cukup canggih, saya tidak menyadari mereka melakukan itu. Mungkin pembuat port itu tertarik untuk memperbaruinya?

Inilah runtime repo Inolen (orang yang membuat qjs) mengambil reponya dari:
https://Pastebin.com/eTUwb27Q
(Saya cukup yakin mungkin lebih mudah untuk memperbaiki hal-hal structinfo, pengoptimalan tidak masalah bagi saya jadi saya dapat menjalankannya dengan autotool demi kesederhanaan)

Atau mungkin saya bisa menggunakan versi emscripten yang lebih lama?

Anda dapat menggunakan repo lama, ya - ada tag untuk setiap versi di repo emscripten. Jadi Anda bisa mendapatkan dan membangun yang lama secara manual. Jika Anda dapat mengetahui versi mana yang diketahui berfungsi dengan proyek itu, itu mungkin solusinya.

apakah ada petunjuk kecil yang dapat saya temukan di repo yang akan menunjukkan versi mana yang akan digunakan? Pencipta tampaknya tidak menanggapi apa pun.

Melihat tanggal komit mungkin membantu, dan membandingkannya dengan tanggal nomor versi di repo emscripten utama. Ada kemungkinan besar itu akan cukup dekat.

Pembaruan terakhir adalah 5 tahun yang lalu, membuat build 1.8.0 bukan?
BTW: menemukan ini di archive.org, ini harus menjadi readme Anda:
https://web.archive.org/web/20130612181545/https://github.com/kripken/emscripten/wiki/Tutorial
Ini adalah ikhtisar komprehensif dalam waktu singkat, yang luar biasa (walaupun beberapa nomor versi/masalah kompatibilitas perlu diubah).

Oke, saya menginstal emscripten 1.7.9, ada lagi yang perlu saya lakukan?

Keluaran konsol: https://Pastebin.com/EAXAeUdy

Itu tidak akan dikompilasi hanya dengan 1.7.9, apakah saya memerlukan node dan dentang yang berbeda juga, atau haruskah saya menyerah? Saya sudah melakukan ini selama 5 bulan dan belum mendapatkan kemajuan sedikit pun

Node seharusnya baik-baik saja, tetapi emscripten bergantung pada versi LLVM dan dentang tertentu. Jadi, Anda perlu membangun emscripten-fastcomp dan emscripten-fastcomp-clang dari versi itu, dan menggunakannya.

Apakah ada daftar versi LLVM dan Dentang mana yang kompatibel dengan emscripten 1.7.8?

Ini nomor versi yang sama di 3 repo. (Anda tidak dapat menggunakan LLVM 3.5 hulu biasa dll., Anda perlu menggunakan LLVM dan dentang di repo emscripten-fastcomp* tersebut.)

Saya tidak mengerti ... maaf

Bagian mana?

Ada 3 repo emscripten utama,

https://github.com/kripken/emscripten/
https://github.com/kripken/emscripten-fastcomp/
https://github.com/kripken/emscripten-fastcomp-clang/

Ketiganya memiliki versi yang sama. Misalnya di sini adalah 1.38.15 di masing-masing:

https://github.com/kripken/emscripten/releases/tag/1.38.15
https://github.com/kripken/emscripten-fastcomp/releases/tag/1.38.15
https://github.com/kripken/emscripten-fastcomp-clang/releases/tag/1.38.15

Jika Anda mendapatkan versi/tag yang sama di semua 3 repo, mereka dijamin bekerja dengan baik bersama-sama.

Oh terima kasih! Saya hanya menggunakan perintah ./emsdk list --old dan bingung.
Tetapi untuk beberapa alasan, hanya emscripten untuk 1.7.9 yang ada, dentang dan fastcomp apa yang saya gunakan untuk itu?
https://github.com/kripken/emscripten/releases/tag/1.7.9
https://github.com/kripken/emscripten-fastcomp/releases/tag/1.7.9
https://github.com/kripken/emscripten-fastcomp-clang/releases/tag/1.7.9

Oh, saya kira kami hanya memulai nomor versi di 1.11.1 atau lebih. Yaitu tentang kapan kami mulai menggunakan fastcomp dan fastcomp-clang.

Jadi saya pikir versi sebelumnya tidak menggunakan itu, dan hanya menggunakan LLVM+dentang upstream. Versinya mungkin 3.4, 3.5 atau semacamnya - seharusnya tertulis di tools/shared.py jika Anda mencari llvm_version atau yang serupa. Atau mungkin versi dokumen yang diarsipkan dapat membantu lebih baik.

apakah ini akan berfungsi di windows 7 vm saya?
https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html#archived -nsis-windows-sdk-releases

(Apakah semuanya dikemas bersama di dalamnya?)
Di mana alat yang diarsipkan?

Saya telah mencoba membangun proyek ioq3 selama sebulan, tetapi masih belum berhasil. Menurut https://github.com/inolen/quakejs/issues/14 Anda dapat membuatnya dengan emscripten-1.12.0 dan clang-3.2-64bit, sayangnya di linux clang-3.2-64bit tidak didukung dan Anda tidak akan melihat dalam daftar, karena tidak memiliki linux_url di file .manifest. Seorang pengembang mengatakan kepada saya bahwa dia berhasil membangun proyek di OS X dengan versi emscripten terbaru, tetapi saya belum mencobanya.

tunggu saja sampai Anda bergabung dengan klub 5 bulan. btw, saya akan mencoba 11.1 Saya percaya itu adalah emscripten tertua.
https://github.com/kripken/emscripten-fastcomp-clang/releases/tag/1.11.1
https://github.com/kripken/emscripten-fastcomp/releases/tag/1.11.1
https://github.com/kripken/emscripten/releases/tag/1.11.1

@hokuco beri tahu saya, jika Anda berhasil

Saya menyerah.

Maaf ini tidak berhasil. Terkadang sulit untuk mendapatkan bangunan proyek yang besar dan kompleks ketika tidak aktif selama bertahun-tahun dan penulis aslinya tidak tersedia. Memulai dengan hal-hal yang lebih kecil mungkin lebih menyenangkan bagi Anda.

@kripken Saya akan terus mengerjakan tutorial pemula pada edisi #1249

Maaf, itu tempel yang salah... Saya mencoba repo yang berbeda dan menyalinnya. Inilah pasta yang benar:
https://Pastebin.com/2VvtQB2a

OMONG-OMONG
Terima kasih banyak atas bantuannya yang berkelanjutan :). Saya sedang menulis tutorial untuk pengguna tingkat pemula untuk mengkompilasi proyek lengkap di emscripten, dengan hanya sedikit pengalaman di lingkungan GCC dan perintah sistem file linux
Hai jadi sudahkah Anda menulis tutorialnya? Jika demikian, bisakah Anda memposting tautannya?

Ini jauh lebih mudah digunakan sekarang. Saya berusia 16 tahun atau lebih ketika saya mencoba membuat tutorial, jadi itu mungkin sedikit menghalangi saya. Jika Anda mau, saya dapat membantu Anda melalui email, tetapi saya menyadari bahwa masalah dengan tutorial adalah bahwa tutorial tersebut sangat spesifik, dan penggunaan emscripten sangat luas.

@JakeTrock Terima kasih banyak .. Ya , saya masih berjuang dengan itu .. Saya punya proyek ( di c ) yang secara keseluruhan perlu dikonversi ke wasm. Tutorial memang berbicara tentang 'emconfigure ./configure' dan 'emmake make' tetapi saya tidak cukup mengerti tentang cara menggunakannya atau bahkan membuat file konfigurasi dalam hal ini. Meminta Anda untuk mengirim email kepada saya di asha.p. [email protected] dengan informasi apa pun yang Anda miliki. Terima kasih sebelumnya

jika itu proyek Anda sendiri, kemungkinan Anda perlu menulis makefile/utilize emcc

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jfbastien picture jfbastien  ·  6Komentar

frehberg picture frehberg  ·  6Komentar

beriberikix picture beriberikix  ·  7Komentar

chicoxyzzy picture chicoxyzzy  ·  5Komentar

badumt55 picture badumt55  ·  8Komentar