Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ builtin_gif=ON
builtin_jpeg=ON
builtin_lz4=ON
builtin_lzma=ON
builtin_pcre=ON
builtin_png=ON
builtin_vdt=ON
builtin_zlib=ON
Expand Down
85 changes: 47 additions & 38 deletions builtins/pcre/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,62 @@
# For the licensing terms see $ROOTSYS/LICENSE.
# For the list of contributors see $ROOTSYS/README/CREDITS.

# **PLEASE UPDATE ALSO THE FOLLOWING LINE WHEN UPDATING THE VERSION**
# 21 Oct 2025, https://github.com/PCRE2Project/pcre2/releases/tag/pcre2-10.47
set(ROOT_PCRE2_VERSION 10.47)
set(ROOT_PCRE2_HASH "47fe8c99461250d42f89e6e8fdaeba9da057855d06eb7fc08d9ca03fd08d7bc7")
set(ROOT_PCRE2_PREFIX ${CMAKE_BINARY_DIR}/builtins/PCRE2-prefix)
if(MSVC)
set(ROOT_PCRE2_LIBRARY ${ROOT_PCRE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}pcre2-8-static${PCRE2_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set(ROOT_PCRE2_LIBRARY ${ROOT_PCRE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}pcre2-8${PCRE2_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX})
endif()
set(ROOT_PCRE2_INCLUDE_DIR ${ROOT_PCRE2_PREFIX}/include)

include(ExternalProject)

# Clear cache variables set by find_package(PCRE)
# Clear cache variables set by find_package(PCRE) and/or find_package(PCRE2)
# to ensure that we use the builtin version
foreach(var PCRE_FOUND PCRE_VERSION PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY PCRE_LIBRARIES)
foreach(var PCRE_FOUND PCRE_VERSION PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY PCRE_LIBRARIES PCRE2_FOUND PCRE2_VERSION PCRE2_INCLUDE_DIR PCRE2_PCRE2_LIBRARY PCRE2_LIBRARIES)
unset(${var})
unset(${var} CACHE)
endforeach()

if(WIN32)
if(CMAKE_GENERATOR MATCHES Ninja)
if (CMAKE_BUILD_TYPE MATCHES Debug)
set(PCRE_POSTFIX d)
set(PCRE2_POSTFIX d)
endif()
else()
if(winrtdebug)
set(PCRE_POSTFIX $<$<CONFIG:Debug>:d>)
set(pcre_config_kind "Debug")
set(PCRE2_POSTFIX $<$<CONFIG:Debug>:d>)
set(pcre2_config_kind "Debug")
else()
set(pcre_config_kind "Release")
set(pcre2_config_kind "Release")
endif()
set(pcre_config "--config ${pcre_config_kind}")
set(pcre2_config "--config ${pcre2_config_kind}")
endif()
endif()

set(PCRE_VERSION "8.43" CACHE INTERNAL "" FORCE)
set(PCRE_LIBNAME ${CMAKE_STATIC_LIBRARY_PREFIX}pcre${PCRE_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX})

# build byproducts only needed by Ninja
if("${CMAKE_GENERATOR}" STREQUAL "Ninja")
set(PCRE_BYPRODUCTS
<BINARY_DIR>/pcre.h
<BINARY_DIR>/${PCRE_LIBNAME}
set(ROOT_PCRE2_BYPRODUCTS
${ROOT_PCRE2_INCLUDE_DIR}/pcre2.h
${ROOT_PCRE2_LIBRARY}
)
endif()

ExternalProject_Add(PCRE
URL ${CMAKE_CURRENT_SOURCE_DIR}/pcre-${PCRE_VERSION}.tar.bz2
URL_HASH SHA256=f1026a7f455b8ba726d6fff94d5f989e55ad55f7b4eb946938803ac2aa41743c
ExternalProject_Add(
BUILTIN_PCRE
PREFIX ${ROOT_PCRE2_PREFIX}
URL ${lcgpackages}/pcre2-${ROOT_PCRE2_VERSION}.tar.bz2
URL_HASH SHA256=${ROOT_PCRE2_HASH}

LOG_DOWNLOAD TRUE
LOG_CONFIGURE TRUE
LOG_BUILD TRUE
LOG_INSTALL TRUE
LOG_OUTPUT_ON_FAILURE TRUE

CMAKE_CACHE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
Expand All @@ -56,35 +69,31 @@ ExternalProject_Add(PCRE
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-DCMAKE_BUILD_SHARED_LIBS:BOOL=FALSE
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE
-DCMAKE_POLICY_VERSION_MINIMUM:STRING=3.5
-DPCRE_BUILD_TESTS:BOOL=FALSE
-DPCRE2_BUILD_TESTS:BOOL=FALSE
-DCMAKE_INSTALL_LIBDIR=<INSTALL_DIR>/lib
-DCMAKE_INSTALL_BINDIR=<INSTALL_DIR>/lib

BUILD_COMMAND
${CMAKE_COMMAND} --build <BINARY_DIR> ${pcre_config} --target pcre
${CMAKE_COMMAND} --build <BINARY_DIR> ${pcre2_config} --target pcre2-8-static
INSTALL_COMMAND
${CMAKE_COMMAND} --build <BINARY_DIR> --target install

BUILD_BYPRODUCTS
${PCRE_BYPRODUCTS}
${ROOT_PCRE2_BYPRODUCTS}

INSTALL_COMMAND ""
TIMEOUT 600
)

ExternalProject_Get_Property(PCRE BINARY_DIR)

set(PCRE_FOUND TRUE CACHE INTERNAL "" FORCE)
set(PCRE_INCLUDE_DIR "${BINARY_DIR}" CACHE INTERNAL "" FORCE)
if(WIN32)
set(PCRE_PCRE_LIBRARY "${BINARY_DIR}/${pcre_config_kind}/${PCRE_LIBNAME}" CACHE INTERNAL "" FORCE)
else()
set(PCRE_PCRE_LIBRARY "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCRE_LIBNAME}" CACHE INTERNAL "" FORCE)
endif()
set(PCRE_LIBRARIES "${PCRE_PCRE_LIBRARY}" CACHE INTERNAL "" FORCE)
set(PCRE_TARGET PCRE)
file(MAKE_DIRECTORY ${ROOT_PCRE2_INCLUDE_DIR})
add_library(PCRE2::PCRE2 IMPORTED STATIC GLOBAL)
add_dependencies(PCRE2::PCRE2 BUILTIN_PCRE)
set_target_properties(PCRE2::PCRE2 PROPERTIES
IMPORTED_LOCATION ${ROOT_PCRE2_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${ROOT_PCRE2_INCLUDE_DIR})

add_library(pcre_builtin INTERFACE)
target_include_directories(pcre_builtin INTERFACE $<BUILD_INTERFACE:${PCRE_INCLUDE_DIR}>)
target_link_libraries(pcre_builtin INTERFACE $<BUILD_INTERFACE:${PCRE_LIBRARIES}>)
add_library(PCRE::PCRE ALIAS pcre_builtin)
add_dependencies(pcre_builtin PCRE)
set_property(GLOBAL APPEND PROPERTY ROOT_BUILTIN_TARGETS BUILTIN_PCRE)

set_property(GLOBAL APPEND PROPERTY ROOT_BUILTIN_TARGETS PCRE)
set(PCRE2_FOUND TRUE PARENT_SCOPE)
set(PCRE2_VERSION ${ROOT_PCRE2_VERSION} PARENT_SCOPE)
set(PCRE2_INCLUDE_DIRS "${ROOT_PCRE2_INCLUDE_DIR}" PARENT_SCOPE)
set(PCRE2_LIBRARIES "${ROOT_PCRE2_LIBRARY}" PARENT_SCOPE)
Binary file removed builtins/pcre/pcre-8.43.tar.bz2
Binary file not shown.
13 changes: 4 additions & 9 deletions cmake/modules/SearchInstalledSoftware.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -287,21 +287,16 @@ if(NOT builtin_pcre)
endforeach()
find_package(PCRE2)
if(NOT PCRE2_FOUND)
if(fail-on-missing)
find_package(PCRE REQUIRED)
else()
find_package(PCRE)
if(NOT PCRE_FOUND)
message(STATUS "PCRE not found. Switching on builtin_pcre option")
set(builtin_pcre ON CACHE BOOL "Enabled because PCRE not found (${builtin_pcre_description})" FORCE)
endif()
find_package(PCRE)
if(NOT PCRE_FOUND)
message(SEND_ERROR "PCRE2 required but not found. Install it on the system (preferred), or explicitly request the builtin version.")
endif()
endif()
endif()

if(builtin_pcre)
list(APPEND ROOT_BUILTINS PCRE)
add_subdirectory(builtins/pcre)
list(APPEND ROOT_BUILTINS BUILTIN_PCRE)
endif()

#---Check for LZMA-------------------------------------------------------------------
Expand Down
Loading