diff --git a/CMakeLists.txt b/CMakeLists.txt index 2db7493..675c64b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,93 +4,133 @@ cmake_minimum_required(VERSION 3.26) project(piper LANGUAGES C CXX) +set(UCD_STATIC_LIB "" CACHE FILEPATH "Path to libucd.a if built with system espeak-ng") + include(ExternalProject) # scikit-build-core will forward Python_* variables find_package(Python COMPONENTS Development.Module Development.SABIModule REQUIRED) -# Install location for espeak-ng -set(ESPEAKNG_BUILD_DIR ${CMAKE_BINARY_DIR}/espeak_ng) -set(ESPEAKNG_INSTALL_DIR ${CMAKE_BINARY_DIR}/espeak_ng-install) +# Try to find espeak-ng using pkg-config, if available +find_package(PkgConfig QUIET) -if(WIN32) - # Special handling for Windows - set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/espeak-ng.lib) - set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/ucd.lib) -else() - set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/libespeak-ng.a) - set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/libucd.a) +if (PKG_CONFIG_FOUND) + pkg_check_modules(ESPEAKNG QUIET espeak-ng) endif() -ExternalProject_Add(espeak_ng_external - GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git - GIT_TAG 212928b394a96e8fd2096616bfd54e17845c48f6 # 2025-Mar-22 - PREFIX ${ESPEAKNG_BUILD_DIR} - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${ESPEAKNG_INSTALL_DIR} - -DBUILD_SHARED_LIBS:BOOL=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON - -DUSE_ASYNC:BOOL=OFF - -DUSE_MBROLA:BOOL=OFF - -DUSE_LIBSONIC:BOOL=OFF - -DUSE_LIBPCAUDIO:BOOL=OFF - -DUSE_KLATT:BOOL=OFF - -DUSE_SPEECHPLAYER:BOOL=OFF - -DEXTRA_cmn:BOOL=ON - -DEXTRA_ru:BOOL=ON - # Need to explicitly add ucd include directory for CI - "-DCMAKE_C_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include" - BUILD_BYPRODUCTS - ${ESPEAKNG_STATIC_LIB} - ${UCD_STATIC_LIB} - UPDATE_DISCONNECTED TRUE -) - -include_directories( - ${ESPEAKNG_INSTALL_DIR}/include -) - # espeak bridge add_library(espeakbridge MODULE src/piper/espeakbridge.c ) -add_dependencies(espeakbridge espeak_ng_external) -target_link_libraries(espeakbridge - ${ESPEAKNG_STATIC_LIB} - ${UCD_STATIC_LIB} +# scikit-build-core forwards this +target_link_libraries(espeakbridge PRIVATE Python::SABIModule ) -target_include_directories(espeakbridge PRIVATE - ${ESPEAKNG_INSTALL_DIR}/include -) -if(WIN32) - # Fix dll thunk issue (__imp_SYMBOL not found) - target_compile_definitions(espeakbridge PRIVATE LIBESPEAK_NG_EXPORT) - # Fix .dll suffix +if (ESPEAKNG_FOUND) + message(STATUS "Found system espeak-ng via pkg-config") + + target_include_directories(espeakbridge PRIVATE + ${ESPEAKNG_INCLUDE_DIRS} + ) + target_link_directories(espeakbridge PRIVATE + ${ESPEAKNG_LIBRARY_DIRS} + ) + target_link_libraries(espeakbridge PRIVATE + ${ESPEAKNG_LIBRARIES} + ${UCD_STATIC_LIB} + ) + set_target_properties(espeakbridge PROPERTIES PREFIX "" - SUFFIX ".pyd" ) + + install(TARGETS espeakbridge + LIBRARY DESTINATION . + RUNTIME DESTINATION . + ) + else() - set_target_properties(espeakbridge PROPERTIES - PREFIX "" + # Install location for espeak-ng + set(ESPEAKNG_BUILD_DIR ${CMAKE_BINARY_DIR}/espeak_ng) + set(ESPEAKNG_INSTALL_DIR ${CMAKE_BINARY_DIR}/espeak_ng-install) + + if(WIN32) + # Special handling for Windows + set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/espeak-ng.lib) + set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/ucd.lib) + else() + set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/libespeak-ng.a) + set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/libucd.a) + endif() + + ExternalProject_Add(espeak_ng_external + GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git + GIT_TAG 212928b394a96e8fd2096616bfd54e17845c48f6 # 2025-Mar-22 + PREFIX ${ESPEAKNG_BUILD_DIR} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${ESPEAKNG_INSTALL_DIR} + -DBUILD_SHARED_LIBS:BOOL=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + -DUSE_ASYNC:BOOL=OFF + -DUSE_MBROLA:BOOL=OFF + -DUSE_LIBSONIC:BOOL=OFF + -DUSE_LIBPCAUDIO:BOOL=OFF + -DUSE_KLATT:BOOL=OFF + -DUSE_SPEECHPLAYER:BOOL=OFF + -DEXTRA_cmn:BOOL=ON + -DEXTRA_ru:BOOL=ON + # Need to explicitly add ucd include directory for CI + "-DCMAKE_C_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include" + BUILD_BYPRODUCTS + ${ESPEAKNG_STATIC_LIB} + ${UCD_STATIC_LIB} + UPDATE_DISCONNECTED TRUE ) -endif() -install(TARGETS espeakbridge - LIBRARY DESTINATION . - RUNTIME DESTINATION . -) + include_directories( + ${ESPEAKNG_INSTALL_DIR}/include + ) + + add_dependencies(espeakbridge espeak_ng_external) + target_link_libraries(espeakbridge + ${ESPEAKNG_STATIC_LIB} + ${UCD_STATIC_LIB} + Python::SABIModule + ) + target_include_directories(espeakbridge PRIVATE + ${ESPEAKNG_INSTALL_DIR}/include + ) -# Copy espeak-ng-data -set(DATA_SRC ${CMAKE_BINARY_DIR}/espeak_ng-install/share/espeak-ng-data) -set(DATA_DST ${CMAKE_CURRENT_SOURCE_DIR}/src/piper/espeak-ng-data) + if(WIN32) + # Fix dll thunk issue (__imp_SYMBOL not found) + target_compile_definitions(espeakbridge PRIVATE LIBESPEAK_NG_EXPORT) -add_custom_target(copy_espeak_ng_data ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${DATA_SRC} ${DATA_DST} - DEPENDS espeak_ng_external - COMMENT "Copying espeak-ng-data after espeak-ng external project builds" -) + # Fix .dll suffix + set_target_properties(espeakbridge PROPERTIES + PREFIX "" + SUFFIX ".pyd" + ) + else() + set_target_properties(espeakbridge PROPERTIES + PREFIX "" + ) + endif() + + install(TARGETS espeakbridge + LIBRARY DESTINATION . + RUNTIME DESTINATION . + ) + + # Copy espeak-ng-data + set(DATA_SRC ${CMAKE_BINARY_DIR}/espeak_ng-install/share/espeak-ng-data) + set(DATA_DST ${CMAKE_CURRENT_SOURCE_DIR}/src/piper/espeak-ng-data) + + add_custom_target(copy_espeak_ng_data ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory ${DATA_SRC} ${DATA_DST} + DEPENDS espeak_ng_external + COMMENT "Copying espeak-ng-data after espeak-ng external project builds" + ) +endif()