From 45ec5ce9c4bb7ad7a3967cd28bf61778962e8dea Mon Sep 17 00:00:00 2001
From: Guilherme Amadio <amadio@cern.ch>
Date: Tue, 22 Jan 2019 13:45:14 +0100
Subject: [PATCH] builtins/pcre: unify configuration for UNIX and Windows

---
 builtins/pcre/CMakeLists.txt                | 100 ++++++++++----------
 cmake/modules/SearchInstalledSoftware.cmake |   5 +-
 2 files changed, 54 insertions(+), 51 deletions(-)

diff --git a/builtins/pcre/CMakeLists.txt b/builtins/pcre/CMakeLists.txt
index 0ae374efbbd..ce235e65b88 100644
--- a/builtins/pcre/CMakeLists.txt
+++ b/builtins/pcre/CMakeLists.txt
@@ -1,58 +1,58 @@
 include(ExternalProject)
 
-set(PCRE_VERSION "8.42")
-set(PCRE_URL "${CMAKE_CURRENT_SOURCE_DIR}/pcre-${PCRE_VERSION}.tar.gz")
-set(PCRE_LIBNAME ${CMAKE_STATIC_LIBRARY_PREFIX}pcre${CMAKE_STATIC_LIBRARY_SUFFIX})
-set(PCRE_PCRE_LIBRARY ${CMAKE_BINARY_DIR}/lib/${PCRE_LIBNAME})
-
-if(WIN32)
-  if (winrtdebug)
-    set(pcre_lib pcred.lib)
-    set(pcre_build_type Debug)
-  else()
-    set(pcre_lib pcre.lib)
-    set(pcre_build_type Release)
-  endif()
-  ExternalProject_Add(PCRE
-    URL ${PCRE_URL}
-    INSTALL_DIR ${CMAKE_BINARY_DIR}
-    BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${pcre_build_type}
-    INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different ${pcre_build_type}/${pcre_lib} ${PCRE_PCRE_LIBRARY}
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcre.h  <INSTALL_DIR>/include
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcre_scanner.h  <INSTALL_DIR>/include
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcre_stringpiece.h  <INSTALL_DIR>/include
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcrecpp.h  <INSTALL_DIR>/include
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcrecpparg.h  <INSTALL_DIR>/include
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different pcreposix.h  <INSTALL_DIR>/include
-    LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1 BUILD_IN_SOURCE 1
-    BUILD_BYPRODUCTS ${PCRE_PCRE_LIBRARY})
-else()
-  set(PCREPOSIX_LIBNAME ${CMAKE_STATIC_LIBRARY_PREFIX}pcreposix${CMAKE_STATIC_LIBRARY_SUFFIX})
-  set(PCRE_PCREPOSIX_LIBRARY ${CMAKE_BINARY_DIR}/lib/${PCREPOSIX_LIBNAME})
-
-  if(CMAKE_OSX_SYSROOT)
-    set(_pcre_cflags "-isysroot ${CMAKE_OSX_SYSROOT}")
-  endif()
-  ExternalProject_Add(PCRE
-    URL ${PCRE_URL}
-    INSTALL_DIR ${CMAKE_BINARY_DIR}
-    CONFIGURE_COMMAND ./configure --prefix <INSTALL_DIR> --with-pic --disable-shared
-                      CC=${CMAKE_C_COMPILER} CFLAGS=${_pcre_cflags}
-    INSTALL_COMMAND make install-libLTLIBRARIES
-                         install-includeHEADERS
-                         install-nodist_includeHEADERS
-    LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1 BUILD_IN_SOURCE 1
-    BUILD_BYPRODUCTS ${PCRE_PCRE_LIBRARY} ${PCRE_PCREPOSIX_LIBRARY})
+# Clear cache variables set by find_package(PCRE)
+# to ensure that we use the builtin version
+foreach(var PCRE_FOUND PCRE_VERSION PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY PCRE_LIBRARIES)
+  unset(${var} CACHE)
+endforeach()
+
+if(winrtdebug)
+  set(DEBUG_POSTFIX d)
 endif()
 
