[cmake-developers] Kind-of standard way to support also in-project find-modules

Alexander Neundorf neundorf at kde.org
Tue Jan 11 16:18:56 EST 2011


Hi,

not sure the subject says very good what I mean.

Well, there was the following commit in KDE for two module FindKExiv2.cmake 
and FindKipi.cmake
For both modules it adds a variable <UPPERCASED_NAME>_LOCAL_DIR, which can be 
set if the using project doesn't use an externally installed KExiv2/Kipi, but 
if it has its own copy.
Then this variable should be set to the source directory of the included 
KExiv2/Kipi, and the find-module will honor this and set the include 
directories and library-variables accordingly.

I think this idea is not bad.
But to have a good start, having a good naming convention for this variable 
would be good.

So here comes my list of suggestions:
<UPPERNAME>_LOCAL_DIR
<UPPERNAME>_LOCAL_SOURCE_DIR
<UPPERNAME>_LOCAL_SOURCES_DIR
<UPPERNAME>_SRC_DIR
<UPPERNAME>_SOURCE_DIR
<UPPERNAME>_SOURCES_DIR
<UPPERNAME>_IN_PROJECT_SOURCE_DIR
and the same with <ExactName>.

I think my favourite would be <ExactName>_SOURCES_DIR. This follows the 
<ExactName>_DIR naming convention from find_package(), and is different from 
the <PROJECT>_SOURCE_DIR variable.

Other comments ?

Alex



----------  Forwarded Message  ----------

Subject: KDE/kdelibs/cmake/modules
Date: Monday 03 January 2011
From: Gilles Caulier <caulier.gilles at gmail.com>
To: kde-commits at kde.org

SVN commit 1211248 by cgilles:

support local dir for digiKam 2.0.0


 M  +32 -17    FindKexiv2.cmake  
 M  +28 -14    FindKipi.cmake  


--- trunk/KDE/kdelibs/cmake/modules/FindKexiv2.cmake #1211247:1211248
@@ -1,4 +1,8 @@
 # - Try to find the KExiv2 library
+#
+# If you have put a local version of libkexiv2 into your source tree,
+# set KEXIV2_LOCAL_DIR to the relative path to the local directory.
+#
 # Once done this will define
 #
 #  KEXIV2_FOUND - system has libkexiv2
@@ -12,34 +16,45 @@
 # Redistribution and use is allowed according to the terms of the BSD 
license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
-if (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES)
+if (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES AND KEXIV2_DEFINITIONS)
 
   message(STATUS "Found Kexiv2 library in cache: ${KEXIV2_LIBRARIES}")
 
   # in cache already
-  SET(KEXIV2_FOUND TRUE)
+  set(KEXIV2_FOUND TRUE)
 
-else (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES)
+else (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES AND KEXIV2_DEFINITIONS)
 
   message(STATUS "Check Kexiv2 library in local sub-folder...")
 
   # Check if library is not in local sub-folder
 
-  FIND_FILE(KEXIV2_LOCAL_FOUND libkexiv2/version.h.cmake 
${CMAKE_SOURCE_DIR}/libkexiv2 ${CMAKE_SOURCE_DIR}/libs/libkexiv2 
NO_DEFAULT_PATH)
+  if (KEXIV2_LOCAL_DIR)
+    set(KEXIV2_LOCAL_FOUND TRUE)
+  else (KEXIV2_LOCAL_DIR)
+    find_file(KEXIV2_LOCAL_FOUND libkexiv2/version.h.cmake 
${CMAKE_SOURCE_DIR}/libkexiv2 ${CMAKE_SOURCE_DIR}/libs/libkexiv2 
NO_DEFAULT_PATH)
 
   if (KEXIV2_LOCAL_FOUND)
-
-    FIND_FILE(KEXIV2_LOCAL_FOUND_IN_LIBS libkexiv2/version.h.cmake 
${CMAKE_SOURCE_DIR}/libs/libkexiv2 NO_DEFAULT_PATH)
+      # Was it found in libkexiv2/ or in libs/libkexiv2?
+      find_file(KEXIV2_LOCAL_FOUND_IN_LIBS libkexiv2/version.h.cmake 
${CMAKE_SOURCE_DIR}/libs/libkexiv2 NO_DEFAULT_PATH)
     if (KEXIV2_LOCAL_FOUND_IN_LIBS)
-      set(KEXIV2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/libkexiv2)
+        set(KEXIV2_LOCAL_DIR libs/libkexiv2)
     else (KEXIV2_LOCAL_FOUND_IN_LIBS)
-      set(KEXIV2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libkexiv2)
+        set(KEXIV2_LOCAL_DIR libkexiv2)
     endif (KEXIV2_LOCAL_FOUND_IN_LIBS)
-    set(KEXIV2_DEFINITIONS "-I${KEXIV2_INCLUDE_DIR}")
+    endif (KEXIV2_LOCAL_FOUND)
+
+  endif (KEXIV2_LOCAL_DIR)
+
+  if (KEXIV2_LOCAL_FOUND)
+    # we need two include directories: because the version.h file is put into 
the build directory
+    # TODO KEXIV2_INCLUDE_DIR sounds like it should contain only one 
directory...
+    set(KEXIV2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${KEXIV2_LOCAL_DIR} 
${CMAKE_BINARY_DIR}/${KEXIV2_LOCAL_DIR})
+    
set(KEXIV2_DEFINITIONS "-I${CMAKE_SOURCE_DIR}/${KEXIV2_LOCAL_DIR}" "-I${CMAKE_BINARY_DIR}/${KEXIV2_LOCAL_DIR}")
     set(KEXIV2_LIBRARIES kexiv2)
-    message(STATUS "Found Kexiv2 library in local sub-folder: 
${KEXIV2_INCLUDE_DIR}")
+    message(STATUS "Found Kexiv2 library in local sub-folder: 
${CMAKE_SOURCE_DIR}/${KEXIV2_LOCAL_DIR}")
     set(KEXIV2_FOUND TRUE)
-    MARK_AS_ADVANCED(KEXIV2_INCLUDE_DIR KEXIV2_LIBRARIES)
+    mark_as_advanced(KEXIV2_INCLUDE_DIR KEXIV2_LIBRARIES KEXIV2_DEFINITIONS)
 
   else(KEXIV2_LOCAL_FOUND)
     if(NOT WIN32) 
@@ -47,13 +62,13 @@
 
       # use pkg-config to get the directories and then use these values
       # in the FIND_PATH() and FIND_LIBRARY() calls
-      INCLUDE(UsePkgConfig)
+      include(UsePkgConfig)
     
       PKGCONFIG(libkexiv2 _KEXIV2IncDir _KEXIV2LinkDir _KEXIV2LinkFlags 
_KEXIV2Cflags)
     
       if(_KEXIV2LinkFlags)
         # query pkg-config asking for a libkexiv2 >= 0.2.0
-        EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS --atleast-version=0.2.0 
libkexiv2 RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
+        exec_program(${PKGCONFIG_EXECUTABLE} ARGS --atleast-version=0.2.0 
libkexiv2 RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
         if(_return_VALUE STREQUAL "0")
             message(STATUS "Found libkexiv2 release >= 0.2.0")
             set(KEXIV2_VERSION_GOOD_FOUND TRUE)
@@ -73,11 +88,11 @@
     if(KEXIV2_VERSION_GOOD_FOUND)
         set(KEXIV2_DEFINITIONS "${_KEXIV2Cflags}")
     
-        FIND_PATH(KEXIV2_INCLUDE_DIR libkexiv2/version.h
+        find_path(KEXIV2_INCLUDE_DIR libkexiv2/version.h
         ${_KEXIV2IncDir}
         )
     
-        FIND_LIBRARY(KEXIV2_LIBRARIES NAMES kexiv2
+        find_library(KEXIV2_LIBRARIES NAMES kexiv2
         PATHS
         ${_KEXIV2LinkDir}
         )
@@ -101,8 +116,8 @@
           endif (Kexiv2_FIND_REQUIRED)
       endif (KEXIV2_FOUND)
     
-    MARK_AS_ADVANCED(KEXIV2_INCLUDE_DIR KEXIV2_LIBRARIES)
+    mark_as_advanced(KEXIV2_INCLUDE_DIR KEXIV2_LIBRARIES KEXIV2_DEFINITIONS)
 
   endif(KEXIV2_LOCAL_FOUND)
   
-endif (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES)
+endif (KEXIV2_INCLUDE_DIR AND KEXIV2_LIBRARIES AND KEXIV2_DEFINITIONS)
--- trunk/KDE/kdelibs/cmake/modules/FindKipi.cmake #1211247:1211248
@@ -1,4 +1,8 @@
 # - Try to find the Kipi library
+#
+# If you have put a local version of libkipi into your source tree,
+# set KIPI_LOCAL_DIR to the relative path to the local directory.
+#
 # Once done this will define
 #
 #  KIPI_FOUND - system has libkipi
@@ -12,34 +16,44 @@
 # Redistribution and use is allowed according to the terms of the BSD 
license.
 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
-if (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES)
+if (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES AND KIPI_DEFINITIONS)
 
   message(STATUS "Found Kipi library in cache: ${KIPI_LIBRARIES}")
 
   # in cache already
-  SET(KIPI_FOUND TRUE)
+  set(KIPI_FOUND TRUE)
 
-else (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES)
+else (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES AND KIPI_DEFINITIONS)
 
   message(STATUS "Check Kipi library in local sub-folder...")
 
   # Check if library is not in local sub-folder
 
-  find_file (KIPI_LOCAL_FOUND libkipi/version.h.cmake 
${CMAKE_SOURCE_DIR}/libkipi ${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
+  if (KIPI_LOCAL_DIR)
+    set (KIPI_LOCAL_FOUND TRUE)
+  else (KIPI_LOCAL_DIR)
+    find_file(KIPI_LOCAL_FOUND libkipi/kipi.h ${CMAKE_SOURCE_DIR}/libkipi 
${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
 
   if (KIPI_LOCAL_FOUND)
-
-    find_file (KIPI_LOCAL_FOUND_IN_LIBS libkipi/version.h.cmake 
${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
+      # Was it found in libkdcraw/ or in libs/libkdcraw?
+      find_file(KIPI_LOCAL_FOUND_IN_LIBS libkipi/kipi.h 
${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
     if (KIPI_LOCAL_FOUND_IN_LIBS)
-      set(KIPI_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libs/libkipi)
+        set(KIPI_LOCAL_DIR libs/libkipi)
     else (KIPI_LOCAL_FOUND_IN_LIBS)
-      set(KIPI_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/libkipi)
+        set(KIPI_LOCAL_DIR libkipi)
     endif (KIPI_LOCAL_FOUND_IN_LIBS)
-    set(KIPI_DEFINITIONS -I${KIPI_INCLUDE_DIR})
+    endif (KIPI_LOCAL_FOUND)
+  endif (KIPI_LOCAL_DIR)
+
+  if (KIPI_LOCAL_FOUND)
+    # we need two include directories: because the version.h file is put into 
the build directory
+    # TODO KIPI_INCLUDE_DIR sounds like it should contain only one 
directory...
+    set(KIPI_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${KIPI_LOCAL_DIR} 
${CMAKE_BINARY_DIR}/${KIPI_LOCAL_DIR})
+    
set(KIPI_DEFINITIONS "-I${CMAKE_SOURCE_DIR}/${KIPI_LOCAL_DIR}" "-I${CMAKE_BINARY_DIR}/${KIPI_LOCAL_DIR}")
     set(KIPI_LIBRARIES kipi)
-    message(STATUS "Found Kipi library in local sub-folder: 
${KIPI_INCLUDE_DIR}")
+    message(STATUS "Found Kipi library in local sub-folder: 
${CMAKE_SOURCE_DIR}/${KIPI_LOCAL_DIR}")
     set(KIPI_FOUND TRUE)
-    mark_as_advanced(KIPI_INCLUDE_DIR KIPI_LIBRARIES)
+    mark_as_advanced(KIPI_INCLUDE_DIR KIPI_LIBRARIES KIPI_DEFINITIONS)
 
   else(KIPI_LOCAL_FOUND)
 
@@ -48,7 +62,7 @@
 
       # use pkg-config to get the directories and then use these values
       # in the FIND_PATH() and FIND_LIBRARY() calls
-      INCLUDE(UsePkgConfig)
+      include(UsePkgConfig)
 
       PKGCONFIG(libkipi _KIPIIncDir _KIPILinkDir _KIPILinkFlags _KIPICflags)
 
@@ -95,8 +109,8 @@
           endif (Kipi_FIND_REQUIRED)
       endif (KIPI_FOUND)
     
-    MARK_AS_ADVANCED(KIPI_INCLUDE_DIR KIPI_LIBRARIES)
+    mark_as_advanced(KIPI_INCLUDE_DIR KIPI_LIBRARIES KIPI_DEFINITIONS)
 
   endif(KIPI_LOCAL_FOUND)
   
-endif (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES)
+endif (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES AND KIPI_DEFINITIONS)

-------------------------------------------------------



More information about the cmake-developers mailing list