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.
This commit is contained in:
Daniel Bevenius 2026-08-18 10:22:22 +02:00
parent 4834a2327d
commit b6e63fa4ac
No known key found for this signature in database
14 changed files with 143 additions and 26 deletions

View File

@ -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

View File

@ -1,6 +1,6 @@
{
"name": "whisper.cpp",
"version": "@PROJECT_VERSION@",
"version": "@WHISPER_VERSION@",
"description": "Whisper speech recognition",
"main": "whisper.js",
"scripts": {

View File

@ -1,6 +1,6 @@
{
"name": "whisper.cpp",
"version": "1.9.2",
"version": "1.9.2-dev",
"description": "Whisper speech recognition",
"main": "whisper.js",
"scripts": {

View File

@ -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)

View File

@ -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}

View File

@ -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

View File

@ -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}

3
examples/test-cmake/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
whisper-build-install
install
build

View File

@ -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}"
)

View File

@ -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)
```

View File

@ -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}

8
examples/test-cmake/build.sh Executable file
View File

@ -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

View File

@ -0,0 +1,9 @@
#include "whisper.h"
#include <cstdio>
int main(void) {
printf("[test-cmake] version: %s, build: %d (%s)\n",
whisper_version(), WHISPER_BUILD_NUMBER, WHISPER_BUILD_COMMIT);
return 0;
}

View File

@ -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)