pcbjam/wasm/cmake/FindwxWidgets.cmake
Viktor Vaczi 9f4ed1e51e Add KiCad PCBnew WASM build support and documentation
Build infrastructure:
- Update build-pcbnew.sh with stub library compilation
- Update build-wxuniversal-wasm.sh with library symlinks and stubs
- Add stub libraries for libgit2 and curl (network ops via JS)
- Add WASM-specific CMake Find modules

Documentation:
- Add KICAD_WASM_BUILD.md with complete modification list
- Document 68 KiCad files modified for WASM support
- Document disabled features and reasons
- Document stub libraries and wxWidgets changes

Submodule updates:
- kicad: Add WASM/Emscripten build support (wasm-port branch)
- wxwidgets: Add KiCad compatibility fixes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:26:57 +01:00

111 lines
4 KiB
CMake

# FindwxWidgets.cmake - WASM build version
# Uses wx-config to find wxWidgets for WASM cross-compilation
if(EMSCRIPTEN AND wxWidgets_CONFIG_EXECUTABLE)
message(STATUS "Finding wxWidgets using wx-config for WASM...")
# Get version
execute_process(
COMMAND "${wxWidgets_CONFIG_EXECUTABLE}" --version
OUTPUT_VARIABLE wxWidgets_VERSION_STRING
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE RET
)
if(NOT RET EQUAL 0)
message(FATAL_ERROR "wx-config --version failed")
endif()
# Parse version
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" _match "${wxWidgets_VERSION_STRING}")
set(wxWidgets_VERSION_MAJOR "${CMAKE_MATCH_1}")
set(wxWidgets_VERSION_MINOR "${CMAKE_MATCH_2}")
set(wxWidgets_VERSION_PATCH "${CMAKE_MATCH_3}")
# Get include directories
execute_process(
COMMAND "${wxWidgets_CONFIG_EXECUTABLE}" --cxxflags
OUTPUT_VARIABLE wxWidgets_CXX_FLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Extract include directories from cxxflags
string(REGEX MATCHALL "-I[^ ]+" _includes "${wxWidgets_CXX_FLAGS}")
set(wxWidgets_INCLUDE_DIRS "")
foreach(_inc ${_includes})
string(REGEX REPLACE "^-I" "" _dir "${_inc}")
list(APPEND wxWidgets_INCLUDE_DIRS "${_dir}")
endforeach()
# Get libraries
execute_process(
COMMAND "${wxWidgets_CONFIG_EXECUTABLE}" --libs all
OUTPUT_VARIABLE _wx_libs_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Parse libraries
set(wxWidgets_LIBRARIES "")
set(wxWidgets_LIBRARY_DIRS "")
# Split into list
string(REPLACE " " ";" _wx_libs_list "${_wx_libs_output}")
foreach(_item ${_wx_libs_list})
if(_item MATCHES "^-L(.+)")
list(APPEND wxWidgets_LIBRARY_DIRS "${CMAKE_MATCH_1}")
elseif(_item MATCHES "^-l(.+)")
list(APPEND wxWidgets_LIBRARIES "${CMAKE_MATCH_1}")
elseif(_item MATCHES "\\.a$")
# Full path to static library
list(APPEND wxWidgets_LIBRARIES "${_item}")
elseif(_item MATCHES "^-s(.+)")
# Emscripten linker flags like -sUSE_LIBPNG=1
list(APPEND wxWidgets_LIBRARIES "${_item}")
elseif(_item MATCHES "^-pthread")
# Pthread flag
list(APPEND wxWidgets_LIBRARIES "-pthread")
endif()
endforeach()
# Get the wxWidgets root directory
get_filename_component(wxWidgets_ROOT_DIR "${wxWidgets_CONFIG_EXECUTABLE}" DIRECTORY)
# Set the wx configuration for port detection
# For WASM, we use our own port implementation
set(_wx_selected_config "wasm-wasmuniv-unicode-static-3.2" CACHE INTERNAL "")
set(wxWidgets_FIND_STYLE "unix" CACHE INTERNAL "")
# Set KICAD_WX_PORT to "wasm" - kiplatform will need our custom source files
set(KICAD_WX_PORT "wasm" CACHE STRING "wxWidgets port for WASM" FORCE)
# Pre-set PLATFORM_SRCS with our WASM implementation
# This will be used by kiplatform if it doesn't recognize the port
set(KIPLATFORM_WASM_SRCS "${SYSROOT}/../../../wasm/kiplatform/ui.cpp" CACHE PATH "WASM kiplatform sources")
# Get definitions
execute_process(
COMMAND "${wxWidgets_CONFIG_EXECUTABLE}" --cppflags
OUTPUT_VARIABLE _wx_cpp_flags
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REGEX MATCHALL "-D[^ ]+" wxWidgets_DEFINITIONS "${_wx_cpp_flags}")
# Set found
set(wxWidgets_FOUND TRUE)
# Create the use file path
set(wxWidgets_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
message(STATUS "Found wxWidgets ${wxWidgets_VERSION_STRING} for WASM")
message(STATUS " Include dirs: ${wxWidgets_INCLUDE_DIRS}")
message(STATUS " Library dirs: ${wxWidgets_LIBRARY_DIRS}")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(wxWidgets
REQUIRED_VARS wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS
VERSION_VAR wxWidgets_VERSION_STRING
)
else()
# For non-WASM builds, use the standard FindwxWidgets
include(${CMAKE_ROOT}/Modules/FindwxWidgets.cmake OPTIONAL)
endif()