cmake_minimum_required(VERSION 3.20)
project(WasmTestData NONE)
# Find all C source files
file(GLOB C_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
# Custom commands for each C file
foreach(C_FILE ${C_SOURCES})
get_filename_component(BASENAME ${C_FILE} NAME_WE)
# C -> LLVM bitcode
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.bc
COMMAND clang -cc1 -Ofast -emit-llvm-bc -triple=wasm32-unknown-unknown-wasm
-std=c17 -o ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.bc ${C_FILE}
DEPENDS ${C_FILE}
COMMENT "Compiling ${BASENAME}.c to LLVM bitcode"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# LLVM bitcode -> object file
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.o
COMMAND llc -O3 -filetype=obj ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.bc
-o ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.o
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.bc
COMMENT "Compiling ${BASENAME}.bc to object file"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# Object file -> WASM
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.wasm
COMMAND wasm-ld --lto-O3 --no-entry ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.o
-o ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.wasm --initial-memory=0
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.o
COMMENT "Linking ${BASENAME}.wasm"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# WASM -> optimized WASM
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.opt.wasm
COMMAND wasm-opt -Oz -o ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.opt.wasm
${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.wasm
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.wasm
COMMENT "Optimizing ${BASENAME}.wasm"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
list(APPEND OPT_WASM_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.opt.wasm)
list(APPEND OBJ_FILES ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.o)
endforeach()
# Link all object files into single WASM
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/9_all.wasm
COMMAND wasm-ld --lto-O3 --no-entry ${OBJ_FILES}
-o ${CMAKE_CURRENT_SOURCE_DIR}/9_all.wasm --initial-memory=0
DEPENDS ${OBJ_FILES}
COMMENT "Linking all object files to 9_all.wasm"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# Optimize combined WASM
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/9_all.opt.wasm
COMMAND wasm-opt -Oz -o ${CMAKE_CURRENT_SOURCE_DIR}/9_all.opt.wasm
${CMAKE_CURRENT_SOURCE_DIR}/9_all.wasm
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/9_all.wasm
COMMENT "Optimizing 9_all.wasm"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# Main target
add_custom_target(all_wasm ALL DEPENDS ${OPT_WASM_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/9_all.opt.wasm)