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