-unset(PCRE_FOUND CACHE)
-unset(PCRE_FOUND PARENT_SCOPE)
-set(PCRE_FOUND TRUE CACHE BOOL "" FORCE)
+set(PCRE_VERSION "8.42" CACHE INTERNAL "" FORCE)
+set(PCRE_LIBNAME ${CMAKE_STATIC_LIBRARY_PREFIX}pcre${DEBUG_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX})
+
+ExternalProject_Add(PCRE
+  URL ${CMAKE_CURRENT_SOURCE_DIR}/pcre-${PCRE_VERSION}.tar.gz
+  URL_HASH SHA256=69acbc2fbdefb955d42a4c606dfde800c2885711d2979e356c0636efde9ec3b5
+
+  LOG_DOWNLOAD  TRUE
+  LOG_CONFIGURE TRUE
+  LOG_BUILD     TRUE
+  LOG_INSTALL   TRUE
+
+  CMAKE_CACHE_ARGS
+    -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+    -DCMAKE_GENERATOR:STRING=${CMAKE_GENERATOR}
+    -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+    -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
+    -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
+    -DCMAKE_BUILD_SHARED_LIBS:BOOL=FALSE
+    -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE
+
+  BUILD_COMMAND
+    ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> --target pcre
 
-set(PCRE_INCLUDE_DIR ${CMAKE_BINARY_DIR}/include CACHE INTERNAL "" FORCE)
-set(PCRE_PCRE_LIBRARY ${PCRE_PCRE_LIBRARY} CACHE INTERNAL "" FORCE)
-set(PCRE_PCREPOSIX_LIBRARY ${PCRE_PCREPOSIX_LIBRARY} CACHE INTERNAL "" FORCE)
-set(PCRE_LIBRARIES ${PCRE_PCRE_LIBRARY} ${PCRE_PCREPOSIX_LIBRARY} CACHE INTERNAL "" FORCE)
+  BUILD_BYPRODUCTS
+    <BINARY_DIR>/pcre.h
+    <BINARY_DIR>/${CMAKE_CFG_INTDIR}/${PCRE_LIBNAME}
+
+  INSTALL_COMMAND ""
+)
+
+ExternalProject_Get_Property(PCRE BINARY_DIR)
+
+set(PCRE_FOUND TRUE CACHE INTERNAL "" FORCE)
+set(PCRE_INCLUDE_DIR "${BINARY_DIR}" CACHE INTERNAL "" FORCE)
+set(PCRE_PCRE_LIBRARY "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCRE_LIBNAME}" CACHE INTERNAL "" FORCE)
+set(PCRE_LIBRARIES "${PCRE_PCRE_LIBRARY}" CACHE INTERNAL "" FORCE)
 set(PCRE_TARGET PCRE)
 
+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 PCRE)
diff --git a/cmake/modules/SearchInstalledSoftware.cmake b/cmake/modules/SearchInstalledSoftware.cmake
index 2c9cd74a31f..270763a6aea 100644
--- a/cmake/modules/SearchInstalledSoftware.cmake
+++ b/cmake/modules/SearchInstalledSoftware.cmake
@@ -133,7 +133,10 @@ endif()
 #---Check for PCRE-------------------------------------------------------------------
 if(NOT builtin_pcre)
   message(STATUS "Looking for PCRE")
-  foreach(suffix FOUND INCLUDE_DIR PCRE_LIBRARY PCREPOSIX_LIBRARY)
+  # Clear cache before calling find_package(PCRE),
+  # necessary to be able to toggle builtin_pcre and
+  # not have find_package(PCRE) find builtin pcre.
+  foreach(suffix FOUND INCLUDE_DIR PCRE_LIBRARY)
     unset(PCRE_${suffix} CACHE)
   endforeach()
   find_package(PCRE)
-- 
GitLab