Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 72 additions & 56 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,81 @@
cmake_minimum_required(VERSION 3.26)
project(piper LANGUAGES C CXX)

include(ExternalProject)
option(USE_SYSTEM_ESPEAKNG "Use system-installed espeak-ng instead of building from source" OFF)

# 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)
if(NOT USE_SYSTEM_ESPEAKNG)
include(ExternalProject)

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()
# Install location for espeak-ng
set(ESPEAKNG_BUILD_DIR ${CMAKE_BINARY_DIR}/espeak_ng)
set(ESPEAKNG_INSTALL_DIR ${CMAKE_BINARY_DIR}/espeak_ng-install)

ExternalProject_Add(espeak_ng_external
GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git
GIT_TAG 724808c # 2026-Apr-06
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"
"-DCMAKE_CXX_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
)
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()

include_directories(
${ESPEAKNG_INSTALL_DIR}/include
)
ExternalProject_Add(espeak_ng_external
GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git
GIT_TAG 724808c # 2026-Apr-06
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"
"-DCMAKE_CXX_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
)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(ESPEAKNG REQUIRED IMPORTED_TARGET espeak-ng)
endif()

# 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}
Python::SABIModule
)
target_include_directories(espeakbridge PRIVATE
${ESPEAKNG_INSTALL_DIR}/include
)
if(NOT USE_SYSTEM_ESPEAKNG)
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
)
else()
target_link_libraries(espeakbridge
PkgConfig::ESPEAKNG
Python::SABIModule
)
endif()

if(WIN32)
# Fix dll thunk issue (__imp_SYMBOL not found)
Expand All @@ -86,12 +100,14 @@ install(TARGETS espeakbridge
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)
# Copy espeak-ng-data (skipped when using system espeak-ng)
if(NOT USE_SYSTEM_ESPEAKNG)
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"
)
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()
Loading