From b6e63fa4ac6018d39d4ae4d4048c4296e5a58924 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Tue, 18 Aug 2026 10:22:22 +0200 Subject: [PATCH] cmake : update semver handling to be consistent with ggml/llama.cpp This commit modifies the semantic version handling to be consistent with how llama.cpp and ggml handle semver. This commit introdues a new example named test-cmake which is intended to be used to test the cmake configuration and installation. --- CMakeLists.txt | 46 +++++++++++++++++++-------- bindings/javascript/package-tmpl.json | 2 +- bindings/javascript/package.json | 2 +- cmake/parakeet-config.cmake.in | 4 +-- cmake/parakeet.pc.in | 2 +- cmake/whisper-config.cmake.in | 6 ++-- cmake/whisper.pc.in | 2 +- examples/test-cmake/.gitignore | 3 ++ examples/test-cmake/CMakeLists.txt | 17 ++++++++++ examples/test-cmake/README.md | 40 +++++++++++++++++++++++ examples/test-cmake/build-install.sh | 18 +++++++++++ examples/test-cmake/build.sh | 8 +++++ examples/test-cmake/test-cmake.cpp | 9 ++++++ src/CMakeLists.txt | 10 +++--- 14 files changed, 143 insertions(+), 26 deletions(-) create mode 100644 examples/test-cmake/.gitignore create mode 100644 examples/test-cmake/CMakeLists.txt create mode 100644 examples/test-cmake/README.md create mode 100755 examples/test-cmake/build-install.sh create mode 100755 examples/test-cmake/build.sh create mode 100644 examples/test-cmake/test-cmake.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c43e65b9..568b00cb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,26 @@ cmake_minimum_required(VERSION 3.5) # for add_link_options and implicit target directories. project("whisper.cpp" C CXX) -project("whisper.cpp" VERSION 1.9.2) include(CheckIncludeFileCXX) -set(SOVERSION 1) +### whisper.cpp version +set(WHISPER_VERSION_MAJOR 1) +set(WHISPER_VERSION_MINOR 9) +set(WHISPER_VERSION_PATCH 2) +set(WHISPER_VERSION_BASE "${WHISPER_VERSION_MAJOR}.${WHISPER_VERSION_MINOR}.${WHISPER_VERSION_PATCH}") + +# whether this is a development/nightly build +# set this to OFF when making a release from a release tag (vX.Y.Z) +# ref: https://github.com/ggml-org/ggml/discussions/1579 +option(WHISPER_BUILD_IS_DEV "whisper: dev build" ON) + +if (WHISPER_BUILD_IS_DEV) + set(WHISPER_VERSION "${WHISPER_VERSION_BASE}-dev") +else() + # TODO: check that the current commit is tagged correctly according to the version specified above + set(WHISPER_VERSION "${WHISPER_VERSION_BASE}") +endif() + +message(STATUS "whisper.cpp version: ${WHISPER_VERSION}") #set(CMAKE_WARN_DEPRECATED YES) set(CMAKE_WARN_UNUSED_CLI YES) @@ -170,9 +187,12 @@ add_subdirectory(src) include(GNUInstallDirs) include(CMakePackageConfigHelpers) -set(WHISPER_BUILD_NUMBER ${BUILD_NUMBER}) -set(WHISPER_BUILD_COMMIT ${BUILD_COMMIT}) -set(WHISPER_INSTALL_VERSION ${CMAKE_PROJECT_VERSION}) +if (NOT DEFINED WHISPER_BUILD_NUMBER) + set(WHISPER_BUILD_NUMBER ${BUILD_NUMBER}) +endif() +if (NOT DEFINED WHISPER_BUILD_COMMIT) + set(WHISPER_BUILD_COMMIT ${BUILD_COMMIT}) +endif() set(WHISPER_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") set(WHISPER_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") @@ -185,14 +205,14 @@ set_target_properties(whisper PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DI install(TARGETS whisper LIBRARY PUBLIC_HEADER) target_compile_definitions(whisper PRIVATE - WHISPER_VERSION="${PROJECT_VERSION}" + WHISPER_VERSION="${WHISPER_VERSION}" ) set_target_properties(parakeet PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/parakeet.h) install(TARGETS parakeet LIBRARY PUBLIC_HEADER) target_compile_definitions(parakeet PRIVATE - PARAKEET_VERSION="${PROJECT_VERSION}" + PARAKEET_VERSION="${WHISPER_VERSION}" ) configure_package_config_file( @@ -205,12 +225,12 @@ configure_package_config_file( WHISPER_BIN_INSTALL_DIR ) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/whisper-version.cmake - VERSION ${WHISPER_INSTALL_VERSION} + ${CMAKE_CURRENT_BINARY_DIR}/whisper-config-version.cmake + VERSION ${WHISPER_VERSION} COMPATIBILITY SameMajorVersion) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/whisper-config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/whisper-version.cmake + ${CMAKE_CURRENT_BINARY_DIR}/whisper-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/whisper) configure_file(cmake/whisper.pc.in @@ -234,12 +254,12 @@ configure_package_config_file( PARAKEET_BIN_INSTALL_DIR) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/parakeet-version.cmake - VERSION ${WHISPER_INSTALL_VERSION} + ${CMAKE_CURRENT_BINARY_DIR}/parakeet-config-version.cmake + VERSION ${WHISPER_VERSION} COMPATIBILITY SameMajorVersion) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/parakeet-config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/parakeet-version.cmake + ${CMAKE_CURRENT_BINARY_DIR}/parakeet-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/parakeet) configure_file(cmake/parakeet.pc.in diff --git a/bindings/javascript/package-tmpl.json b/bindings/javascript/package-tmpl.json index d8ba2106a..33777d1b4 100644 --- a/bindings/javascript/package-tmpl.json +++ b/bindings/javascript/package-tmpl.json @@ -1,6 +1,6 @@ { "name": "whisper.cpp", - "version": "@PROJECT_VERSION@", + "version": "@WHISPER_VERSION@", "description": "Whisper speech recognition", "main": "whisper.js", "scripts": { diff --git a/bindings/javascript/package.json b/bindings/javascript/package.json index bdbb6af91..ee080716a 100644 --- a/bindings/javascript/package.json +++ b/bindings/javascript/package.json @@ -1,6 +1,6 @@ { "name": "whisper.cpp", - "version": "1.9.2", + "version": "1.9.2-dev", "description": "Whisper speech recognition", "main": "whisper.js", "scripts": { diff --git a/cmake/parakeet-config.cmake.in b/cmake/parakeet-config.cmake.in index aadb55c2d..4895d7ded 100644 --- a/cmake/parakeet-config.cmake.in +++ b/cmake/parakeet-config.cmake.in @@ -1,4 +1,4 @@ -set(PARAKEET_VERSION @WHISPER_INSTALL_VERSION@) +set(PARAKEET_VERSION @WHISPER_VERSION@) set(PARAKEET_BUILD_COMMIT @WHISPER_BUILD_COMMIT@) set(PARAKEET_BUILD_NUMBER @WHISPER_BUILD_NUMBER@) set(PARAKEET_SHARED_LIB @BUILD_SHARED_LIBS@) @@ -7,7 +7,7 @@ set(PARAKEET_SHARED_LIB @BUILD_SHARED_LIBS@) set_and_check(PARAKEET_INCLUDE_DIR "@PACKAGE_PARAKEET_INCLUDE_INSTALL_DIR@") set_and_check(PARAKEET_LIB_DIR "@PACKAGE_PARAKEET_LIB_INSTALL_DIR@") -set_and_check(PARAKEET_BIN_DIR "@PACKAGE_PARAKEET_BIN_INSTALL_DIR@") +set(PARAKEET_BIN_DIR "@PACKAGE_PARAKEET_BIN_INSTALL_DIR@") find_package(ggml REQUIRED HINTS ${PARAKEET_LIB_DIR}/cmake) diff --git a/cmake/parakeet.pc.in b/cmake/parakeet.pc.in index b22ca6786..de1acb775 100644 --- a/cmake/parakeet.pc.in +++ b/cmake/parakeet.pc.in @@ -5,6 +5,6 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: parakeet Description: Port of NVIDIA's Parakeet model in C/C++ -Version: @PROJECT_VERSION@ +Version: @WHISPER_VERSION@ Libs: -L${libdir} -lggml -lggml-base -lparakeet Cflags: -I${includedir} diff --git a/cmake/whisper-config.cmake.in b/cmake/whisper-config.cmake.in index b70c1e5af..551abe1d9 100644 --- a/cmake/whisper-config.cmake.in +++ b/cmake/whisper-config.cmake.in @@ -1,4 +1,4 @@ -set(WHISPER_VERSION @WHISPER_INSTALL_VERSION@) +set(WHISPER_VERSION @WHISPER_VERSION@) set(WHISPER_BUILD_COMMIT @WHISPER_BUILD_COMMIT@) set(WHISPER_BUILD_NUMBER @WHISPER_BUILD_NUMBER@) set(WHISPER_SHARED_LIB @BUILD_SHARED_LIBS@) @@ -7,9 +7,9 @@ set(WHISPER_SHARED_LIB @BUILD_SHARED_LIBS@) set_and_check(WHISPER_INCLUDE_DIR "@PACKAGE_WHISPER_INCLUDE_INSTALL_DIR@") set_and_check(WHISPER_LIB_DIR "@PACKAGE_WHISPER_LIB_INSTALL_DIR@") -set_and_check(WHISPER_BIN_DIR "@PACKAGE_WHISPER_BIN_INSTALL_DIR@") +set(WHISPER_BIN_DIR "@PACKAGE_WHISPER_BIN_INSTALL_DIR@") -find_package(ggml REQUIRED HINTS ${LLAMA_LIB_DIR}/cmake) +find_package(ggml REQUIRED HINTS ${WHISPER_LIB_DIR}/cmake) find_library(whisper_LIBRARY whisper REQUIRED diff --git a/cmake/whisper.pc.in b/cmake/whisper.pc.in index 82c077400..270fc2e78 100644 --- a/cmake/whisper.pc.in +++ b/cmake/whisper.pc.in @@ -5,6 +5,6 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: whisper Description: Port of OpenAI's Whisper model in C/C++ -Version: @PROJECT_VERSION@ +Version: @WHISPER_VERSION@ Libs: -L${libdir} -lggml -lggml-base -lwhisper Cflags: -I${includedir} diff --git a/examples/test-cmake/.gitignore b/examples/test-cmake/.gitignore new file mode 100644 index 000000000..3919a349d --- /dev/null +++ b/examples/test-cmake/.gitignore @@ -0,0 +1,3 @@ +whisper-build-install +install +build diff --git a/examples/test-cmake/CMakeLists.txt b/examples/test-cmake/CMakeLists.txt new file mode 100644 index 000000000..9f21775b7 --- /dev/null +++ b/examples/test-cmake/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.14) +project(whisper-simple) + +set(CMAKE_CXX_STANDARD 17) + +# request a version that is satisfied by both dev (1.9.2-dev) and release (1.9.2) installs +# (find_package does not accept a pre-release version as an argument) +find_package(whisper 1.9.2 REQUIRED) + +add_executable(test-cmake test-cmake.cpp) + +target_link_libraries(test-cmake PRIVATE whisper) + +target_compile_definitions(test-cmake PRIVATE + WHISPER_BUILD_NUMBER=${WHISPER_BUILD_NUMBER} + WHISPER_BUILD_COMMIT="${WHISPER_BUILD_COMMIT}" +) diff --git a/examples/test-cmake/README.md b/examples/test-cmake/README.md new file mode 100644 index 000000000..060eed141 --- /dev/null +++ b/examples/test-cmake/README.md @@ -0,0 +1,40 @@ +## cmake-test + +This is just for manually testing/developing of a whisper.cpp installation to +enable troubleshooting issues and exploration. The idea is that this can be used +after making changes to whisper.cpp installation cmake configuration and then +verify it locally. + +### Usage +The following will configure, build, and install whisper.cpp + +Configuring/build/install: +```console +./build-install.sh +``` +The above command will create a directory named `install` in the current directory +which will have the following files in its lib directory: +```console +$ ls install/lib/ +cmake libggml-base.so libggml.so libparakeet.so libwhisper.so +libggml-base.so.0 libggml-base.so.0.20.0 libggml.so.0 libparakeet.so.1 libwhisper.so.1 +libggml-cpu.so libggml.so.0.20.0 libggml.so.0.20.0 libparakeet.so.1.9.2 libwhisper.so.1.9.2 +libggml-cpu.so.0 pkgconfig libparakeet.so libwhisper.so +``` + +Build/run this project using the installation created above: +```console +$ ./build.sh +-- The C compiler identification is GNU 13.3.0 +-- The CXX compiler identification is GNU 13.3.0 +-- Detecting C compiler ABI info - done +-- Detecting CXX compiler ABI info - done +-- Detecting CXX compile features - done +-- Configuring done (0.1s) +-- Generating done (0.0s) +-- Build files have been written to: /path/to/whisper.cpp/examples/test-cmake/build +[ 50%] Building CXX object CMakeFiles/test-cmake.dir/test-cmake.cpp.o +[100%] Linking CXX executable test-cmake +[100%] Built target test-cmake +[test-cmake] version: 1.9.2-dev, build: 4925 (1fe009ca) +``` diff --git a/examples/test-cmake/build-install.sh b/examples/test-cmake/build-install.sh new file mode 100755 index 000000000..d967e1f41 --- /dev/null +++ b/examples/test-cmake/build-install.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +build_dir=whisper-build-install +install_dir=install + +rm -rf ${build_dir} ${install_dir} + +cmake -S ../../. -B ${build_dir} -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DWHISPER_BUILD_TESTS=OFF \ + -DWHISPER_BUILD_EXAMPLES=OFF \ + -DWHISPER_BUILD_SERVER=OFF \ + -DCMAKE_INSTALL_PREFIX="${PWD}/${install_dir}" + +cmake --build ${build_dir} --parallel 12 +cmake --install ${build_dir} diff --git a/examples/test-cmake/build.sh b/examples/test-cmake/build.sh new file mode 100755 index 000000000..5de5cf98d --- /dev/null +++ b/examples/test-cmake/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +cmake -S . -B build -DCMAKE_PREFIX_PATH="${PWD}/install" +cmake --build build + +LD_LIBRARY_PATH="${PWD}/install/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" ./build/test-cmake diff --git a/examples/test-cmake/test-cmake.cpp b/examples/test-cmake/test-cmake.cpp new file mode 100644 index 000000000..356e622e7 --- /dev/null +++ b/examples/test-cmake/test-cmake.cpp @@ -0,0 +1,9 @@ +#include "whisper.h" + +#include + +int main(void) { + printf("[test-cmake] version: %s, build: %d (%s)\n", + whisper_version(), WHISPER_BUILD_NUMBER, WHISPER_BUILD_COMMIT); + return 0; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4e7c5b24d..c66236633 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -121,13 +121,15 @@ target_link_libraries(parakeet PUBLIC ggml Threads::Threads) # Set the version numbers set_target_properties(whisper PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${SOVERSION} + VERSION ${WHISPER_VERSION_BASE} + SOVERSION ${WHISPER_VERSION_MAJOR} + MACHO_CURRENT_VERSION 0 # keep macOS linker from seeing oversized version number ) set_target_properties(parakeet PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${SOVERSION} + VERSION ${WHISPER_VERSION_BASE} + SOVERSION ${WHISPER_VERSION_MAJOR} + MACHO_CURRENT_VERSION 0 # keep macOS linker from seeing oversized version number ) target_include_directories(whisper PUBLIC . ../include)