Browse Source

Merge topic 'FindPerlLibs-MacOS-failure'

a6005371 FindPerlLibs: Add support for MSYS and CYGWIN
362a1f33 FindPerlLibs: refactoring
c365a078 FindPerlLibs: fix MacOS failure

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1586
Brad King 8 years ago
parent
commit
95e86eafd7
1 changed files with 57 additions and 155 deletions
  1. 57 155
      Modules/FindPerlLibs.cmake

+ 57 - 155
Modules/FindPerlLibs.cmake

@@ -32,193 +32,94 @@
 #
 # ::
 #
-#   PERL_SITESEARCH    = path to the sitesearch install dir
-#   PERL_SITELIB       = path to the sitelib install directory
-#   PERL_VENDORARCH    = path to the vendor arch install directory
-#   PERL_VENDORLIB     = path to the vendor lib install directory
-#   PERL_ARCHLIB       = path to the arch lib install directory
-#   PERL_PRIVLIB       = path to the priv lib install directory
+#   PERL_SITESEARCH     = path to the sitesearch install dir (-V:installsitesearch)
+#   PERL_SITEARCH       = path to the sitelib install directory (-V:installsitearch)
+#   PERL_SITELIB        = path to the sitelib install directory (-V:installsitelib)
+#   PERL_VENDORARCH     = path to the vendor arch install directory (-V:installvendorarch)
+#   PERL_VENDORLIB      = path to the vendor lib install directory (-V:installvendorlib)
+#   PERL_ARCHLIB        = path to the core arch lib install directory (-V:archlib)
+#   PERL_PRIVLIB        = path to the core priv lib install directory (-V:privlib)
+#   PERL_UPDATE_ARCHLIB = path to the update arch lib install directory (-V:installarchlib)
+#   PERL_UPDATE_PRIVLIB = path to the update priv lib install directory (-V:installprivlib)
 #   PERL_EXTRA_C_FLAGS = Compilation flags used to build perl
 
 # find the perl executable
 include(${CMAKE_CURRENT_LIST_DIR}/FindPerl.cmake)
 
 if (PERL_EXECUTABLE)
-  ### PERL_PREFIX
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:prefix
-      OUTPUT_VARIABLE
-        PERL_PREFIX_OUTPUT_VARIABLE
-      RESULT_VARIABLE
-        PERL_PREFIX_RESULT_VARIABLE
-  )
 
-  if (NOT PERL_PREFIX_RESULT_VARIABLE)
-    string(REGEX REPLACE "prefix='([^']+)'.*" "\\1" PERL_PREFIX ${PERL_PREFIX_OUTPUT_VARIABLE})
-  endif ()
+  function (perl_get_info _pgi_info tag)
+    cmake_parse_arguments(_PGI "IS_PATH" "" "" ${ARGN})
 
-  ### PERL_ARCHNAME
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:archname
-      OUTPUT_VARIABLE
-        PERL_ARCHNAME_OUTPUT_VARIABLE
-      RESULT_VARIABLE
-        PERL_ARCHNAME_RESULT_VARIABLE
-  )
-  if (NOT PERL_ARCHNAME_RESULT_VARIABLE)
-    string(REGEX REPLACE "archname='([^']+)'.*" "\\1" PERL_ARCHNAME ${PERL_ARCHNAME_OUTPUT_VARIABLE})
-  endif ()
+    set (${_pgi_info} NOTFOUND PARENT_SCOPE)
+
+    execute_process(COMMAND "${PERL_EXECUTABLE}" -V:${tag}
+      OUTPUT_VARIABLE result
+      RESULT_VARIABLE status)
+
+    if (NOT status)
+      string(REGEX REPLACE "${tag}='([^']*)'.*" "\\1" result "${result}")
+      if (_PGI_IS_PATH)
+        file(TO_CMAKE_PATH "${result}" result)
+      endif()
+      set (${_pgi_info} "${result}" PARENT_SCOPE)
+    endif ()
+  endfunction()
 
+  ### PERL_PREFIX
+  perl_get_info(PERL_PREFIX prefix IS_PATH)
 
