mudlet/cmake/FindPCRE2.cmake
Stephen Lyons 4db76845d5
Fix: handle CMake aliasing problems when PCRE2::8BIT is itself an alias (#9128)
#### Brief overview of PR changes/additions
Detect when the library target `PCRE2::8BIT` is an alias and in that
case assign the `PCRE2::PCRE2` alias to the target of that alias. This
is required because CMake does not allow an alias to an alias. This
happens for the FreeBSD OS.

#### Motivation for adding to Mudlet
Solve CMake error of the form:
> add_library cannot create ALIAS target "PCRE2::PCRE2" because target
"PCRE2::8BIT" is itself an ALIAS.

for FreeBSD.

#### Other info (issues closed, discussion etc)
The issue hasn't arise for any other OS so far but it could!

Signed-off-by: Stephen Lyons <slysven@virginmedia.com>
2026-03-30 00:06:42 +01:00

127 lines
4 KiB
CMake

# Locate PCRE2 library (8-bit version)
# This module exports the following targets
#
# PCRE2::PCRE2
#
# This module defines
# PCRE2_FOUND, if false, do not try to link to PCRE2
# PCRE2_LIBRARIES
# PCRE2_INCLUDE_DIR, where to find pcre2.h
# First try to find PCRE2 via its own CMake config (vcpkg, newer system packages)
# Request the 8-bit component explicitly as some configs require it
find_package(PCRE2 CONFIG QUIET COMPONENTS 8BIT)
if(PCRE2_FOUND)
message(STATUS "Found PCRE2 via CMake config")
# PCRE2's config file typically creates targets like PCRE2::8BIT or PCRE2::PCRE2-8
if(TARGET PCRE2::8BIT AND NOT TARGET PCRE2::PCRE2)
# On FreeBSD PCRE2::8BIT exists but it is already an alias so cannot itself
# be made the target of another alias:
# From: https://stackoverflow.com/a/76554700/4805858
get_property(aliased_target TARGET PCRE2::8BIT PROPERTY ALIASED_TARGET)
if("${aliased_target}" STREQUAL "")
# is not an alias - so we can use it to make the alias
add_library(PCRE2::PCRE2 ALIAS PCRE2::8BIT)
message(STATUS "Aliasing PCRE2::PCRE2 to PCRE2::8BIT")
else()
# is an alias - so we have to use what it is aliased to
add_library(PCRE2::PCRE2 ALIAS ${aliased_target})
message(STATUS "Aliasing PCRE2::PCRE2 to ${aliased_target}")
endif()
elseif(TARGET PCRE2::PCRE2-8 AND NOT TARGET PCRE2::PCRE2)
add_library(PCRE2::PCRE2 ALIAS PCRE2::PCRE2-8)
message(STATUS "Aliasing PCRE2::PCRE2 to PCRE2::PCRE2-8")
endif()
return()
endif()
# Fall back to pkg-config based discovery
find_package(PkgConfig)
pkg_search_module(PC_PCRE2 pcre2-8 libpcre2-8)
find_path(
PCRE2_INCLUDE_DIR pcre2.h
HINTS ${PCRE2_DIR} $ENV{PCRE2_DIR} ${PC_PCRE2_INCLUDE_DIRS}
PATH_SUFFIXES include/pcre2 include
PATHS ~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw # Fink
/opt/local # DarwinPorts
/opt/csw # Blastwave
/opt)
find_library(
PCRE2_LIBRARY_RELEASE
NAMES pcre2-8
HINTS ${PCRE2_DIR} $ENV{PCRE2_DIR} ${PC_PCRE2_LIBRARY_DIRS}
${PC_PCRE2_LIBRARY_DIR}
PATH_SUFFIXES lib64 lib
PATHS ~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw
/opt/local
/opt/csw
/opt)
find_library(
PCRE2_LIBRARY_DEBUG
NAMES pcre2-8d
HINTS ${PCRE2_DIR} $ENV{PCRE2_DIR} ${PC_PCRE2_LIBRARY_DIRS}
${PC_PCRE2_LIBRARY_DIR}
PATH_SUFFIXES lib64 lib
PATHS ~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw
/opt/local
/opt/csw
/opt)
if(PCRE2_LIBRARY_RELEASE)
set(PCRE2_LIBRARY ${PCRE2_LIBRARY_RELEASE})
elseif(PCRE2_LIBRARY_DEBUG)
set(PCRE2_LIBRARY ${PCRE2_LIBRARY_DEBUG})
endif()
if(PC_PCRE2_pcre2-8_FOUND)
set(PCRE2_VERSION ${PC_PCRE2_pcre2-8_VERSION})
elseif(PC_PCRE2_libpcre2-8_FOUND)
set(PCRE2_VERSION ${PC_PCRE2_libpcre2-8_VERSION})
else()
set(PCRE2_VERSION ${PC_PCRE2_VERSION})
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set PCRE2_FOUND to TRUE if all
# listed variables are TRUE
find_package_handle_standard_args(PCRE2 REQUIRED_VARS PCRE2_LIBRARY
PCRE2_INCLUDE_DIR VERSION_VAR PCRE2_VERSION)
mark_as_advanced(PCRE2_INCLUDE_DIR PCRE2_LIBRARY PCRE2_LIBRARY_RELEASE
PCRE2_LIBRARY_DEBUG)
get_filename_component(PCRE2_FILENAME ${PCRE2_LIBRARY} NAME)
string(FIND ${PCRE2_FILENAME} .a PCRE2_STATIC)
if(PCRE2_FOUND AND NOT TARGET PCRE2::PCRE2)
if(PCRE2_STATIC EQUAL -1)
add_library(PCRE2::PCRE2 SHARED IMPORTED)
set_target_properties(
PCRE2::PCRE2 PROPERTIES IMPORTED_LOCATION "${PCRE2_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIR}")
else()
add_library(PCRE2::PCRE2 STATIC IMPORTED)
set_target_properties(
PCRE2::PCRE2
PROPERTIES INTERFACE_COMPILE_DEFINITIONS PCRE2_STATIC IMPORTED_LOCATION
"${PCRE2_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIR}")
endif()
endif()