2017-10-10 23 views
5

मैं emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.c चलाकर निम्नलिखित सी कोड से काफी कम (203 बाइट्स) wasm फ़ाइल उत्पन्न कर सकता हूं।मैं जंग के साथ एक न्यूनतम wasm फ़ाइल कैसे उत्पन्न करूं?

#include <emscripten/emscripten.h> 

int EMSCRIPTEN_KEEPALIVE sum(int a, int b) { 
    return a + b; 
} 

disassembled उत्पादन:

(module 
(type $0 (func (param i32 i32) (result i32))) 
... trim 9 lines ... 
(export "_sum" (func $0)) 
(func $0 (type $0) (param $var$0 i32) (param $var$1 i32) (result i32) 
    (i32.add 
    (get_local $var$1) 
    (get_local $var$0) 
) 
) 
... trim 17 lines ... 
) 

लेकिन निम्नलिखित जंग कोड

pub fn main() {} 

#[no_mangle] 
pub extern fn sum(a: i32, b: i32) -> i32 { 
    a + b 
} 

मैं इसी तरह कुछ भी उत्पादन नहीं कर पा रहे दिए गए।

rustc -O --target=wasm32-unknown-emscripten sum.rs काम करता है लेकिन मुझे 85k wasm फ़ाइल और 128k जेएस फ़ाइल देता है।

मैं EMMAKEN_CFLAGS='-s WASM=1 -s SIDE_MODULE=1' निर्यात की कोशिश की है लेकिन यह है कि मेरे जैसे

इनपुट फ़ाइल चेतावनी के एक नंबर देता है "/tmp/.../rust.metadata.bin" मौजूद है, लेकिन एक LLVM bitcode उपयुक्त फ़ाइल नहीं थी Emscripten के लिए। शायद गलती से देशी निर्मित ऑब्जेक्ट फ़ाइलों को Emscripten के साथ मिलाकर?

और फिर लिंक करने में विफल रहता है।

मेरा जंग संस्करण 1.22.0-nightly (c6884b12d 2017-09-30) है और मेरा एमसीसी संस्करण 1.37.21 है।

मैं क्या गलत कर रहा हूं?

+0

हा, खोज के लिए एक सप्ताह और मैं कुछ भी नहीं पाते:

इस लक्ष्य setup guide में वर्णित के रूप में इस्तेमाल किया जा सकता है। फिर इस प्रश्न को पोस्ट करने के कुछ मिनट बाद मुझे यह [https://gist.github.com/LukasKalbertodt/821ab8b85a25f4c54544cc43bed2c39f) मिलता है जो इसका उत्तर दे सकता है। एक बार जब मैं इसका परीक्षण करता हूं तो वापस रिपोर्ट करूंगा। – zakm

+0

[इस फ़ाइल में] [https://github.com/rust-lang/rust/blob/0defa208dcb5a0f3c1ca5bc4df7acf52759ece44/src/librustc_back/target/wasm32_unknown_emscripten.rs) जंग के ईएमएसस्क्रिप्ट लक्ष्य के बारे में बहुत कुछ सब कुछ परिभाषित किया गया है। और [यहां] (https://github.com/rust-lang/rust/blob/b2f67c8d5676d13d83523316ac95a7056dbd19c6/src/librustc_back/target/mod.rs), टिप्पणी कहती है कि कोई JSON फ़ाइल लिखकर लक्ष्य जोड़ सकता है (बिना किसी संकलन के rustc!)। इसलिए आप उस कस्टम लक्ष्य को जोड़ने का प्रयास कर सकते हैं जो 'SIDE_MODULE' ध्वज को एमसीसी में पास करता है। मैं एक उचित उत्तर लिखूंगा, लेकिन मेरे पास अभी समय नहीं है। क्षमा करें: < –

उत्तर

3

wasm32-unknown-emscripten लक्ष्य के साथ, आप एक ईएमएसस्क्रिप्ट-आधारित कंपाइलर टूलचेन का उपयोग कर रहे हैं। एम्सस्क्रिप्टन एएसएम मॉड्यूल में अतिरिक्त रनटाइम कोड का थोड़ा सा जोड़ता है, साथ ही रनटाइम पर इसके साथ एकीकृत करने के लिए अतिरिक्त जावास्क्रिप्ट कोड भी जोड़ता है। जैसा कि आपने यह भी देखा है, Emscripten SIDE_MODULE विकल्प के साथ संकलित कर सकता है जो इस रनटाइम कोड के विशाल बहुमत को हटा देता है। यह वाष्प बाइनरी आकार को कम कर देता है, लेकिन इसका मतलब है कि आपको जटिल प्रकारों को बाध्यकारी जैसी चीजों को संभालना होगा।

हाल ही में (नवंबर, 2017) एक नया wasm32-unknown-unknown target was added to Rust, जो एलएलवीएम बैकएंड (ईएमएसस्क्रिप्टन और इसके फास्टकंप फोर्क के बजाए) का उपयोग करता है, जिसके परिणामस्वरूप न्यूनतम आउटपुट होता है।

rustup update 
rustup target add wasm32-unknown-unknown --toolchain nightly 
rustc +nightly --target wasm32-unknown-unknown -O hello.rs 
+0

मैंने अभी देखा है, इस अवधारणा के चारों ओर एक टूलकिट बनाया गया है https://github.com/dcodeIO/webassembly – ColinE

+0

@ शेमपस्टर मेला पॉइंट - मैंने जवाब को पूरी तरह से फिर से लिखा है – ColinE

संबंधित मुद्दे