#101 Enable C language again as long as FindThreads requires it
[platform/upstream/gflags.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.8.4 FATAL_ERROR)
2
3 if (POLICY CMP0042)
4   cmake_policy (SET CMP0042 NEW)
5 endif ()
6
7 # ----------------------------------------------------------------------------
8 # includes
9 set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
10 include (utils)
11
12 # ----------------------------------------------------------------------------
13 # package information
14 set (PACKAGE_NAME      "gflags")
15 set (PACKAGE_VERSION   "2.2.0")
16 set (PACKAGE_STRING    "${PACKAGE_NAME} ${PACKAGE_VERSION}")
17 set (PACKAGE_TARNAME   "${PACKAGE_NAME}-${PACKAGE_VERSION}")
18 set (PACKAGE_BUGREPORT "https://github.com/schuhschuh/gflags/issues")
19
20 project (${PACKAGE_NAME} CXX)
21 if (CMAKE_VERSION VERSION_LESS 100)
22   # C language still needed because the following required CMake modules
23   # (or their dependencies, respectively) are not correctly handling
24   # the case where only CXX is enabled.
25   # - CheckTypeSize.cmake (fixed in CMake 3.1, cf. http://www.cmake.org/Bug/view.php?id=14056)
26   # - FindThreads.cmake (--> CheckIncludeFiles.cmake <--)
27   enable_language (C)
28 endif ()
29
30 version_numbers (
31   ${PACKAGE_VERSION}
32     PACKAGE_VERSION_MAJOR
33     PACKAGE_VERSION_MINOR
34     PACKAGE_VERSION_PATCH
35 )
36
37 set (PACKAGE_SOVERSION "${PACKAGE_VERSION_MAJOR}")
38
39 # ----------------------------------------------------------------------------
40 # options
41 if (NOT GFLAGS_NAMESPACE)
42   # maintain binary backwards compatibility with gflags library version <= 2.0,
43   # but at the same time enable the use of the preferred new "gflags" namespace
44   set (GFLAGS_NAMESPACE "google;${PACKAGE_NAME}" CACHE STRING "Name(s) of library namespace (separate multiple options by semicolon)")
45   mark_as_advanced (GFLAGS_NAMESPACE)
46 endif ()
47 set (GFLAGS_NAMESPACE_SECONDARY "${GFLAGS_NAMESPACE}")
48 list (REMOVE_DUPLICATES GFLAGS_NAMESPACE_SECONDARY)
49 if (NOT GFLAGS_NAMESPACE_SECONDARY)
50   message (FATAL_ERROR "GFLAGS_NAMESPACE must be set to one (or more) valid C++ namespace identifier(s separated by semicolon \";\").")
51 endif ()
52 foreach (ns IN LISTS GFLAGS_NAMESPACE_SECONDARY)
53   if (NOT ns MATCHES "^[a-zA-Z][a-zA-Z0-9_]*$")
54     message (FATAL_ERROR "GFLAGS_NAMESPACE contains invalid namespace identifier: ${ns}")
55   endif ()
56 endforeach ()
57 list (GET       GFLAGS_NAMESPACE_SECONDARY 0 GFLAGS_NAMESPACE)
58 list (REMOVE_AT GFLAGS_NAMESPACE_SECONDARY 0)
59
60 option (BUILD_SHARED_LIBS          "Request build of shared libraries."                                       OFF)
61 option (BUILD_STATIC_LIBS          "Request build of static libraries (default if BUILD_SHARED_LIBS is OFF)." OFF)
62 option (BUILD_gflags_LIB           "Request build of the multi-threaded gflags library."                      ON)
63 option (BUILD_gflags_nothreads_LIB "Request build of the single-threaded gflags library."                     ON)
64 option (BUILD_PACKAGING            "Enable build of distribution packages using CPack."                       OFF)
65 option (BUILD_TESTING              "Enable build of the unit tests and their execution using CTest."          OFF)
66 option (BUILD_NC_TESTS             "Request addition of negative compilation tests."                          OFF)
67 option (INSTALL_HEADERS            "Request packaging of headers and other development files."                ON)
68
69 mark_as_advanced (CLEAR CMAKE_INSTALL_PREFIX)
70 mark_as_advanced (CMAKE_CONFIGURATION_TYPES
71                   BUILD_STATIC_LIBS
72                   BUILD_NC_TESTS
73                   INSTALL_HEADERS)
74 if (APPLE)
75   mark_as_advanced(CMAKE_OSX_ARCHITECTURES
76                    CMAKE_OSX_DEPLOYMENT_TARGET
77                    CMAKE_OSX_SYSROOT)
78 endif ()
79
80 if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
81   set (BUILD_STATIC_LIBS ON)
82 endif ()
83 if (NOT BUILD_gflags_LIB AND NOT BUILD_gflags_nothreads_LIB)
84  message (FATAL_ERROR "At least one of BUILD_gflags_LIB and BUILD_gflags_nothreads_LIB must be ON.")
85 endif ()
86
87 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS)
88   set_property (CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
89 endif ()
90
91 if (NOT GFLAGS_INCLUDE_DIR)
92   set (GFLAGS_INCLUDE_DIR "${PACKAGE_NAME}" CACHE STRING "Name of include directory of installed header files")
93   mark_as_advanced (GFLAGS_INCLUDE_DIR)
94 else ()
95   if (IS_ABSOLUTE GFLAGS_INCLUDE_DIR)
96     message (FATAL_ERROR "GFLAGS_INCLUDE_DIR must be a path relative to CMAKE_INSTALL_PREFIX/include")
97   endif ()
98   if (GFLAGS_INCLUDE_DIR MATCHES "^\\.\\.[/\\]")
99     message (FATAL_ERROR "GFLAGS_INCLUDE_DIR must not start with parent directory reference (../)")
100   endif ()
101 endif ()
102
103 # ----------------------------------------------------------------------------
104 # system checks
105 include (CheckTypeSize)
106 include (CheckIncludeFileCXX)
107 include (CheckCXXSymbolExists)
108
109 if (WIN32 AND NOT CYGWIN)
110   set (OS_WINDOWS 1)
111 else ()
112   set (OS_WINDOWS 0)
113 endif ()
114
115 if (MSVC)
116   set (HAVE_SYS_TYPES_H 1)
117   set (HAVE_STDINT_H    1)
118   set (HAVE_STDDEF_H    1) # used by CheckTypeSize module
119   set (HAVE_INTTYPES_H  0)
120   set (HAVE_UNISTD_H    0)
121   set (HAVE_SYS_STAT_H  1)
122   set (HAVE_SHLWAPI_H   1)
123 else ()
124   foreach (fname IN ITEMS unistd stdint inttypes sys/types sys/stat fnmatch)
125     string (TOUPPER "${fname}" FNAME)
126     string (REPLACE "/" "_" FNAME "${FNAME}")
127     if (NOT HAVE_${FNAME}_H)
128       check_include_file_cxx ("${fname}.h" HAVE_${FNAME}_H)
129     endif ()
130   endforeach ()
131   # the following are used in #if directives not #ifdef
132   bool_to_int (HAVE_STDINT_H)
133   bool_to_int (HAVE_SYS_TYPES_H)
134   bool_to_int (HAVE_INTTYPES_H)
135   if (NOT HAVE_FNMATCH_H AND OS_WINDOWS)
136     check_include_file_cxx ("shlwapi.h" HAVE_SHLWAPI_H)
137   endif ()
138 endif ()
139
140 set (GFLAGS_INTTYPES_FORMAT "" CACHE STRING "Format of integer types: \"C99\" (uint32_t), \"BSD\" (u_int32_t), \"VC7\" (__int32)")
141 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY STRINGS "C99;BSD;VC7")
142 mark_as_advanced (GFLAGS_INTTYPES_FORMAT)
143 if (NOT GFLAGS_INTTYPES_FORMAT)
144   set (TYPES uint32_t u_int32_t)
145   if (MSVC)
146     list (INSERT TYPES 0 __int32)
147   endif ()
148   foreach (type IN LISTS TYPES)
149     check_type_size (${type} ${type} LANGUAGE CXX)
150     if (HAVE_${type})
151       break ()
152     endif ()
153   endforeach ()
154   if (HAVE_uint32_t)
155     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE C99)
156   elseif (HAVE_u_int32_t)
157     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE BSD)
158   elseif (HAVE___int32)
159     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
160   else ()
161     mark_as_advanced (CLEAR GFLAGS_INTTYPES_FORMAT)
162     message (FATAL_ERROR "Do not know how to define a 32-bit integer quantity on your system!"
163                          " Neither uint32_t, u_int32_t, nor __int32 seem to be available."
164                          " Set GFLAGS_INTTYPES_FORMAT to either C99, BSD, or VC7 and try again.")
165   endif ()
166 endif ()
167 # use of special characters in strings to circumvent bug #0008226
168 if ("^${GFLAGS_INTTYPES_FORMAT}$" STREQUAL "^WIN$")
169   set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
170 endif ()
171 if (NOT GFLAGS_INTTYPES_FORMAT MATCHES "^(C99|BSD|VC7)$")
172   message (FATAL_ERROR "Invalid value for GFLAGS_INTTYPES_FORMAT! Choose one of \"C99\", \"BSD\", or \"VC7\"")
173 endif ()
174 set (GFLAGS_INTTYPES_FORMAT_C99 0)
175 set (GFLAGS_INTTYPES_FORMAT_BSD 0)
176 set (GFLAGS_INTTYPES_FORMAT_VC7 0)
177 set ("GFLAGS_INTTYPES_FORMAT_${GFLAGS_INTTYPES_FORMAT}" 1)
178
179 if (MSVC)
180   set (HAVE_strtoll 0)
181   set (HAVE_strtoq  0)
182 else ()
183   check_cxx_symbol_exists (strtoll stdlib.h HAVE_STRTOLL)
184   if (NOT HAVE_STRTOLL)
185     check_cxx_symbol_exists (strtoq stdlib.h HAVE_STRTOQ)
186   endif ()
187 endif ()
188
189 set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
190 find_package (Threads)
191 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
192   set (HAVE_PTHREAD 1)
193   check_type_size (pthread_rwlock_t RWLOCK LANGUAGE CXX)
194 else ()
195   set (HAVE_PTHREAD 0)
196 endif ()
197
198 if (UNIX AND NOT HAVE_PTHREAD AND BUILD_gflags_LIB)
199   if (CMAKE_HAVE_PTHREAD_H)
200     set (what "library")
201   else ()
202     set (what ".h file")
203   endif ()
204   message (FATAL_ERROR "Could not find pthread${what}. Check the log file"
205                        "\n\t${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
206                        "\nor disable the build of the multi-threaded gflags library (BUILD_gflags_LIB=OFF).")
207 endif ()
208
209 # ----------------------------------------------------------------------------
210 # source files - excluding root subdirectory and/or .in suffix
211 set (PUBLIC_HDRS
212   "gflags.h"
213   "gflags_declare.h"
214   "gflags_completions.h"
215 )
216
217 if (GFLAGS_NAMESPACE_SECONDARY)
218   set (INCLUDE_GFLAGS_NS_H "// Import gflags library symbols into alternative/deprecated namespace(s)")
219   foreach (ns IN LISTS GFLAGS_NAMESPACE_SECONDARY)
220     string (TOUPPER "${ns}" NS)
221     set (gflags_ns_h "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/gflags_${ns}.h")
222     configure_file ("${PROJECT_SOURCE_DIR}/src/gflags_ns.h.in" "${gflags_ns_h}" @ONLY)
223     list (APPEND PUBLIC_HDRS "${gflags_ns_h}")
224     set (INCLUDE_GFLAGS_NS_H "${INCLUDE_GFLAGS_NS_H}\n#include \"gflags_${ns}.h\"")
225   endforeach ()
226 else ()
227   set (INCLUDE_GFLAGS_NS_H)
228 endif ()
229
230 set (PRIVATE_HDRS
231   "config.h"
232   "util.h"
233   "mutex.h"
234 )
235
236 set (GFLAGS_SRCS
237   "gflags.cc"
238   "gflags_reporting.cc"
239   "gflags_completions.cc"
240 )
241
242 if (OS_WINDOWS)
243   list (APPEND PRIVATE_HDRS "windows_port.h")
244   list (APPEND GFLAGS_SRCS  "windows_port.cc")
245 endif ()
246
247 # ----------------------------------------------------------------------------
248 # configure source files
249 if (CMAKE_COMPILER_IS_GNUCXX)
250   set (GFLAGS_ATTRIBUTE_UNUSED "__attribute((unused))")
251 else ()
252   set (GFLAGS_ATTRIBUTE_UNUSED)
253 endif ()
254
255 # whenever we build a shared library (DLL on Windows), configure the public
256 # headers of the API for use of this library rather than the optionally
257 # also build statically linked library; users can override GFLAGS_DLL_DECL
258 if (BUILD_SHARED_LIBS)
259   set (GFLAGS_IS_A_DLL 1)
260 else ()
261   set (GFLAGS_IS_A_DLL 0)
262 endif ()
263
264 configure_headers (PUBLIC_HDRS  ${PUBLIC_HDRS})
265 configure_sources (PRIVATE_HDRS ${PRIVATE_HDRS})
266 configure_sources (GFLAGS_SRCS  ${GFLAGS_SRCS})
267
268 # deprecated declaration of include directories for older CMake versions
269 if (NOT COMMAND target_include_directories)
270   include_directories ("${PROJECT_SOURCE_DIR}/src")
271   include_directories ("${PROJECT_BINARY_DIR}/include")
272   include_directories ("${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}")
273 endif ()
274
275 # ----------------------------------------------------------------------------
276 # output directories
277 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
278 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
279 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib")
280
281 # ----------------------------------------------------------------------------
282 # installation directories
283 if (OS_WINDOWS)
284   set (RUNTIME_INSTALL_DIR Bin)
285   set (LIBRARY_INSTALL_DIR Lib)
286   set (INCLUDE_INSTALL_DIR Include)
287   set (CONFIG_INSTALL_DIR  CMake)
288 else ()
289   set (RUNTIME_INSTALL_DIR bin)
290   # The LIB_INSTALL_DIR and LIB_SUFFIX variables are used by the Fedora
291   # package maintainers. Also package maintainers of other distribution
292   # packages need to be able to specify the name of the library directory.
293   if (NOT LIB_INSTALL_DIR)
294     set (LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
295   endif ()
296   set (LIBRARY_INSTALL_DIR "${LIB_INSTALL_DIR}"
297     CACHE PATH "Directory of installed libraries, e.g., \"lib64\""
298   )
299   mark_as_advanced (LIBRARY_INSTALL_DIR)
300   set (INCLUDE_INSTALL_DIR include)
301   set (CONFIG_INSTALL_DIR  ${LIBRARY_INSTALL_DIR}/cmake/${PACKAGE_NAME})
302 endif ()
303
304 # ----------------------------------------------------------------------------
305 # add library targets
306 set (TARGETS)
307 # static vs. shared
308 foreach (TYPE IN ITEMS STATIC SHARED)
309   if (BUILD_${TYPE}_LIBS)
310     # whether or not targets are a DLL
311     if (OS_WINDOWS AND "^${TYPE}$" STREQUAL "^SHARED$")
312       set (GFLAGS_IS_A_DLL 1)
313     else ()
314       set (GFLAGS_IS_A_DLL 0)
315     endif ()
316     string (TOLOWER "${TYPE}" type)
317     # multi-threaded vs. single-threaded
318     foreach (opts IN ITEMS "" _nothreads)
319       if (BUILD_gflags${opts}_LIB)
320         add_library (gflags${opts}-${type} ${TYPE} ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
321         if (COMMAND target_include_directories)
322           target_include_directories (gflags${opts}-${type}
323             PUBLIC  "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
324             PRIVATE "${PROJECT_SOURCE_DIR}/src;${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}"
325           )
326           if (INSTALL_HEADERS)
327             target_include_directories (gflags${opts}-${type}
328               PUBLIC  "$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>"
329             )
330           endif ()
331         endif ()
332         if (opts MATCHES "nothreads")
333           set (defines "GFLAGS_IS_A_DLL=${GFLAGS_IS_A_DLL};NOTHREADS")
334         else ()
335           set (defines "GFLAGS_IS_A_DLL=${GFLAGS_IS_A_DLL}")
336           if (CMAKE_USE_PTHREADS_INIT)
337             target_link_libraries (gflags${opts}-${type} ${CMAKE_THREAD_LIBS_INIT})
338           endif ()
339         endif ()
340         set_target_properties (
341           gflags${opts}-${type} PROPERTIES COMPILE_DEFINITIONS "${defines}"
342                                            OUTPUT_NAME         "gflags${opts}"
343                                            VERSION             "${PACKAGE_VERSION}"
344                                            SOVERSION           "${PACKAGE_SOVERSION}"
345         )
346         if (HAVE_SHLWAPI_H)
347           target_link_libraries (gflags${opts}-${type} shlwapi.lib)
348         endif ()
349         if (NOT TARGET gflags${opts})
350           add_custom_target (gflags${opts})
351         endif ()
352         add_dependencies (gflags${opts} gflags${opts}-${type})
353         list (APPEND TARGETS gflags${opts}-${type})
354       endif ()
355     endforeach ()
356   endif ()
357 endforeach ()
358
359 # ----------------------------------------------------------------------------
360 # installation rules
361 file (RELATIVE_PATH INSTALL_PREFIX_REL2CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}")
362 configure_file (cmake/config.cmake.in  "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake" @ONLY)
363 configure_file (cmake/version.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake" @ONLY)
364
365 install (TARGETS ${TARGETS} DESTINATION ${LIBRARY_INSTALL_DIR} EXPORT gflags-lib)
366 if (INSTALL_HEADERS)
367   install (FILES ${PUBLIC_HDRS} DESTINATION ${INCLUDE_INSTALL_DIR}/${GFLAGS_INCLUDE_DIR})
368   install (
369     FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake"
370     RENAME ${PACKAGE_NAME}-config.cmake
371     DESTINATION ${CONFIG_INSTALL_DIR}
372   )
373   install (
374     FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake"
375     DESTINATION ${CONFIG_INSTALL_DIR}
376   )
377   install (EXPORT gflags-lib DESTINATION ${CONFIG_INSTALL_DIR} FILE ${PACKAGE_NAME}-export.cmake)
378   if (UNIX)
379     install (PROGRAMS src/gflags_completions.sh DESTINATION ${RUNTIME_INSTALL_DIR})
380   endif ()
381 endif ()
382
383 # ----------------------------------------------------------------------------
384 # support direct use of build tree
385 set (INSTALL_PREFIX_REL2CONFIG_DIR .)
386 export (TARGETS ${TARGETS} FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-export.cmake")
387 export (PACKAGE gflags)
388 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake" @ONLY)
389
390 # ----------------------------------------------------------------------------
391 # testing - MUST follow the generation of the build tree config file
392 if (BUILD_TESTING)
393   include (CTest)
394   enable_testing ()
395   add_subdirectory (test)
396 endif ()
397
398 # ----------------------------------------------------------------------------
399 # packaging
400 if (BUILD_PACKAGING)
401
402   if (NOT BUILD_SHARED_LIBS AND NOT INSTALL_HEADERS)
403     message (WARNING "Package will contain static libraries without headers!"
404                      "\nRecommended options for generation of runtime package:"
405                      "\n  BUILD_SHARED_LIBS=ON"
406                      "\n  BUILD_STATIC_LIBS=OFF"
407                      "\n  INSTALL_HEADERS=OFF"
408                      "\nRecommended options for generation of development package:"
409                      "\n  BUILD_SHARED_LIBS=ON"
410                      "\n  BUILD_STATIC_LIBS=ON"
411                      "\n  INSTALL_HEADERS=ON")
412   endif ()
413
414   # default package generators
415   if (APPLE)
416     set (PACKAGE_GENERATOR        "PackageMaker")
417     set (PACKAGE_SOURCE_GENERATOR "TGZ;ZIP")
418   elseif (UNIX)
419     set (PACKAGE_GENERATOR        "DEB;RPM")
420     set (PACKAGE_SOURCE_GENERATOR "TGZ;ZIP")
421   else ()
422     set (PACKAGE_GENERATOR        "ZIP")
423     set (PACKAGE_SOURCE_GENERATOR "ZIP")
424   endif ()
425
426   # used package generators
427   set (CPACK_GENERATOR        "${PACKAGE_GENERATOR}"        CACHE STRING "List of binary package generators (CPack).")
428   set (CPACK_SOURCE_GENERATOR "${PACKAGE_SOURCE_GENERATOR}" CACHE STRING "List of source package generators (CPack).")
429   mark_as_advanced (CPACK_GENERATOR CPACK_SOURCE_GENERATOR)
430
431   # common package information
432   set (CPACK_PACKAGE_VENDOR              "Andreas Schuh")
433   set (CPACK_PACKAGE_CONTACT             "google-gflags@googlegroups.com")
434   set (CPACK_PACKAGE_NAME                "${PACKAGE_NAME}")
435   set (CPACK_PACKAGE_VERSION             "${PACKAGE_VERSION}")
436   set (CPACK_PACKAGE_VERSION_MAJOR       "${PACKAGE_VERSION_MAJOR}")
437   set (CPACK_PACKAGE_VERSION_MINOR       "${PACKAGE_VERSION_MINOR}")
438   set (CPACK_PACKAGE_VERSION_PATCH       "${PACKAGE_VERSION_PATCH}")
439   set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "A commandline flags library that allows for distributed flags.")
440   set (CPACK_RESOURCE_FILE_WELCOME       "${CMAKE_CURRENT_LIST_DIR}/README.md")
441   set (CPACK_RESOURCE_FILE_LICENSE       "${CMAKE_CURRENT_LIST_DIR}/COPYING.txt")
442   set (CPACK_PACKAGE_DESCRIPTION_FILE    "${CMAKE_CURRENT_LIST_DIR}/README.md")
443   set (CPACK_INSTALL_PREFIX              "${CMAKE_INSTALL_PREFIX}")
444   set (CPACK_OUTPUT_FILE_PREFIX          packages)
445   set (CPACK_PACKAGE_RELOCATABLE         TRUE)
446   set (CPACK_MONOLITHIC_INSTALL          TRUE)
447
448   # RPM package information -- used in cmake/package.cmake.in also for DEB
449   set (CPACK_RPM_PACKAGE_GROUP   "Development/Libraries")
450   set (CPACK_RPM_PACKAGE_LICENSE "BSD")
451   set (CPACK_RPM_PACKAGE_URL     "http://schuhschuh.github.com/gflags")
452   set (CPACK_RPM_CHANGELOG_FILE  "${CMAKE_CURRENT_LIST_DIR}/ChangeLog.txt")
453
454   if (INSTALL_HEADERS)
455     set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_LIST_DIR}/doc/index.html")
456   else ()
457     set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_LIST_DIR}/cmake/README_runtime.txt")
458   endif ()
459
460   # system/architecture
461   if (WINDOWS)
462     if (CMAKE_CL_64)
463       set (CPACK_SYSTEM_NAME "win64")
464     else ()
465       set (CPACK_SYSTEM_NAME "win32")
466     endif ()
467     set (CPACK_PACKAGE_ARCHITECTURE)
468   elseif (APPLE)
469     set (CPACK_PACKAGE_ARCHITECTURE darwin)
470   else ()
471     string (TOLOWER "${CMAKE_SYSTEM_NAME}" CPACK_SYSTEM_NAME)
472     if (CMAKE_CXX_FLAGS MATCHES "-m32")
473       set (CPACK_PACKAGE_ARCHITECTURE i386)
474     else ()
475       execute_process (
476         COMMAND         dpkg --print-architecture
477         RESULT_VARIABLE RV
478         OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE
479       )
480       if (RV EQUAL 0)
481               string (STRIP "${CPACK_PACKAGE_ARCHITECTURE}" CPACK_PACKAGE_ARCHITECTURE)
482       else ()
483         execute_process (COMMAND uname -m OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE)
484         if (CPACK_PACKAGE_ARCHITECTURE MATCHES "x86_64")
485                 set (CPACK_PACKAGE_ARCHITECTURE amd64)
486         else ()
487           set (CPACK_PACKAGE_ARCHITECTURE i386)
488         endif ()
489       endif ()
490     endif ()
491   endif ()
492
493   # source package settings
494   set (CPACK_SOURCE_TOPLEVEL_TAG      "source")
495   set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
496   set (CPACK_SOURCE_IGNORE_FILES      "/\\\\.git/;\\\\.swp$;\\\\.#;/#;\\\\.*~;cscope\\\\.*;/[Bb]uild[.+-_a-zA-Z0-9]*/")
497
498   # default binary package settings
499   set (CPACK_INCLUDE_TOPLEVEL_DIRECTORY TRUE)
500   set (CPACK_PACKAGE_FILE_NAME          "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}")
501   if (CPACK_PACKAGE_ARCHITECTURE)
502     set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-${CPACK_PACKAGE_ARCHITECTURE}")
503   endif ()
504
505   # generator specific configuration file
506   #
507   # allow package maintainers to use their own configuration file
508   # $ cmake -DCPACK_PROJECT_CONFIG_FILE:FILE=/path/to/package/config
509   if (NOT CPACK_PROJECT_CONFIG_FILE)
510     configure_file (
511       "${CMAKE_CURRENT_LIST_DIR}/cmake/package.cmake.in"
512       "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-package.cmake" @ONLY
513     )
514     set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-package.cmake")
515   endif ()
516
517   include (CPack)
518
519 endif () # BUILD_PACKAGING