[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#887827: kcalcore FTCBFS: uses try_run



Source: kcalcore
Version: 4:17.08.3-1
Tags: patch upstream
User: helmutg@debian.org
Usertags: rebootstrap

kcalcore fails to cross build from source, because it uses try_run from
cmake to figure out the version of libical. Sadly, libical only makes
this easily testable with try_compile in version 3.0 and kcalcore still
uses 2.0. The version is a macro that becomes a string (in <3.0). We
cannot reasonably extract that with try_compile. Bummer.

Fortunately, libical provides a pkg-config file and that file ships a
version. Thus we can use pkg-config to extract the version. This also
means that we no longer have to guess what libraries to link to or the
like as the pkg-config file knows about such things. It all becomes a
lot easier.

After applying the attached patch (and adding pkg-config to
Build-Depends), kcalcore cross builds successfully. Can you apply it?

Helmut
Index: kcalcore-17.08.3/cmake/FindLibIcal.cmake
===================================================================
--- kcalcore-17.08.3.orig/cmake/FindLibIcal.cmake
+++ kcalcore-17.08.3/cmake/FindLibIcal.cmake
@@ -12,6 +12,8 @@
 # Redistribution and use is allowed according to the terms of the BSD license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
+include(FindPkgConfig)
+
 if(NOT LibIcal_FIND_VERSION)
   set(LibIcal_FIND_VERSION "0.33")
 endif()
@@ -20,71 +22,20 @@
   file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _program_FILES_DIR)
 endif()
 
-#set the root from the LibIcal_BASE environment
-file(TO_CMAKE_PATH "$ENV{LibIcal_BASE}" libical_root)
-
-#override the root from LibIcal_BASE defined to cmake
-if(DEFINED LibIcal_BASE)
-  file(TO_CMAKE_PATH "${LibIcal_BASE}" libical_root)
-endif()
-
-find_path(LibIcal_INCLUDE_DIRS
-    NAMES libical/ical.h
-    HINTS ${libical_root}/include ${_program_FILES_DIR}/libical/include
-)
-
-find_library(LibIcal_LIBRARY
-    NAMES ical libical
-    HINTS ${libical_root}/lib ${_program_FILES_DIR}/libical/lib
-)
-
-find_library(LibIcalss_LIBRARY
-    NAMES icalss libicalss
-    HINTS ${libical_root}/lib ${_program_FILES_DIR}/libical/lib
-)
-
-set(LibIcal_LIBRARIES ${LibIcal_LIBRARY} ${LibIcalss_LIBRARY})
-
-if(LibIcal_INCLUDE_DIRS AND LibIcal_LIBRARIES)
-  set(FIND_LibIcal_VERSION_SOURCE
-    "#include <libical/ical.h>\n int main()\n {\n printf(\"%s\",ICAL_VERSION);return 1;\n }\n")
-  set(FIND_LibIcal_VERSION_SOURCE_FILE ${CMAKE_BINARY_DIR}/CMakeTmp/FindLIBICAL.cxx)
-  file(WRITE "${FIND_LibIcal_VERSION_SOURCE_FILE}" "${FIND_LibIcal_VERSION_SOURCE}")
-
-  set(FIND_LibIcal_VERSION_ADD_INCLUDES
-    "-DINCLUDE_DIRECTORIES:STRING=${LibIcal_INCLUDE_DIRS}")
+pkg_check_modules(LibIcal libical>=${LibIcal_FIND_VERSION})
 
-  if(NOT CMAKE_CROSSCOMPILING)
-  try_run(RUN_RESULT COMPILE_RESULT
-    ${CMAKE_BINARY_DIR}
-    ${FIND_LibIcal_VERSION_SOURCE_FILE}
-    CMAKE_FLAGS "${FIND_LibIcal_VERSION_ADD_INCLUDES}"
-    COMPILE_OUTPUT_VARIABLE FIND_LibIcal_Compile_Output
-    RUN_OUTPUT_VARIABLE LibIcal_VERSION)
+if(LibIcal_FOUND)
+  # INCLUDE_DIRS omits standard directories, but we need it non-empty
+  if(NOT LibIcal_INCLUDE_DIRS)
+    set(LibIcal_INCLUDE_DIRS ${LibIcal_INCLUDEDIR})
   endif()
 
-  if(COMPILE_RESULT AND RUN_RESULT EQUAL 1 AND NOT CMAKE_CROSSCOMPILING)
-    message(STATUS "Found Libical version ${LibIcal_VERSION}")
-    if(${LibIcal_VERSION} VERSION_LESS ${LibIcal_FIND_VERSION})
-      message(STATUS "LibIcal version ${LibIcal_VERSION} is too old. At least version ${LibIcal_FIND_VERSION} is needed.")
-      set(LibIcal_INCLUDE_DIRS "")
-      set(LibIcal_LIBRARIES "")
-    endif()
-    if(NOT LibIcal_VERSION VERSION_LESS 0.46)
-      set(USE_ICAL_0_46 TRUE)
-    endif()
-    if(NOT LibIcal_VERSION VERSION_LESS 1.00)
-      set(USE_ICAL_1_0 TRUE)
-    endif()
-
-  else()
-    if(NOT CMAKE_CROSSCOMPILING)
-      if (NOT COMPILE_RESULT)
-        message(FATAL_ERROR "Unable to compile the libical version detection program: ${FIND_LibIcal_Compile_Output}")
-      else()
-        message(FATAL_ERROR "Unable to run the libical version detection program: it returned ${RUN_RESULT}.")
-      endif()
-    endif()
+  message(STATUS "Found Libical version ${LibIcal_VERSION}")
+  if(NOT LibIcal_VERSION VERSION_LESS 0.46)
+    set(USE_ICAL_0_46 TRUE)
+  endif()
+  if(NOT LibIcal_VERSION VERSION_LESS 1.00)
+    set(USE_ICAL_1_0 TRUE)
   endif()
 
   #compute the major and minor version numbers

Reply to: