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