+  ### PERL_ARCHNAME
+  perl_get_info(PERL_ARCHNAME archname)
 
   ### PERL_EXTRA_C_FLAGS
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:cppflags
-    OUTPUT_VARIABLE
-      PERL_CPPFLAGS_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_CPPFLAGS_RESULT_VARIABLE
-    )
-  if (NOT PERL_CPPFLAGS_RESULT_VARIABLE)
-    string(REGEX REPLACE "cppflags='([^']+)'.*" "\\1" PERL_EXTRA_C_FLAGS ${PERL_CPPFLAGS_OUTPUT_VARIABLE})
-  endif ()
+  perl_get_info(PERL_EXTRA_C_FLAGS cppflags)
 
   ### PERL_SITESEARCH
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installsitesearch
-    OUTPUT_VARIABLE
-      PERL_SITESEARCH_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_SITESEARCH_RESULT_VARIABLE
-  )
-  if (NOT PERL_SITESEARCH_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_SITESEARCH ${PERL_SITESEARCH_OUTPUT_VARIABLE})
-    file(TO_CMAKE_PATH "${PERL_SITESEARCH}" PERL_SITESEARCH)
-  endif ()
+  perl_get_info(PERL_SITESEARCH installsitesearch IS_PATH)
+
+  ### PERL_SITEARCH
+  perl_get_info(PERL_SITEARCH installsitearch IS_PATH)
 
   ### PERL_SITELIB
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installsitelib
-    OUTPUT_VARIABLE
-      PERL_SITELIB_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_SITELIB_RESULT_VARIABLE
-  )
-  if (NOT PERL_SITELIB_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_SITELIB ${PERL_SITELIB_OUTPUT_VARIABLE})
-    file(TO_CMAKE_PATH "${PERL_SITELIB}" PERL_SITELIB)
-  endif ()
+  perl_get_info(PERL_SITELIB installsitelib IS_PATH)
 
   ### PERL_VENDORARCH
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installvendorarch
-    OUTPUT_VARIABLE
-      PERL_VENDORARCH_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_VENDORARCH_RESULT_VARIABLE
-    )
-  if (NOT PERL_VENDORARCH_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_VENDORARCH ${PERL_VENDORARCH_OUTPUT_VARIABLE})
-    file(TO_CMAKE_PATH "${PERL_VENDORARCH}" PERL_VENDORARCH)
-  endif ()
+  perl_get_info(PERL_VENDORARCH installvendorarch IS_PATH)
 
   ### PERL_VENDORLIB
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installvendorlib
-    OUTPUT_VARIABLE
-      PERL_VENDORLIB_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_VENDORLIB_RESULT_VARIABLE
-  )
-  if (NOT PERL_VENDORLIB_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_VENDORLIB ${PERL_VENDORLIB_OUTPUT_VARIABLE})
-    file(TO_CMAKE_PATH "${PERL_VENDORLIB}" PERL_VENDORLIB)
-  endif ()
-
-  macro(perl_adjust_darwin_lib_variable varname)
-    string( TOUPPER PERL_${varname} FINDPERL_VARNAME )
-    string( TOLOWER install${varname} PERL_VARNAME )
-
-    if (NOT PERL_MINUSV_OUTPUT_VARIABLE)
-      execute_process(
-        COMMAND
-        ${PERL_EXECUTABLE} -V
-        OUTPUT_VARIABLE
-        PERL_MINUSV_OUTPUT_VARIABLE
-        RESULT_VARIABLE
-        PERL_MINUSV_RESULT_VARIABLE
-        )
-    endif()
-
-    if (NOT PERL_MINUSV_RESULT_VARIABLE)
-      string(REGEX MATCH "(${PERL_VARNAME}.*points? to the Updates directory)"
-        PERL_NEEDS_ADJUSTMENT ${PERL_MINUSV_OUTPUT_VARIABLE})
-
-      if (PERL_NEEDS_ADJUSTMENT)
-        string(REGEX REPLACE "(.*)/Updates/" "/System/\\1/" ${FINDPERL_VARNAME} ${${FINDPERL_VARNAME}})
-      endif ()
-
-    endif ()
-  endmacro()
+  perl_get_info(PERL_VENDORLIB installvendorlib IS_PATH)
 
   ### PERL_ARCHLIB
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installarchlib
-      OUTPUT_VARIABLE
-        PERL_ARCHLIB_OUTPUT_VARIABLE
-      RESULT_VARIABLE
-        PERL_ARCHLIB_RESULT_VARIABLE
-  )
-  if (NOT PERL_ARCHLIB_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_ARCHLIB ${PERL_ARCHLIB_OUTPUT_VARIABLE})
-    perl_adjust_darwin_lib_variable( ARCHLIB )
-    file(TO_CMAKE_PATH "${PERL_ARCHLIB}" PERL_ARCHLIB)
-  endif ()
+  perl_get_info(PERL_ARCHLIB archlib IS_PATH)
 
   ### PERL_PRIVLIB
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:installprivlib
-    OUTPUT_VARIABLE
-      PERL_PRIVLIB_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_PRIVLIB_RESULT_VARIABLE
-  )
-  if (NOT PERL_PRIVLIB_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_PRIVLIB ${PERL_PRIVLIB_OUTPUT_VARIABLE})
-    perl_adjust_darwin_lib_variable( PRIVLIB )
-    file(TO_CMAKE_PATH "${PERL_PRIVLIB}" PERL_PRIVLIB)
-  endif ()
+  perl_get_info(PERL_PRIVLIB privlib IS_PATH)
+
+  ### PERL_UPDATE_ARCHLIB
+  perl_get_info(PERL_UPDATE_ARCHLIB installarchlib IS_PATH)
+
+  ### PERL_UPDATE_PRIVLIB
+  perl_get_info(PERL_UPDATE_PRIVLIB installprivlib IS_PATH)
 
   ### PERL_POSSIBLE_LIBRARY_NAMES
