Search code examples
ccmakeemscripten

I get an "no input files" error while compiling my webgl app with emscripten/cmake


I am trying to compile my webgl app to wasm with emscripten. This is my cmake file:

cmake_minimum_required(VERSION 3.10)
include(CMakePrintHelpers)

project(webgl_demo C CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(CMAKE_BUILD_TYPE Release)

set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output)

set(CGLM_SHARED OFF CACHE BOOL "" FORCE)
set(CGLM_STATIC ON CACHE BOOL "" FORCE)
set(CGLM_USE_C99 ON CACHE BOOL "" FORCE)
set(CGLM_USE_TEST OFF CACHE BOOL "" FORCE)

set(ASSIMP_BUILD_ZLIB OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_NO_EXPORT ON CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_FBX_IMPORTER ON CACHE BOOL "" FORCE)

set(OVERRIDE_CXX_FLAGS ON CACHE BOOL "" FORCE)
set(OVERRIDE_C_FLAGS ON CACHE BOOL "" FORCE)

set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_C_FLAGS_RELEASE "-O3")

add_subdirectory(third_party/cglm)
add_subdirectory(third_party/assimp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/cglm/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/glfw/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/opengl/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/stb)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/assimp/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/third_party/assimp/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/freetype)

FILE(GLOB_RECURSE MY_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")

cmake_print_variables(MY_SOURCES)

add_executable(
webgl_demo
${MY_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/third_party/opengl/src/glad.c
)

set_target_properties(webgl_demo PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s USE_GLFW=3 -s USE_FREETYPE=1 -s USE_ZLIB=1
-s ALLOW_MEMORY_GROWTH=1 -s BINARYEN_ASYNC_COMPILATION=1 -s WASM=1")

target_link_libraries(webgl_demo cglm assimp)

I am compiling with these commands:

mkdir build
cd build
emcmake cmake ..
emmake make

It compiles my all source files without problem but when it gets to linking and produce final wasm file it gives this error:

...
...
...
[ 94%] Building C object CMakeFiles/webgl_demo.dir/src/core/skybox.c.o
[ 94%] Building C object CMakeFiles/webgl_demo.dir/src/core/snoise.c.o
[ 95%] Building C object CMakeFiles/webgl_demo.dir/src/core/texture.c.o
[ 95%] Building C object CMakeFiles/webgl_demo.dir/src/core/timing.c.o
[ 96%] Building C object CMakeFiles/webgl_demo.dir/src/core/water.c.o
[ 97%] Building C object CMakeFiles/webgl_demo.dir/src/core/window.c.o
[ 97%] Building C object CMakeFiles/webgl_demo.dir/src/core/world_batch.c.o
[ 98%] Building C object CMakeFiles/webgl_demo.dir/src/core/world_instanced.c.o
[ 98%] Building C object CMakeFiles/webgl_demo.dir/src/main.c.o
[ 99%] Building C object CMakeFiles/webgl_demo.dir/third_party/opengl/src/glad.c.o
[100%] Linking CXX executable "C:\_Projects_\2-Game Projects\webgl_demo\output\webgl_demo.js"
em++: error: no input files
mingw32-make.EXE[2]: *** [C:/_Projects_/2-Game Projects/webgl_demo/output/webgl_demo.js] Error 1
mingw32-make.EXE[1]: *** [CMakeFiles/webgl_demo.dir/all] Error 2
C:\mingw\bin\mingw32-make.EXE: *** [all] Error 2
emmake: error: 'C:\mingw\bin\mingw32-make.EXE' failed (returned 2)

This is my emscripten version:

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.56 (cf90417346b78455089e64eb909d71d091ecc055)
clang version 19.0.0git (https:/github.com/llvm/llvm-project 34ba90745fa55777436a2429a51a3799c83c6d4c)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: C:\_Projects_\2-Game Projects\emsdk\upstream\bin

How can i fix this?

I tried to change some compile parameters, comment linking at the cmake file, etc. But I couldn't fix it. This is my first time with emscripten, so I am not sure what to do.


Solution

  • I found the problem. I had put a newline character in this line, and that broke the last link command:

    set_target_properties(webgl_demo PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s USE_GLFW=3 -s USE_FREETYPE=1 -s USE_ZLIB=1 
    -s ALLOW_MEMORY_GROWTH=1 -s BINARYEN_ASYNC_COMPILATION=1 -s WASM=1")