cmake_minimum_required(VERSION 3.16) project(kdl_wasm_wrapper LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(KDL_SOURCE_DIR "" CACHE PATH "Path to the Orocos KDL source tree") if(KDL_SOURCE_DIR AND NOT EXISTS "${KDL_SOURCE_DIR}") message(FATAL_ERROR "KDL_SOURCE_DIR does not exist: ${KDL_SOURCE_DIR}") endif() set(EIGEN3_INCLUDE_DIR "" CACHE PATH "Path to the Eigen3 include directory") if(KDL_SOURCE_DIR AND NOT EIGEN3_INCLUDE_DIR) find_path(EIGEN3_INCLUDE_DIR Eigen/Core PATH_SUFFIXES eigen3) endif() if(KDL_SOURCE_DIR AND NOT EIGEN3_INCLUDE_DIR AND EXISTS "/usr/include/eigen3/Eigen/Core") set(EIGEN3_INCLUDE_DIR "/usr/include/eigen3" CACHE PATH "Path to the Eigen3 include directory" FORCE) endif() if(KDL_SOURCE_DIR AND NOT EIGEN3_INCLUDE_DIR) message(FATAL_ERROR "Eigen3 include directory was not found") endif() set(KDL_WASM_SOURCES bindings/kdl_c_api.cpp ) if(KDL_SOURCE_DIR) list(APPEND KDL_WASM_SOURCES "${KDL_SOURCE_DIR}/src/chain.cpp" "${KDL_SOURCE_DIR}/src/chainfksolverpos_recursive.cpp" "${KDL_SOURCE_DIR}/src/chainjnttojacsolver.cpp" "${KDL_SOURCE_DIR}/src/frames.cpp" "${KDL_SOURCE_DIR}/src/jacobian.cpp" "${KDL_SOURCE_DIR}/src/jntarray.cpp" "${KDL_SOURCE_DIR}/src/joint.cpp" "${KDL_SOURCE_DIR}/src/rigidbodyinertia.cpp" "${KDL_SOURCE_DIR}/src/rotationalinertia.cpp" "${KDL_SOURCE_DIR}/src/segment.cpp" "${KDL_SOURCE_DIR}/src/utilities/utility.cxx" ) endif() if(EMSCRIPTEN) add_executable(kdl ${KDL_WASM_SOURCES}) target_compile_options(kdl PRIVATE "-fexceptions") if(KDL_SOURCE_DIR) target_include_directories(kdl PRIVATE "${KDL_SOURCE_DIR}/src" "${EIGEN3_INCLUDE_DIR}") target_compile_definitions(kdl PRIVATE KDL_WASM_HAS_OROCOS_KDL=1) endif() set_target_properties(kdl PROPERTIES OUTPUT_NAME "kdl" SUFFIX ".js") target_link_options(kdl PRIVATE "--no-entry" "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=createKdlModule" "-sENVIRONMENT=web,worker,node" "-sALLOW_MEMORY_GROWTH=1" "-fexceptions" "-sDISABLE_EXCEPTION_CATCHING=0" "-sEXPORTED_RUNTIME_METHODS=ccall,cwrap,UTF8ToString,stringToUTF8,lengthBytesUTF8,HEAPF64" "-sEXPORTED_FUNCTIONS=['_malloc','_free','_kdl_init','_kdl_create_robot','_kdl_destroy_robot','_kdl_get_robot_info','_kdl_fk','_kdl_fk_all_links','_kdl_jacobian','_kdl_ik','_kdl_plan_movej','_kdl_plan_movel','_kdl_plan_movec','_kdl_plan_path','_kdl_sample_trap','_kdl_last_error']" ) add_custom_command(TARGET kdl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/bindings/kdl.d.ts" "${CMAKE_CURRENT_BINARY_DIR}/kdl.d.ts" ) else() add_library(kdl SHARED ${KDL_WASM_SOURCES}) if(KDL_SOURCE_DIR) target_include_directories(kdl PRIVATE "${KDL_SOURCE_DIR}/src" "${EIGEN3_INCLUDE_DIR}") target_compile_definitions(kdl PRIVATE KDL_WASM_HAS_OROCOS_KDL=1) endif() endif()