c++cmakeemscriptenemcmake

Emscripten emcmake on win10, error when Including X11 support


I am working on a relatively simple c++ project, on windows 10.

Everything works fine when compiling to a Windows executable. But I have issues when trying to compile to Webassembly.

From Emscripten docs there, at least for windows, the procedure seems to be :

emcmake cmake .
# then
emmake make

but when I execute :

emcmake cmake . 

I get this error:

configure: cmake . 
-DCMAKE_TOOLCHAIN_FILE=C:\gui2one\CODE\emsdk\upstream\emscripten\cmake\Modules\Platform\Emscripten.cmake 
-DCMAKE_CROSSCOMPILING_EMULATOR=C:/gui2one/CODE/emsdk/node/14.18.2_64bit/bin/node.exe;
--experimental-wasm-bulk-memory;--experimental-wasm-threads -G "MinGW Makefiles"
-- Including X11 support
CMake Error at C:/cmake-3.19.5-win64-x64/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find X11 (missing: X11_X11_LIB)
Call Stack (most recent call first):
C:/cmake-3.19.5-win64-x64/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
C:/cmake-3.19.5-win64-x64/share/cmake-3.19/Modules/FindX11.cmake:437 (find_package_handle_standard_args)
vendor/glfw/src/CMakeLists.txt:190 (find_package)

I tried to install libX11 using cygwin, but Cmake is still unable to find it.

I must say I feel lost in cross-compiling land ...

How can I make X11 available to Cmake ?

Here is the CmakeLists.txt for this project :

cmake_minimum_required(VERSION 3.2)


set (CMAKE_CXX_STANDARD 17)

project(Orbitals)

add_definitions(-DOGL_DEBUG)


include_directories(
    cpp/
    vendor/glad/include
    cpp/Render
    cpp/Objects
    vendor/spdlog/include
    vendor/glad/include
    vendor/glad/include/glad
    C:/gui2one/CODE/emsdk/upstream/emscripten/system/include
    # ${EMSCRIPTEN_PATH}/upstream/emscripten/system/include/GLES3
)

set(RENDER_SRC 
    cpp/Render/Camera.cpp
    cpp/Render/OpenGLBuffer.cpp
    cpp/Render/OpenGLFrameBuffer.cpp
    cpp/Render/OpenGLHDRSkybox.cpp
    cpp/Render/OpenGLHDRTexture.cpp
    cpp/Render/OpenGLShader.cpp
    cpp/Render/OpenGLSkybox.cpp
    cpp/Render/OpenGLTexture.cpp
    cpp/Render/OpenGLVertexArray.cpp
)

add_executable(${PROJECT_NAME}
    cpp/main.cpp
    cpp/stb_image.cpp
    cpp/Timer.cpp
    cpp/pch.h
    cpp/opengl_debug.h
    cpp/Log.h
    cpp/Log.cpp
    cpp/RNDGenerator.cpp
    cpp/Algorithms/PoissonDiscSampling.cpp
    cpp/Mesh/Mesh.cpp
    cpp/Mesh/MeshUtils.cpp
    cpp/Mesh/MeshImporter.cpp
    cpp/Mesh/PointCloud.cpp
    cpp/Objects/Entity3d.cpp
    cpp/Objects/LightObject.cpp
    cpp/Objects/MeshObject.cpp
    ${RENDER_SRC}

)

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
target_include_directories(${PROJECT_NAME} PUBLIC
    vendor/glfw/include
    vendor/glad/include
    vendor/glm
    vendor/spdlog/include
    vendor/
    cpp/Render
    C:/gui2one/CODE/emsdk/upstream/emscripten/system/include
)


# GLFW
add_subdirectory(vendor/glfw)
include_directories(vendor/glfw/include)
target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES})


# GLAD
add_subdirectory(vendor/glad)
include_directories(vendor/glad/include)
target_link_libraries(${PROJECT_NAME} glad ${GLAD_LIBRARIES})


# ASSIMP
add_subdirectory(vendor/assimp)

include_directories(vendor/assimp/include)
target_link_libraries(${PROJECT_NAME} assimp ${ASSIMP_LIBRARIES})

Solution

  • You do not need to include glfw directory when compiling with emscripten. GLFW3 is already included in the emscripten library, so you do not need to compile it. You can simply omit add_subdirectory when building for HTML5 like so:

    # GLFW
    if (NOT EMSCRIPTEN)
        add_subdirectory(vendor/glfw)
    endif()
    include_directories(vendor/glfw/include)
    target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES})
    

    Also make sure you add USE_GLFW=3 link flag for the target you want to compile:

    set_target_properties(target
            PROPERTIES SUFFIX ".html"
            LINK_FLAGS " --bind -s WASM=0 -s MIN_WEBGL_VERSION=1 -s ABORT_ON_WASM_EXCEPTIONS=1 -g2 -s USE_GLFW=3")