gflags: Implement cmake shared/static configs (#24411)

This commit is contained in:
Алексей
2025-08-26 09:39:57 +03:00
committed by GitHub
parent ebcd2d15eb
commit 77b9bfb06e
5 changed files with 446 additions and 12 deletions

View File

@@ -0,0 +1,14 @@
--- gflags-2.2.2/test/CMakeLists.txt.orig 2025-05-23 11:41:07.056026100 +0300
+++ gflags-2.2.2/test/CMakeLists.txt 2025-05-23 11:41:20.825039200 +0300
@@ -25,9 +25,9 @@
set (type static)
endif ()
if (BUILD_gflags_LIB)
- link_libraries (gflags_${type})
+ link_libraries (gflags)
else ()
- link_libraries (gflags_nothreads_${type})
+ link_libraries (gflags_nothreads)
endif ()
# ----------------------------------------------------------------------------

View File

@@ -0,0 +1,279 @@
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
# ----------------------------------------------------------------------------
# Project Setup
project(gflags VERSION 2.2.2 LANGUAGES CXX)
set(PACKAGE_NAME "gflags")
set(PACKAGE_BUGREPORT "https://github.com/gflags/gflags/issues")
set(PACKAGE_DESCRIPTION "A commandline flags library that allows for distributed flags.")
set(PACKAGE_URL "http://gflags.github.io/gflags")
# ----------------------------------------------------------------------------
# System Checks (Preserved from Original)
include ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/utils.cmake")
include(CheckIncludeFileCXX)
include(CheckCXXSymbolExists)
include(CheckTypeSize)
include(CheckLibraryExists)
include(CMakeDependentOption)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# ----------------------------------------------------------------------------
# Library Configuration Options (Modified for Dual Build)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_WITH_THREADS "Build multi-threaded library" ON)
set (GFLAGS_INCLUDE_DIR "${PACKAGE_NAME}")
# ----------------------------------------------------------------------------
# Configuration Variables (Preserved)
set(PUBLIC_HDRS
"gflags.h"
"gflags_declare.h"
"gflags_completions.h"
)
set(PRIVATE_HDRS
"defines.h"
"config.h"
"util.h"
"mutex.h"
)
set(GFLAGS_SRCS
"gflags.cc"
"gflags_reporting.cc"
"gflags_completions.cc"
)
if(WIN32 AND NOT CYGWIN)
list(APPEND PRIVATE_HDRS "windows_port.h")
list(APPEND GFLAGS_SRCS "windows_port.cc")
set(OS_WINDOWS 1)
else()
set(OS_WINDOWS 0)
endif()
# ----------------------------------------------------------------------------
# Namespace Handling (Preserved)
set(GFLAGS_NAMESPACE "gflags" CACHE STRING "Primary namespace")
set(GFLAGS_NAMESPACE_SECONDARY "" CACHE STRING "Secondary namespaces")
if(GFLAGS_NAMESPACE_SECONDARY)
foreach(ns IN LISTS GFLAGS_NAMESPACE_SECONDARY)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/src/gflags_ns.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/gflags/gflags_${ns}.h"
)
list(APPEND PUBLIC_HDRS "${CMAKE_CURRENT_BINARY_DIR}/include/gflags/gflags_${ns}.h")
endforeach()
endif()
# ----------------------------------------------------------------------------
# System Configuration (Preserved)
if(MSVC)
set(HAVE_SYS_TYPES_H 1)
set(HAVE_STDDEF_H 1)
set(HAVE_UNISTD_H 0)
set(HAVE_SYS_STAT_H 1)
set(HAVE_SHLWAPI_H 1)
if(MSVC_VERSION VERSION_LESS 1600)
check_include_file_cxx ("stdint.h" HAVE_STDINT_H)
bool_to_int (HAVE_STDINT_H) # used in #if directive
else()
set(HAVE_STDINT_H 1)
endif()
if (MSVC_VERSION VERSION_LESS 1800)
check_include_file_cxx ("inttypes.h" HAVE_INTTYPES_H)
bool_to_int (HAVE_INTTYPES_H) # used in #if directive
else()
set(HAVE_INTTYPES_H 1)
endif()
else()
foreach (fname IN ITEMS unistd stdint inttypes sys/types sys/stat fnmatch)
string(TOUPPER "${fname}" FNAME)
string(REPLACE "/" "_" FNAME "${FNAME}")
if (NOT HAVE_${FNAME}_H)
check_include_file_cxx ("${fname}.h" HAVE_${FNAME}_H)
endif()
endforeach ()
if (NOT HAVE_FNMATCH_H AND OS_WINDOWS)
check_include_file_cxx ("shlwapi.h" HAVE_SHLWAPI_H)
endif()
# the following are used in #if directives not #ifdef
bool_to_int (HAVE_STDINT_H)
bool_to_int (HAVE_SYS_TYPES_H)
bool_to_int (HAVE_INTTYPES_H)
endif()
gflags_define (STRING INTTYPES_FORMAT "Format of integer types: \"C99\" (uint32_t), \"BSD\" (u_int32_t), \"VC7\" (__int32)" "")
gflags_property (INTTYPES_FORMAT STRINGS "C99;BSD;VC7")
gflags_property (INTTYPES_FORMAT ADVANCED TRUE)
if (NOT INTTYPES_FORMAT)
set (TYPES uint32_t u_int32_t)
if (MSVC)
list (INSERT TYPES 0 __int32)
endif()
foreach (type IN LISTS TYPES)
check_type_size (${type} ${type} LANGUAGE CXX)
if (HAVE_${type})
break ()
endif()
endforeach ()
if (HAVE_uint32_t)
gflags_set (INTTYPES_FORMAT C99)
elseif (HAVE_u_int32_t)
gflags_set (INTTYPES_FORMAT BSD)
elseif (HAVE___int32)
gflags_set (INTTYPES_FORMAT VC7)
else()
gflags_property (INTTYPES_FORMAT ADVANCED FALSE)
message (FATAL_ERROR "Do not know how to define a 32-bit integer quantity on your system!"
" Neither uint32_t, u_int32_t, nor __int32 seem to be available."
" Set [GFLAGS_]INTTYPES_FORMAT to either C99, BSD, or VC7 and try again.")
endif()
endif()
# use of special characters in strings to circumvent bug #0008226
if ("^${INTTYPES_FORMAT}$" STREQUAL "^WIN$")
gflags_set (INTTYPES_FORMAT VC7)
endif()
if (NOT INTTYPES_FORMAT MATCHES "^(C99|BSD|VC7)$")
message (FATAL_ERROR "Invalid value for [GFLAGS_]INTTYPES_FORMAT! Choose one of \"C99\", \"BSD\", or \"VC7\"")
endif()
set(GFLAGS_INTTYPES_FORMAT "${INTTYPES_FORMAT}")
set(GFLAGS_INTTYPES_FORMAT_C99 0)
set(GFLAGS_INTTYPES_FORMAT_BSD 0)
set(GFLAGS_INTTYPES_FORMAT_VC7 0)
set("GFLAGS_INTTYPES_FORMAT_${INTTYPES_FORMAT}" 1)
if (MSVC)
set (HAVE_strtoll 0)
set (HAVE_strtoq 0)
else()
check_cxx_symbol_exists (strtoll stdlib.h HAVE_STRTOLL)
if (NOT HAVE_STRTOLL)
check_cxx_symbol_exists (strtoq stdlib.h HAVE_STRTOQ)
endif()
endif()
if (BUILD_WITH_THREADS)
set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package (Threads)
if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
set (HAVE_PTHREAD 1)
check_type_size (pthread_rwlock_t RWLOCK LANGUAGE CXX)
else()
set (HAVE_PTHREAD 0)
endif()
if (UNIX AND NOT HAVE_PTHREAD)
if (CMAKE_HAVE_PTHREAD_H)
set(what "library")
else ()
set(what ".h file")
endif()
message (FATAL_ERROR "Could not find pthread${what}. Check the log file"
"\n\t${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
"\nor disable the build of the multi-threaded gflags library (BUILD_WITH_THREADS=OFF).")
endif()
else()
set(HAVE_PTHREAD 0)
endif()
configure_headers (PUBLIC_HDRS ${PUBLIC_HDRS})
configure_sources (PRIVATE_HDRS ${PRIVATE_HDRS})
configure_sources (GFLAGS_SRCS ${GFLAGS_SRCS})
# ----------------------------------------------------------------------------
# Target Creation
if(BUILD_SHARED_LIBS)
set (type_suffix "_shared")
set (LIB_TYPE SHARED)
set (GFLAGS_IS_A_DLL 1)
else()
set (type_suffix "_static")
set (LIB_TYPE STATIC)
set (GFLAGS_IS_A_DLL 0)
endif()
set (BUILD_gflags_LIB ${BUILD_WITH_THREADS})
if(BUILD_WITH_THREADS)
set (thread_suffix "")
else()
set (thread_suffix "_nothreads")
endif()
set (target_name "gflags${thread_suffix}")
add_library(gflags ${LIB_TYPE} ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
add_library(gflags::gflags ALIAS gflags)
set_target_properties(gflags PROPERTIES
OUTPUT_NAME "${target_name}"
VERSION "${PACKAGE_VERSION}"
SOVERSION "${PACKAGE_SOVERSION}"
)
set (include_dirs "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>")
list (APPEND include_dirs "$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>")
target_include_directories (gflags
PUBLIC "${include_dirs}"
PRIVATE "${PROJECT_SOURCE_DIR}/src;${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}"
)
# Compile Definitions (Modified with proper GFLAGS_IS_A_DLL handling)
target_compile_definitions(gflags PUBLIC GFLAGS_IS_A_DLL=${GFLAGS_IS_A_DLL})
if (NOT BUILD_WITH_THREADS)
target_compile_definitions (gflags PRIVATE NO_THREADS)
elseif (CMAKE_USE_PTHREADS_INIT)
target_link_libraries (gflags ${CMAKE_THREAD_LIBS_INIT})
endif()
if (HAVE_SHLWAPI_H)
target_link_libraries (gflags shlwapi)
endif ()
if (NOT DEFINED GFLAGS_INSTALL_CMAKEDIR)
set(GFLAGS_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/gflags"
CACHE STRING "Path to gflags CMake files")
endif ()
install(TARGETS gflags
EXPORT gflags_Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development)
install (FILES ${PUBLIC_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${GFLAGS_INCLUDE_DIR})
install(EXPORT gflags_Targets
DESTINATION ${GFLAGS_INSTALL_CMAKEDIR} COMPONENT Development
NAMESPACE gflags::
FILE gflags${thread_suffix}${type_suffix}-targets.cmake)
if (UNIX)
install (PROGRAMS src/gflags_completions.sh DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
write_basic_package_version_file(
gflagsConfigVersion.cmake
COMPATIBILITY SameMajorVersion)
install(FILES
"${CMAKE_CURRENT_SOURCE_DIR}/gflagsConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/gflagsConfigVersion.cmake"
DESTINATION ${GFLAGS_INSTALL_CMAKEDIR} COMPONENT Development)
set (PKGCONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
configure_file ("cmake/package.pc.in" "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}.pc" @ONLY)
install (FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}.pc" DESTINATION "${PKGCONFIG_INSTALL_DIR}")
# ----------------------------------------------------------------------------
# Testing (Preserved)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(test)
endif()

View File

@@ -4,7 +4,7 @@ _realname=gflags
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=2.2.2
pkgrel=4
pkgrel=6
pkgdesc="Google's Commandline flags module for C++ (mingw-w64)"
arch=('any')
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
@@ -19,11 +19,17 @@ checkdepends=("${MINGW_PACKAGE_PREFIX}-gtest")
source=("https://github.com/gflags/gflags/archive/v${pkgver}/${_realname}-${pkgver}.tar.gz"
0001-fix-link-library.patch
0002-fix-static-libs.patch
"${_realname}-2.2.2.patch")
"${_realname}-2.2.2.patch"
CMakeLists.txt
gflagsConfig.cmake
0003-tests-link.patch)
sha256sums=('34af2f15cf7367513b352bdcd2493ab14ce43692d2dcd9dfc499492966c64dcf'
'1bb0d61f8273ec487012636ca404686cb7589cefb9c57477f2a1e380746d92f7'
'07dec6f4d117c226c1521de623e17180e9dee1b54e81a242fb8a974cf58726a7'
'fa257fc8fb5fdef6267bf65b5355ccd967ca97d30672bddca55d64219ee848fd')
'97fadc6add5c5dfab13046930e3470f16abd22f9cf6d33b87c6e8b4616e0d206'
'eaecfe4e7944270b0352a3ff9c1fcebdae6dac9fd30344d00c2b404b085a1457'
'd1179c3f5629218b7a532196459e1ea6d190e69bda8e5c22670db8bc3cd388b5'
'de2dd6d257a3c582833d4d85d4347ebe425dc71c14b29de7eff7b5f85a905d9a')
prepare() {
cd "${srcdir}/${_realname}-${pkgver}"
@@ -32,25 +38,43 @@ prepare() {
# https://github.com/gflags/gflags/pull/334
patch -Np1 -i "${srcdir}/${_realname}-2.2.2.patch"
cp -f ${srcdir}/CMakeLists.txt .
cp -f ${srcdir}/gflagsConfig.cmake .
patch -Np1 -i "${srcdir}/0003-tests-link.patch"
}
build() {
mkdir -p "${srcdir}/build-${MSYSTEM}" && cd "${srcdir}/build-${MSYSTEM}"
if check_option "debug" "n"; then
extra_config+=("-DCMAKE_BUILD_TYPE=Release")
else
extra_config+=("-DCMAKE_BUILD_TYPE=Debug")
fi
mkdir -p "${srcdir}/shared-${MSYSTEM}" && cd "${srcdir}/shared-${MSYSTEM}"
MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
${MINGW_PREFIX}/bin/cmake.exe \
-G"Ninja" \
-DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
${extra_config} \
-DBUILD_STATIC_LIBS=ON \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TESTING=OFF \
-DBUILD_WITH_THREADS=ON \
-DBUILD_TESTING=ON \
"../${_realname}-${pkgver}"
cmake --build .
mkdir -p "${srcdir}/static-${MSYSTEM}" && cd "${srcdir}/static-${MSYSTEM}"
MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
${MINGW_PREFIX}/bin/cmake.exe \
-G"Ninja" \
-DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
${extra_config} \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_WITH_THREADS=ON \
-DBUILD_TESTING=ON \
"../${_realname}-${pkgver}"
cmake --build .
@@ -64,8 +88,11 @@ check() {
}
package() {
cd "${srcdir}/build-${MSYSTEM}"
cd "${srcdir}/shared-${MSYSTEM}"
DESTDIR="${pkgdir}" cmake --install .
INSTALL -Dm644 "${srcdir}"/${_realname}-${pkgver}/COPYING.txt \
"${pkgdir}"${MINGW_PREFIX}/share/licenses/${_realname}/COPYING.txt
cd "${srcdir}/static-${MSYSTEM}"
DESTDIR="${pkgdir}" cmake --install .
INSTALL -Dm644 "${srcdir}"/${_realname}-${pkgver}/COPYING.txt "${pkgdir}"${MINGW_PREFIX}/share/licenses/${_realname}/COPYING.txt
}

View File

@@ -1,5 +1,15 @@
--- gflags-2.2.2/CMakeLists.txt.orig 2018-11-12 00:21:00.000000000 +0300
+++ gflags-2.2.2/CMakeLists.txt 2018-11-19 13:23:58.872932000 +0300
diff -Naur gflags-2.2.2-orig/CMakeLists.txt gflags-2.2.2/CMakeLists.txt
--- gflags-2.2.2-orig/CMakeLists.txt 2025-05-22 12:12:28.664979400 +0300
+++ gflags-2.2.2/CMakeLists.txt 2025-05-22 12:35:29.120054700 +0300
@@ -70,7 +70,7 @@
## - GFLAGS_INSTALL_SHARED_LIBS
## - GFLAGS_INSTALL_STATIC_LIBS
-cmake_minimum_required (VERSION 3.0.2 FATAL_ERROR)
+cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
if (POLICY CMP0042)
cmake_policy (SET CMP0042 NEW)
@@ -413,7 +413,7 @@
# ----------------------------------------------------------------------------
@@ -9,3 +19,37 @@
set (RUNTIME_INSTALL_DIR "bin")
set (LIBRARY_INSTALL_DIR "lib")
set (INCLUDE_INSTALL_DIR "include")
diff -Naur gflags-2.2.2-orig/cmake/config.cmake.in gflags-2.2.2/cmake/config.cmake.in
--- gflags-2.2.2-orig/cmake/config.cmake.in 2018-11-12 00:21:00.000000000 +0300
+++ gflags-2.2.2/cmake/config.cmake.in 2025-05-22 12:31:22.976621300 +0300
@@ -78,7 +78,7 @@
else ()
set (@PACKAGE_PREFIX@_NOTHREADS FALSE)
endif ()
- elseif (TARGET ${@PACKAGE_PREFIX@_TARGET_PREFIX}PACKAGE_NAME@_static OR TARGET ${@PACKAGE_PREFIX@_TARGET_PREFIX}@PACKAGE_NAME@_shared)
+ elseif (TARGET ${@PACKAGE_PREFIX@_TARGET_PREFIX}@PACKAGE_NAME@_static OR TARGET ${@PACKAGE_PREFIX@_TARGET_PREFIX}@PACKAGE_NAME@_shared)
set (@PACKAGE_PREFIX@_NOTHREADS FALSE)
else ()
set (@PACKAGE_PREFIX@_NOTHREADS TRUE)
diff -Naur gflags-2.2.2-orig/test/config/CMakeLists.txt gflags-2.2.2/test/config/CMakeLists.txt
--- gflags-2.2.2-orig/test/config/CMakeLists.txt 2018-11-12 00:21:00.000000000 +0300
+++ gflags-2.2.2/test/config/CMakeLists.txt 2025-05-22 12:35:59.813232600 +0300
@@ -1,6 +1,6 @@
## gflags package configuration tests
-cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
+cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
project (gflags_${TEST_NAME})
diff -Naur gflags-2.2.2-orig/test/nc/CMakeLists.txt gflags-2.2.2/test/nc/CMakeLists.txt
--- gflags-2.2.2-orig/test/nc/CMakeLists.txt 2018-11-12 00:21:00.000000000 +0300
+++ gflags-2.2.2/test/nc/CMakeLists.txt 2025-05-22 12:36:15.080362100 +0300
@@ -1,6 +1,6 @@
## gflags negative compilation tests
-cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
+cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
if (NOT TEST_NAME)
message (FATAL_ERROR "Missing TEST_NAME CMake flag")

View File

@@ -0,0 +1,70 @@
## gflags CMake configuration file
include(CMakeFindDependencyMacro)
if(ON)
find_dependency(Threads)
endif()
set(gflags_known_comps static shared nothreads_static nothreads_shared)
set(gflags_comp_static NO)
set(gflags_comp_shared NO)
set(gflags_comp_nothreads_static NO)
set(gflags_comp_nothreads_shared NO)
foreach (gflags_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
if (gflags_comp IN_LIST gflags_known_comps)
set(gflags_comp_${gflags_comp} YES)
else ()
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"gflags does not recognize component `${gflags_comp}`.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
return()
endif ()
endforeach ()
if (gflags_comp_static AND gflags_comp_shared)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"gflags `static` and `shared` components are mutually exclusive.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
return()
endif ()
set(gflags_static_targets "${CMAKE_CURRENT_LIST_DIR}/gflags_static-targets.cmake")
set(gflags_shared_targets "${CMAKE_CURRENT_LIST_DIR}/gflags_shared-targets.cmake")
set(gflags_nothreads_static_targets "${CMAKE_CURRENT_LIST_DIR}/gflags_nothreads_static-targets.cmake")
set(gflags_nothreads_shared_targets "${CMAKE_CURRENT_LIST_DIR}/gflags_nothreads_shared-targets.cmake")
macro(gflags_load_targets type)
if (NOT EXISTS "${gflags_${type}_targets}")
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"gflags `${type}` libraries were requested but not found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
return()
endif ()
include("${gflags_${type}_targets}")
endmacro()
if (gflags_comp_static)
gflags_load_targets(static)
elseif (gflags_comp_shared)
gflags_load_targets(shared)
elseif (gflags_comp_nothreads_shared)
gflags_load_targets(nothreads_shared)
elseif (gflags_comp_nothreads_static)
gflags_load_targets(nothreads_static)
elseif (DEFINED gflags_SHARED_LIBS AND gflags_SHARED_LIBS)
gflags_load_targets(shared)
elseif (DEFINED gflags_SHARED_LIBS AND NOT gflags_SHARED_LIBS)
gflags_load_targets(static)
elseif (BUILD_SHARED_LIBS)
if (EXISTS "${gflags_shared_targets}")
gflags_load_targets(shared)
else ()
gflags_load_targets(static)
endif ()
else ()
if (EXISTS "${gflags_static_targets}")
gflags_load_targets(static)
else ()
gflags_load_targets(shared)
endif ()
endif ()