-  execute_process(
-    COMMAND
-      ${PERL_EXECUTABLE} -V:libperl
-    OUTPUT_VARIABLE
-      PERL_LIBRARY_OUTPUT_VARIABLE
-    RESULT_VARIABLE
-      PERL_LIBRARY_RESULT_VARIABLE
-  )
-  if (NOT PERL_LIBRARY_RESULT_VARIABLE)
-    string(REGEX REPLACE "libperl='([^']+)'.*" "\\1" PERL_POSSIBLE_LIBRARY_NAMES ${PERL_LIBRARY_OUTPUT_VARIABLE})
-  else ()
+  perl_get_info(PERL_POSSIBLE_LIBRARY_NAMES libperl)
+  if (NOT PERL_POSSIBLE_LIBRARY_NAMES)
     set(PERL_POSSIBLE_LIBRARY_NAMES perl${PERL_VERSION_STRING} perl)
-  endif ()
+  endif()
+  if (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN")
+    # on MSYS and CYGWIN environments, current perl -V:libperl gives shared library name
+    # rather than the import library. So, extends possible library names
+    list (APPEND PERL_POSSIBLE_LIBRARY_NAMES perl)
+  endif()
 
   ### PERL_INCLUDE_PATH
   find_path(PERL_INCLUDE_PATH
     NAMES
       perl.h
     PATHS
-      ${PERL_ARCHLIB}/CORE
+      "${PERL_UPDATE_ARCHLIB}/CORE"
+      "${PERL_ARCHLIB}/CORE"
       /usr/lib/perl5/${PERL_VERSION_STRING}/${PERL_ARCHNAME}/CORE
       /usr/lib/perl/${PERL_VERSION_STRING}/${PERL_ARCHNAME}/CORE
       /usr/lib/perl5/${PERL_VERSION_STRING}/CORE
@@ -230,7 +131,8 @@ if (PERL_EXECUTABLE)
     NAMES
       ${PERL_POSSIBLE_LIBRARY_NAMES}
     PATHS
-      ${PERL_ARCHLIB}/CORE
+      "${PERL_UPDATE_ARCHLIB}/CORE"
+      "${PERL_ARCHLIB}/CORE"
       /usr/lib/perl5/${PERL_VERSION_STRING}/${PERL_ARCHNAME}/CORE
       /usr/lib/perl/${PERL_VERSION_STRING}/${PERL_ARCHNAME}/CORE
       /usr/lib/perl5/${PERL_VERSION_STRING}/CORE