cmake: do not hardcode relative install directories
[platform/upstream/glog.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 3.0)
2
3 if (POLICY CMP0042)
4   cmake_policy (SET CMP0042 NEW)
5 endif (POLICY CMP0042)
6
7 if (POLICY CMP0063)
8   cmake_policy (SET CMP0063 NEW)
9 endif (POLICY CMP0063)
10
11 project (google-glog)
12
13 enable_testing ()
14
15 set (GLOG_MAJOR_VERSION 0)
16 set (GLOG_MINOR_VERSION 3)
17 set (GLOG_PATCH_VERSION 4)
18
19 set (GLOG_VERSION
20   ${GLOG_MAJOR_VERSION}.${GLOG_MINOR_VERSION}.${GLOG_PATCH_VERSION})
21
22 set (CPACK_PACKAGE_NAME glog)
23 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "")
24 set (CPACK_PACKAGE_VERSION_MAJOR ${GLOG_MAJOR_VERSION})
25 set (CPACK_PACKAGE_VERSION_MINOR ${GLOG_MINOR_VERSION})
26 set (CPACK_PACKAGE_VERSION_PATCH ${GLOG_PATCH_VERSION})
27 set (CPACK_PACKAGE_VERSION ${GLOG_VERSION})
28
29 option (WITH_GFLAGS "Use gflags" ON)
30 option (WITH_THREADS "Enable multithreading support" ON)
31
32 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
33
34 include (CheckCSourceCompiles)
35 include (CheckCXXCompilerFlag)
36 include (CheckCXXSourceCompiles)
37 include (CheckFunctionExists)
38 include (CheckIncludeFile)
39 include (CheckIncludeFileCXX)
40 include (CheckLibraryExists)
41 include (CheckStructHasMember)
42 include (CheckSymbolExists)
43 include (CheckTypeSize)
44 include (CMakePackageConfigHelpers)
45 include (CPack)
46 include (CTest)
47 include (DetermineGflagsNamespace)
48 include (GNUInstallDirs)
49
50 set (CMAKE_THREAD_PREFER_PTHREAD 1)
51
52 if (WITH_GFLAGS)
53   find_package (gflags)
54
55   if (gflags_FOUND)
56     set (HAVE_LIB_GFLAGS 1)
57     determine_gflags_namespace (gflags_NAMESPACE)
58   endif (gflags_FOUND)
59 endif (WITH_GFLAGS)
60
61 if (WITH_THREADS)
62   find_package (Threads)
63 endif (WITH_THREADS)
64
65 check_include_file (dlfcn.h HAVE_DLFCN_H)
66 check_include_file (execinfo.h HAVE_EXECINFO_H)
67 check_include_file (glob.h HAVE_GLOB_H)
68 check_include_file (inttypes.h HAVE_INTTYPES_H)
69 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
70 check_include_file (memory.h HAVE_MEMORY_H)
71 check_include_file (pwd.h HAVE_PWD_H)
72 check_include_file (stdint.h HAVE_STDINT_H)
73 check_include_file (stdlib.h HAVE_STDLIB_H)
74 check_include_file (string.h HAVE_STRING_H)
75 check_include_file (strings.h HAVE_STRINGS_H)
76 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
77 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
78 check_include_file (sys/time.h HAVE_SYS_TIME_H)
79 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
80 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
81 check_include_file (syscall.h HAVE_SYSCALL_H)
82 check_include_file (syslog.h HAVE_SYSLOG_H)
83 check_include_file (ucontext.h HAVE_UCONTEXT_H)
84 check_include_file (unistd.h HAVE_UNISTD_H)
85 check_include_file (unwind.h HAVE_UNWIND_H)
86
87 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
88 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
89 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
90 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
91 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
92 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
93 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
94
95 check_type_size ("unsigned __int16" HAVE___UINT16)
96 check_type_size (u_int16_t HAVE_U_INT16_T)
97 check_type_size (uint16_t HAVE_UINT16_T)
98
99 check_function_exists (dladdr HAVE_DLADDR)
100 check_function_exists (fcntl HAVE_FCNTL)
101 check_function_exists (pread HAVE_PREAD)
102 check_function_exists (pwrite HAVE_PWRITE)
103 check_function_exists (sigaction HAVE_SIGACTION)
104 check_function_exists (sigaltstack HAVE_SIGALSTACK)
105
106 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
107 # argument. However, it will happily fail if you pass the corresponding -W*
108 # option. So, we check whether options that disable warnings exist by testing
109 # the availability of the corresponding option that enables the warning. This
110 # eliminates the need to check for compiler for several (mainly Clang) options.
111
112 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
113 check_cxx_compiler_flag (-Wunnamed-type-template-args
114     HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
115
116 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
117 # snprintf as an inline function
118 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
119
120 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
121
122 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
123 mark_as_advanced (UNWIND_LIBRARY)
124
125 check_c_source_compiles ("
126 #include <stdlib.h>
127 static void foo(void) __attribute__ ((unused));
128 int main(void) { return 0; }
129 " HAVE___ATTRIBUTE__)
130
131 check_c_source_compiles ("
132 #include <stdlib.h>
133 static void foo(void) __attribute__ ((visibility(\"default\")));
134 int main(void) { return 0; }
135 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
136
137 check_c_source_compiles ("
138 #include <stdlib.h>
139 static void foo(void) __attribute__ ((visibility(\"hidden\")));
140 int main(void) { return 0; }
141 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
142
143 check_c_source_compiles ("
144 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
145 " HAVE___BUILTIN_EXPECT)
146
147 check_c_source_compiles ("
148 int main(void)
149 {
150   int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
151 }
152 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
153
154 check_c_source_compiles ("
155 #define _XOPEN_SOURCE 500
156 #include <pthread.h>
157 int main(void)
158 {
159   pthread_rwlock_t l;
160   pthread_rwlock_init(&l, NULL);
161   pthread_rwlock_rdlock(&l);
162   return 0;
163 }
164 " HAVE_RWLOCK)
165
166 check_c_source_compiles ("
167 __declspec(selectany) int a;
168 int main(void) { return 0; }
169 " HAVE___DECLSPEC)
170
171 check_cxx_source_compiles ("
172 #include <vector>
173 vector<int> t; int main() { }
174 " STL_NO_NAMESPACE)
175
176 check_cxx_source_compiles ("
177 #include <vector>
178 std::vector<int> t; int main() { }
179 " STL_STD_NAMESPACE)
180
181 check_cxx_source_compiles ("
182 #include <iostream>
183 std::ostream& operator<<(std::ostream&, struct s);
184 using ::operator<<;
185 int main() { }
186 " HAVE_USING_OPERATOR)
187
188 check_cxx_source_compiles ("
189 namespace Outer { namespace Inner { int i = 0; }}
190 using namespace Outer::Inner;;
191 int main() { return i; }
192 " HAVE_NAMESPACES)
193
194 set (_PC_FIELDS
195   "gregs[REG_PC]"
196   "gregs[REG_EIP]"
197   "gregs[REG_RIP]"
198   "sc_ip"
199   "uc_regs->gregs[PT_NIP]"
200   "gregs[R15]"
201   "arm_pc"
202   "mc_eip"
203   "mc_rip"
204   "__gregs[REG_EIP]"
205   "__gregs[REG_RIP]"
206   "ss.eip"
207   "__ss.__eip"
208   "ss.rip"
209   "__ss.__rip"
210   "ss.srr0"
211   "__ss.__srr0"
212 )
213
214 set (_PC_HEADERS ucontext.h signal.h)
215
216 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
217   foreach (_PC_FIELD ${_PC_FIELDS})
218     foreach (_PC_HEADER ${_PC_HEADERS})
219       set (_TMP
220       ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
221       file (WRITE ${_TMP} "
222 #define _GNU_SOURCE 1
223 #include <${_PC_HEADER}>
224 int main(void)
225 {
226   ucontext_t u;
227   return u.${_PC_FIELD} == 0;
228 }
229 ")
230       try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
231         COMPILE_DEFINITIONS _GNU_SOURCE=1)
232
233       if (HAVE_PC_FROM_UCONTEXT)
234         set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
235       endif (HAVE_PC_FROM_UCONTEXT)
236     endforeach (_PC_HEADER)
237   endforeach (_PC_FIELD)
238 endif  (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
239
240 if (STL_STD_NAMESPACE)
241   set (STL_NAMESPACE std)
242 else (STL_STD_NAMESPACE)
243   set (STL_NAMESPACE "")
244 endif (STL_STD_NAMESPACE)
245
246 set (GOOGLE_NAMESPACE google)
247 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
248 set (_END_GOOGLE_NAMESPACE_ "}")
249
250 if (HAVE___UINT16)
251   set (ac_cv_have___uint16 1)
252 else (HAVE___UINT16)
253   set (ac_cv_have___uint16 0)
254 endif (HAVE___UINT16)
255
256 if (HAVE_INTTYPES_H)
257   set (ac_cv_have_inttypes_h 1)
258 else (HAVE_INTTYPES_H)
259   set (ac_cv_have_inttypes_h 0)
260 endif (HAVE_INTTYPES_H)
261
262 if (HAVE_LIB_GFLAGS)
263   set (ac_cv_have_libgflags 1)
264 else (HAVE_LIB_GFLAGS)
265   set (ac_cv_have_libgflags 0)
266 endif (HAVE_LIB_GFLAGS)
267
268 if (HAVE_STDINT_H)
269   set (ac_cv_have_stdint_h 1)
270 else (HAVE_STDINT_H)
271   set (ac_cv_have_stdint_h 0)
272 endif (HAVE_STDINT_H)
273
274 if (HAVE_SYS_TYPES_H)
275   set (ac_cv_have_systypes_h 1)
276 else (HAVE_SYS_TYPES_H)
277   set (ac_cv_have_systypes_h 0)
278 endif (HAVE_SYS_TYPES_H)
279
280 if (HAVE_U_INT16_T)
281   set (ac_cv_have_u_int16_t 1)
282 else (HAVE_U_INT16_T)
283   set (ac_cv_have_u_int16_t 0)
284 endif (HAVE_U_INT16_T)
285
286 if (HAVE_UINT16_T)
287   set (ac_cv_have_uint16_t 1)
288 else (HAVE_UINT16_T)
289   set (ac_cv_have_uint16_t 0)
290 endif (HAVE_UINT16_T)
291
292 if (HAVE_UNISTD_H)
293   set (ac_cv_have_unistd_h 1)
294 else (HAVE_UNISTD_H)
295   set (ac_cv_have_unistd_h 0)
296 endif (HAVE_UNISTD_H)
297
298 set (ac_google_namespace ${GOOGLE_NAMESPACE})
299 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
300 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
301
302 if (HAVE___ATTRIBUTE__)
303   set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
304   set (ac_cv___attribute___noinline "__attribute__((noinline))")
305 elseif (HAVE___DECLSPEC)
306   set (ac_cv___attribute___noreturn "__declspec(noreturn)")
307   #set (ac_cv___attribute___noinline "__declspec(noinline)")
308 endif (HAVE___ATTRIBUTE__)
309
310 if (HAVE___BUILTIN_EXPECT)
311   set (ac_cv_have___builtin_expect 1)
312 else (HAVE___BUILTIN_EXPECT)
313   set (ac_cv_have___builtin_expect 0)
314 endif (HAVE___BUILTIN_EXPECT)
315
316 if (HAVE_USING_OPERATOR)
317   set (ac_cv_cxx_using_operator 1)
318 else (HAVE_USING_OPERATOR)
319   set (ac_cv_cxx_using_operator 0)
320 endif (HAVE_USING_OPERATOR)
321
322 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
323
324 if (WITH_THREADS AND Threads_FOUND)
325   if (CMAKE_USE_PTHREADS_INIT)
326     set (HAVE_PTHREAD 1)
327   endif (CMAKE_USE_PTHREADS_INIT)
328 else (WITH_THREADS AND Threads_FOUND)
329   set (NO_THREADS 1)
330 endif (WITH_THREADS AND Threads_FOUND)
331
332 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
333
334 configure_file (src/config.h.cmake.in config.h)
335 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
336 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
337 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
338 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
339
340 set (CMAKE_CXX_VISIBILITY_PRESET default)
341 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
342
343 set (GLOG_PUBLIC_H
344   ${CMAKE_CURRENT_BINARY_DIR}/config.h
345   ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
346   ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
347   ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
348   ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
349   src/glog/log_severity.h
350 )
351
352 set (GLOG_SRCS
353   ${GLOG_PUBLIC_H}
354   src/base/commandlineflags.h
355   src/base/googleinit.h
356   src/base/mutex.h
357   src/demangle.cc
358   src/demangle.h
359   src/logging.cc
360   src/raw_logging.cc
361   src/symbolize.cc
362   src/symbolize.h
363   src/utilities.cc
364   src/utilities.h
365   src/vlog_is_on.cc
366 )
367
368 if (HAVE_PTHREAD)
369   list (APPEND GLOG_SRCS src/signalhandler.cc)
370 endif (HAVE_PTHREAD)
371
372 if (WIN32)
373   list (APPEND GLOG_SRCS
374     src/windows/port.cc
375     src/windows/port.h
376   )
377 endif (WIN32)
378
379 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
380
381 add_library (glog
382   ${GLOG_SRCS}
383 )
384
385 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
386
387 if (UNWIND_LIBRARY)
388   target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
389 endif (UNWIND_LIBRARY)
390
391 if (HAVE_PTHREAD)
392   target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
393 endif (HAVE_PTHREAD)
394
395 if (WIN32 AND HAVE_SNPRINTF)
396   set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
397     HAVE_SNPRINTF)
398 endif (WIN32 AND HAVE_SNPRINTF)
399
400 if (gflags_FOUND)
401   target_include_directories (glog PUBLIC $<BUILD_INTERFACE:${gflags_INCLUDE_DIR}>)
402   target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
403
404   if (NOT BUILD_SHARED_LIBS)
405     # Don't use __declspec(dllexport|dllimport) if this is a static build
406     targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
407   endif (NOT BUILD_SHARED_LIBS)
408 endif (gflags_FOUND)
409
410 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
411 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
412
413 if (WIN32)
414   target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
415 endif (WIN32)
416
417 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
418
419 set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR})
420 set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
421 set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR})
422 set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog)
423
424 target_include_directories (glog BEFORE PUBLIC
425   "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
426   "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
427   "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>"
428   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
429   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
430
431 if (WIN32)
432   target_include_directories (glog PUBLIC
433     "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
434     PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
435 endif (WIN32)
436
437 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
438
439 if (NOT BUILD_SHARED_LIBS)
440   target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
441 else (NOT BUILD_SHARED_LIBS)
442   target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
443
444   if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
445     set (_EXPORT "__attribute__((visibility(\"default\")))")
446     set (_IMPORT "")
447   elseif (HAVE___DECLSPEC)
448     set (_EXPORT "__declspec(dllexport)")
449     set (_IMPORT "__declspec(dllimport)")
450   endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
451
452   target_compile_definitions (glog PRIVATE
453     "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
454   target_compile_definitions (glog INTERFACE
455     "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
456   target_compile_definitions (glog INTERFACE
457     "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
458 endif (NOT BUILD_SHARED_LIBS)
459
460 if (HAVE_EXECINFO_H)
461   set (HAVE_STACKTRACE 1)
462 endif (HAVE_EXECINFO_H)
463
464 if (UNIX OR (APPLE AND HAVE_DLADDR))
465   set (HAVE_SYMBOLIZE 1)
466 endif (UNIX OR (APPLE AND HAVE_DLADDR))
467
468 # Unit testing
469
470 if (BUILD_TESTING)
471   add_executable (logging_unittest
472     src/logging_unittest.cc
473   )
474
475   target_link_libraries (logging_unittest PRIVATE glog)
476
477   add_executable (stl_logging_unittest
478     src/stl_logging_unittest.cc
479   )
480
481   target_link_libraries (stl_logging_unittest PRIVATE glog)
482
483   if (HAVE_NO_DEPRECATED)
484     set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
485       -Wno-deprecated)
486   endif (HAVE_NO_DEPRECATED)
487
488   if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
489     target_compile_definitions (stl_logging_unittest PRIVATE
490       GLOG_STL_LOGGING_FOR_UNORDERED)
491   endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
492
493   if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
494     target_compile_definitions (stl_logging_unittest PRIVATE
495       GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
496   endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
497
498   if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
499     target_compile_definitions (stl_logging_unittest PRIVATE
500       GLOG_STL_LOGGING_FOR_EXT_HASH)
501   endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
502
503   if (HAVE_EXT_SLIST)
504     target_compile_definitions (stl_logging_unittest PRIVATE
505       GLOG_STL_LOGGING_FOR_EXT_SLIST)
506   endif (HAVE_EXT_SLIST)
507
508   if (HAVE_SYMBOLIZE)
509     add_executable (symbolize_unittest
510       src/symbolize_unittest.cc
511     )
512
513     target_link_libraries (symbolize_unittest PRIVATE glog)
514   endif (HAVE_SYMBOLIZE)
515
516   add_executable (demangle_unittest
517     src/demangle_unittest.cc
518   )
519
520   target_link_libraries (demangle_unittest PRIVATE glog)
521
522   if (HAVE_STACKTRACE)
523     add_executable (stacktrace_unittest
524       src/stacktrace_unittest.cc
525     )
526
527     target_link_libraries (stacktrace_unittest PRIVATE glog)
528   endif (HAVE_STACKTRACE)
529
530   add_executable (utilities_unittest
531     src/utilities_unittest.cc
532   )
533
534   target_link_libraries (utilities_unittest PRIVATE glog)
535
536   if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
537     add_executable (signalhandler_unittest
538       src/signalhandler_unittest.cc
539     )
540
541     target_link_libraries (signalhandler_unittest PRIVATE glog)
542   endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
543
544   add_test (NAME demangle COMMAND demangle_unittest)
545   add_test (NAME logging COMMAND logging_unittest)
546
547   if (TARGET signalhandler_unittest)
548     add_test (NAME signalhandler COMMAND signalhandler_unittest)
549   endif (TARGET signalhandler_unittest)
550
551   if (TARGET stacktrace_unittest)
552     add_test (NAME stacktrace COMMAND stacktrace_unittest)
553   endif (TARGET stacktrace_unittest)
554
555   add_test (NAME stl_logging COMMAND stl_logging_unittest)
556
557   if (TARGET symbolize_unittest)
558     add_test (NAME symbolize COMMAND symbolize_unittest)
559   endif (TARGET symbolize_unittest)
560 endif (BUILD_TESTING)
561
562 install (TARGETS glog
563   EXPORT glog-targets
564   RUNTIME DESTINATION ${_glog_CMake_BINDIR}
565   PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
566   LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
567   ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
568
569 if (gflags_FOUND)
570   set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
571 endif (gflags_FOUND)
572
573 configure_package_config_file (glog-config.cmake.in
574   ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
575   INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR}
576   NO_CHECK_REQUIRED_COMPONENTS_MACRO)
577
578 write_basic_package_version_file (glog-config-version.cmake VERSION
579   ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
580
581 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
582 export (PACKAGE glog)
583
584 install (FILES
585   ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
586   ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
587   DESTINATION ${_glog_CMake_INSTALLDIR})
588
589 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
590   ${_glog_CMake_INSTALLDIR})