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: