[JavaScript, C++, WebAssembly] Как скрестить Clion, Emscripten и Cmake

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
06-Окт-2020 19:31

В этой статье я хотел бы пройтись и показать основные моменты того, как настроить IDE CLion для компиляции CMake проекта средствами Emscripten. Когда я занимался этим скрещиванием мне пришлось потратить день или два на эксперименты. И в этой заметке я собираюсь собрать некое "how to", которое в итоге сработало. Кто все эти люди?Emscripten - это набор инструментов для компилирования C++ кода в Asm.js/WebAssembly. Сейчас WebAssembly уже вышел на первый план,CMake - система для генерации скрипта для сборки проекта. CLion - среда разработки для проектов на C/C++ изначально построенная вокруг использования CMake как средства сборки. Но подкрепить к этому Emscripten было не так простоПредварительные требованияГлавным требованием, чтобы все завелось с полпинка очень важно уже иметь установленный Python желательно 3-й версии. Так же python должен быть доступен из командной строки\Cmake будет нужен минимально версии 3.13И конечно не забываем про GitНастраиваем EmscriptenСкачиваем emsdk. ( https://github.com/emscripten-core/emsdk )И из командной строки делаем следующие шаги:
  • Скачиваем последнюю версию Emscripten
    ./emsdk install latest
  • Активируем последнюю версию
    ./emsdk activate latest
И оставляем все именно в таком состоянии. Официальный help для emsdk содержит еще шаги, но они нужны для компиляции из командной строки. Мы собираемся компилировать из IDE.Настраиваем CLionЗапускаем, создаем новый проект. И заходим в File -> Settings. А в появившемся окне выбираем Build, Execution, Deployment -> Toolchains.Если вы уже используете CLion под Windows, то у вас с большей долей вероятности уже установлен MSYS2 ( современная версия MinGW ). Поэтому его скачивание и установку gcc пакетов для с++ header'ов я молчаливо пропущу.Под Linux это окно немного отличается, но вот как выглядит окно настройки Toolchain в итоге под Windows:
Выбираем + и в появившемся меню выбираем MinGW.В Environment прописываем путь к внутрь MSYS2. В моем случае MSYS2 установлен в папку e:\msys64В CMake по желанию прописываем путь к внешне установленному экземпляру оного (особенно, если у вас устаревшая версия CLion и CMake тоже устаревшей версии). ! В C Compiler и C++ Compiler прописываем пути к этим .bat файлам. Для Linux среды просто уберите .bat расширение. Суть в том, что Emscripten для компиляции использует python скрипты, а эти shell скрипты просто вызывают эти python файлы. Далее переходим в пункт CMake. И тут создаем target компиляции:
В Toolchains выбираем только что созданный toolchainДобавляем главный компонент пьесы: В CMake Options прописываем волшебную строчку -DCMAKE_TOOLCHAIN_FILE= и путь к внутри emsdk директории к файлу Emscripten.cmake. Emscripten.cmake и пути в C Compiler и C++ Compiler - это что заставляем все в итоге работать.Пишем конфигурацию для CMake.Тут все уже должно работать из коробки. И проект будет компилироваться по нажатию Build->Build Project. Но есть несколько полезных моментов, которые стоило бы упомянуть.
  • Если проект представляет из себя не библиотеку, а приложение, то рекомендую специально выставить для выходного файла расширение .js
    set(CMAKE_EXECUTABLE_SUFFIX .js)
  • У Emscripten флаги для компиляторара и флаги для линкера совмещены вместе. Видимо изначально товарищи планировали, что emcc будет выдавать готовый .js файл. Но как только проект состоит из больше, чем 1 файл, логика процесса немного ломается
    В действительности, некоторые флаги из ссылки из предыдущего абзаца можно использовать и только для linker'а, без указания их в флагах компилятора. Например:
    target_link_options(project PUBLIC "SHELL: --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/prejs.js --js-library ${CMAKE_CURRENT_SOURCE_DIR}/jsLib.js")
    target_link_options(project PUBLIC "SHELL: -s USE_GLFW=3 --preload-file glsl -s ALLOW_MEMORY_GROWTH=1")
    target_link_options появился в недавних версиях Cmake и позволяет добавлять параметры в коммандную строку для линкера. Из интересных команд здесь можно выделить --preload-file За счет этого чуда, полностью вся директория glsl вместе с файлами, закидывает внутрь bundle'а. И доступна через обычные файловые операции.
  • В моем проекте мне нужно билдить вспомогательные программы, которые генерируют код. Для emscripten версии билдятся в .js файлы и запускаются при помощи nodejs. И чтобы запускаемый .js из nodejs смотрел на реальную файловую систему я добавляю один маленький флаг для компиляции:
    target_link_options(glslangValidator PUBLIC -s NODERAWFS=1)
ИтогоВ данной статье мы рассмотрели основные моменты, с которыми сталкиваются при конфигурации компиляции проекта из CLion средствами Emscripten.
Надеюсь на адекватную критику от сообщества
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_javascript, #_c++, #_webassembly, #_emscripten, #_webassembly, #_javascript, #_c++, #_webassembly
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 12:17
Часовой пояс: UTC + 5