У меня есть подготовленный минимальный проект Cmake, содержащий один файл cpp, который представляет основной файл, и один файл cpp, который представляет общую библиотеку, которая печатает в основном привет мир. https://github.com/courteous/wasmELF.git
Цель состоит в том, чтобы скомпилировать этот мини-код только с emscripten / clang и создать
1) один двоичный модуль WebAssembly (wasm) версии 0x1 (MVP)
2) один ELF 64-битный LSB
без очистки каталога сборки cmake и повторной его сборки.
В настоящее время я могу успешно произвести их, купив, выполнив команды
emconfigure cmake ../ -DCMAKE_BUILD_TYPE=WASM
make
и
cmake ../ -DCMAKE_BUILD_TYPE=Linux
make
Однако проблема заключается в том, что для этого мне нужно скомпилировать первый с Clang, чтобы удалить сборку, а затем сделать вторую компиляцию с G CC. Я бы хотел, чтобы Emscripten / Clang производил их вместо купленных. Я не хочу удалять каталог сборки, так как время компиляции занимает слишком много времени. (Ну, не в этом проекте, но представьте, что проект был намного больше)
Я вижу, что emscripten / clang всегда выбирает цель "wasm32-unknown-emscripten"
clang++ -target wasm32-unknown-emscripten
и если я правильно понимаю, что цель должна измениться
Я вижу, что проект создает битовый код LLVM IR, так как я отправил флаг "flto"
т.е.
file TestSharedClass.cpp.o
TestSharedClass.cpp.o: LLVM IR bitcode
и в CMakeLists.txt
set(CMAKE_CXX_FLAGS "-flto")
x86_64-unknown- linux -gnu является поддерживаемой целью emscripten / Clang
~/Projects/emscripten/emsdk/upstream/bin$ ./llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build with assertions.
Default target: x86_64-unknown-linux-gnu
Host CPU: haswell
Registered Targets:
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
В cmake у меня есть
SET(TARGET x86_64-unknown-linux-gnu)
однако когда я запускаю
emconfigure cmake ../ -DCMAKE_BUILD_TYPE=Linux
make
, я получаю mainTestFile. js и mainTestFile.wasm вместо 64-битного кода ELF.
что я делаю здесь неправильно. Как сообщить clang продукту один раз ELF и один раз из одного и того же кода, без необходимости очищать каталог сборки. Это должно быть возможно, поскольку clang создает битовый код LLVM IR. Или я так понимаю?
https://github.com/emscripten-core/emscripten/issues/10361