Browse Source

FindIntl: Add imported target

Fixes: #21271
Signed-off-by: Sibi Siddharthan <[email protected]>
Sibi Siddharthan 5 years ago
parent
commit
c30d06b7e6

+ 1 - 0
.gitlab/ci/configure_debian10_ninja.cmake

@@ -19,6 +19,7 @@ set(CMake_TEST_FindGSL "ON" CACHE BOOL "")
 set(CMake_TEST_FindGTest "ON" CACHE BOOL "")
 set(CMake_TEST_FindGTK2 "ON" CACHE BOOL "")
 set(CMake_TEST_FindIconv "ON" CACHE BOOL "")
+set(CMake_TEST_FindIntl "ON" CACHE BOOL "")
 set(CMake_TEST_FindJPEG "ON" CACHE BOOL "")
 set(CMake_TEST_FindJsonCpp "ON" CACHE BOOL "")
 set(CMake_TEST_FindLAPACK "ON" CACHE BOOL "")

+ 1 - 0
.gitlab/ci/configure_fedora31_makefiles.cmake

@@ -19,6 +19,7 @@ set(CMake_TEST_FindGSL "ON" CACHE BOOL "")
 set(CMake_TEST_FindGTest "ON" CACHE BOOL "")
 set(CMake_TEST_FindGTK2 "ON" CACHE BOOL "")
 set(CMake_TEST_FindIconv "ON" CACHE BOOL "")
+set(CMake_TEST_FindIntl "ON" CACHE BOOL "")
 set(CMake_TEST_FindJPEG "ON" CACHE BOOL "")
 set(CMake_TEST_FindJsonCpp "ON" CACHE BOOL "")
 set(CMake_TEST_FindLAPACK "ON" CACHE BOOL "")

+ 4 - 0
Help/release/dev/FindIntl-imported-target.rst

@@ -0,0 +1,4 @@
+FindIntl-imported-target
+------------------------
+
+* The :module:`FindIntl` module now provides an imported target.

+ 36 - 8
Modules/FindIntl.cmake

@@ -15,11 +15,16 @@ installation in several variables.  General variables::
   Intl_FOUND - true if the libintl headers and libraries were found
   Intl_INCLUDE_DIRS - the directory containing the libintl headers
   Intl_LIBRARIES - libintl libraries to be linked
+  Intl::Intl - imported target for Intl
 
 The following cache variables may also be set::
 
   Intl_INCLUDE_DIR - the directory containing the libintl headers
   Intl_LIBRARY - the libintl library (if any)
+  Intl_HAVE_GETTEXT_BUILTIN - check if gettext is in the C library
+  Intl_HAVE_DCGETTEXT_BUILTIN - check if dcgettext is in the C library
+  Intl_IS_BUILTIN - whether intl is a part of the C library determined
+      from the result of Intl_HAVE_GETTEXT_BUILTIN and Intl_HAVE_DCGETTEXT_BUILTIN
 
 .. note::
   On some platforms, such as Linux with GNU libc, the gettext
@@ -35,6 +40,22 @@ The following cache variables may also be set::
 
 # Written by Roger Leigh <[email protected]>
 
+include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/CheckSymbolExists.cmake)
+
+# Check if we have libintl is a part of libc
+cmake_push_check_state(RESET)
+set(CMAKE_REQUIRED_QUIET TRUE)
+check_symbol_exists(gettext libintl.h Intl_HAVE_GETTEXT_BUILTIN)
+check_symbol_exists(dcgettext libintl.h Intl_HAVE_DCGETTEXT_BUILTIN) # redundant check
+cmake_pop_check_state()
+
+if(Intl_HAVE_GETTEXT_BUILTIN AND Intl_HAVE_DCGETTEXT_BUILTIN)
+  set(Intl_IS_BUILTIN TRUE)
+else()
+  set(Intl_IS_BUILTIN FALSE)
+endif()
+
 # Find include directory
 find_path(Intl_INCLUDE_DIR
           NAMES "libintl.h"
@@ -42,21 +63,28 @@ find_path(Intl_INCLUDE_DIR
 mark_as_advanced(Intl_INCLUDE_DIR)
 
 # Find all Intl libraries
-find_library(Intl_LIBRARY "intl" NAMES_PER_DIR
-  DOC "libintl libraries (if not in the C library)")
-mark_as_advanced(Intl_LIBRARY)
+set(Intl_REQUIRED_VARS)
+if(NOT Intl_IS_BUILTIN)
+  find_library(Intl_LIBRARY "intl" "libintl" NAMES_PER_DIR
+    DOC "libintl libraries (if not in the C library)")
+  mark_as_advanced(Intl_LIBRARY)
+  list(APPEND Intl_REQUIRED_VARS Intl_LIBRARY)
+endif()
 
 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(Intl
                                   FOUND_VAR Intl_FOUND
-                                  REQUIRED_VARS Intl_INCLUDE_DIR
+                                  REQUIRED_VARS Intl_INCLUDE_DIR ${Intl_REQUIRED_VARS}
                                   FAIL_MESSAGE "Failed to find Gettext libintl")
+unset(Intl_REQUIRED_VARS)
 
 if(Intl_FOUND)
   set(Intl_INCLUDE_DIRS "${Intl_INCLUDE_DIR}")
-  if(Intl_LIBRARY)
-    set(Intl_LIBRARIES "${Intl_LIBRARY}")
-  else()
-    unset(Intl_LIBRARIES)
+  set(Intl_LIBRARIES "${Intl_LIBRARY}")
+  if(NOT TARGET Intl::Intl)
+    add_library(Intl::Intl INTERFACE IMPORTED)
+    set_target_properties(Intl::Intl PROPERTIES
+      INTERFACE_INCLUDE_DIRECTORIES "${Intl_INCLUDE_DIRS}"
+      INTERFACE_LINK_LIBRARIES "${Intl_LIBRARIES}")
   endif()
 endif()

+ 1 - 0
Tests/CMakeLists.txt

@@ -1422,6 +1422,7 @@ if(BUILD_TESTING)
             GTK2
             Iconv
             ICU
+            Intl
             JPEG
             JsonCpp
             LAPACK

+ 10 - 0
Tests/FindIntl/CMakeLists.txt

@@ -0,0 +1,10 @@
+add_test(NAME FindIntl.Test COMMAND
+  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+  --build-and-test
+  "${CMake_SOURCE_DIR}/Tests/FindIntl/Test"
+  "${CMake_BINARY_DIR}/Tests/FindIntl/Test"
+  ${build_generator_args}
+  --build-project TestFindIntl
+  --build-options ${build_options}
+  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+  )

+ 14 - 0
Tests/FindIntl/Test/CMakeLists.txt

@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.10)
+project(TestFindIntl CXX)
+include(CTest)
+
+find_package(Intl REQUIRED)
+
+add_executable(test_intl_tgt main.cxx)
+target_link_libraries(test_intl_tgt Intl::Intl)
+add_test(NAME test_intl_tgt COMMAND test_intl_tgt)
+
+add_executable(test_intl_var main.cxx)
+target_include_directories(test_intl_var PRIVATE ${Intl_INCLUDE_DIRS})
+target_link_libraries(test_intl_var PRIVATE ${Intl_LIBRARIES})
+add_test(NAME test_intl_var COMMAND test_intl_var)

+ 11 - 0
Tests/FindIntl/Test/main.cxx

@@ -0,0 +1,11 @@
+extern "C" {
+#include <libintl.h>
+}
+
+int main()
+{
+  // Check if we include the directory correctly and have no link errors
+  bindtextdomain("", "");
+  gettext("");
+  return 0;
+}