Emscripten - cmake - pass emscripten options in CMakeList file

Viewed 12214

How to use emcmake cmake and pass emscripten command-line options?

Pretty new to c++ / CMake, but can't find anything helpful on google. So maybe the question is just to stupid, in that case I apologise.

I can build my project (non-webassembly / normal desktop) with the following CMakeList.txt file

cmake_minimum_required(VERSION 3.7)
project(Engine)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
set(CMAKE_INCLUDE_PATH /usr/local/include)
set(SOURCE_FILES main.cpp src/Background.cpp src/Background.h src/Camera.cpp src/Chart.cpp src/Chart.h src/logger.cpp src/Engine.cpp src/Engine.h src/GL.cpp src/GL.h src/Instrument.cpp src/Instrument.h)
set(EMCC_LINKER_FLAGS "-s SAFE_HEAP=1 --bind -s WASM=1 -O3 -o ../index.js -s LEGACY_GL_EMULATION=0  -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -s INVOKE_RUN=0  -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s OFFSCREENCANVAS_SUPPORT=1 --preload-file shaders --preload-file extern --use-preload-plugins")
set(CMAKE_REQUIRED_FLAGS "${EMCC_LINKER_FLAGS}")

find_package(OPENGL REQUIRED)
find_package(GLEW REQUIRED)
#find_package(SDL2 REQUIRED)
find_package(glfw3 REQUIRED)
find_package(assimp REQUIRED)
find_package(Freetype REQUIRED)

include_directories(/emscripten/ /emscripten/emscripten/incoming/system/include)
include_directories(/usr/local/include)
include_directories(${FREETYPE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLFW_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR})

#add_subdirectory(shaders)

add_executable(Engine ${SOURCE_FILES} extern/stb_image.cpp src/Camera.h src/Cubes.cpp src/Chart.cpp)

target_link_libraries(Engine ${FREETYPE_LIBRARIES} ${OPENGL_gl_LIBRARY} ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${GLEW_LIBRARIES} glfw assimp)
#
#file(GLOB shaders/**/*.glsl shaders/*.glsl)

file(INSTALL shaders DESTINATION .)
file(INSTALL textures DESTINATION .)
#set(CMAKE_EXE_LINKER_FLAGS "${EMCC_LINKER_FLAGS}")
#SET_TARGET_PROPERTIES(Engine PROPERTIES LINK_FLAGS "-s SAFE_HEAP=1")
# add extra lib directories
#link_directories(/usr/local/lib)

And for the web(assembly)

emcc main.cpp ./src/*.cpp ./extern/*.cpp -o dist/engine.js -g  -s DISABLE_EXCEPTION_CATCHING=0 -s TOTAL_MEMORY=33554432  -s DEMANGLE_SUPPORT=1 -s SAFE_HEAP=1 --bind -s WASM=1 -Os -s LEGACY_GL_EMULATION=0  -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=2 -s GL_ASSERTIONS=1 -s INVOKE_RUN=0  -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s OFFSCREENCANVAS_SUPPORT=1 --preload-file textures --preload-file shaders --preload-file extern --use-preload-plugins 

But shouldn't it be possible to use emcmake cmake and keep it all in the (single) CMakeList file? If I execute emcmake cmake && make it generates a file real quick buts its as good as empty (missing all files).

It probably comes down to how to pass the arguments to emscripten in the CMakeFile I guess...

Duplicate of CMake project for Emscripten and Issue specifying option while using Emscripten (Emcmake)

But settings SET_TARGET_PROPERTIES(Engine PROPERTIES LINK_FLAGS "-s SAFE_HEAP=1") only gives the following kind of errors:

error: no such file or directory: 'SAFE_HEAP=1'

So really.. Am I wrong about how emcmake make work, and if not, how can I pass the emscripten arguments in the CMakeList file?

Many thanks!

2 Answers

I think the issue is that you are overwriting the CMAKE_MODULE_PATH, which emcmake also configure. Try to replace the line by:

list(APPEND CMAKE_MODULE_PATH <yourstuff>)

Then you just have to do "emcmake cmake" and "emmake make", it should work fine normally.

In the cmake file, you can use "if (EMSCRIPTEN)" to tweak suff just for the emscripten case, such as the compiler or linker flags

Related