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