Merge pull request #158 from sergiud/zero-allocation
[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 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
50 set (CMAKE_THREAD_PREFER_PTHREAD 1)
51
52 if (WITH_GFLAGS)
53   find_package (gflags 2.2.0)
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 check_cxx_source_compiles ("
195 __declspec(thread) int tls;
196 int main() { }
197 " HAVE_MSVC_TLS)
198
199 check_cxx_source_compiles ("
200 thread_local int tls;
201 int main() { }
202 " HAVE_CXX11_TLS)
203
204 check_cxx_source_compiles ("
205 __attribute__((thread)) int tls;
206 int main() { }
207 " HAVE_CYGWIN_TLS)
208
209 if (WITH_TLS)
210   if (HAVE_CYGWIN_TLS)
211     set (GLOG_THREAD_LOCAL_STORAGE "__attribute__((thread))")
212   elseif (HAVE_MSVC_TLS)
213     set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
214   elseif (HAVE_CXX11_TLS)
215     set (GLOG_THREAD_LOCAL_STORAGE thread_local)
216   endif (HAVE_CYGWIN_TLS)
217 endif (WITH_TLS)
218
219 set (_PC_FIELDS
220   "gregs[REG_PC]"
221   "gregs[REG_EIP]"
222   "gregs[REG_RIP]"
223   "sc_ip"
224   "uc_regs->gregs[PT_NIP]"
225   "gregs[R15]"
226   "arm_pc"
227   "mc_eip"
228   "mc_rip"
229   "__gregs[REG_EIP]"
230   "__gregs[REG_RIP]"
231   "ss.eip"
232   "__ss.__eip"
233   "ss.rip"
234   "__ss.__rip"
235   "ss.srr0"
236   "__ss.__srr0"
237 )
238
239 set (_PC_HEADERS ucontext.h signal.h)
240
241 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
242   foreach (_PC_FIELD ${_PC_FIELDS})
243     foreach (_PC_HEADER ${_PC_HEADERS})
244       set (_TMP
245       ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
246       file (WRITE ${_TMP} "
247 #define _GNU_SOURCE 1
248 #include <${_PC_HEADER}>
249 int main(void)
250 {
251   ucontext_t u;
252   return u.${_PC_FIELD} == 0;
253 }
254 ")
255       try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
256         COMPILE_DEFINITIONS _GNU_SOURCE=1)
257
258       if (HAVE_PC_FROM_UCONTEXT)
259         set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
260       endif (HAVE_PC_FROM_UCONTEXT)
261     endforeach (_PC_HEADER)
262   endforeach (_PC_FIELD)
263 endif  (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
264
265 if (STL_STD_NAMESPACE)
266   set (STL_NAMESPACE std)
267 else (STL_STD_NAMESPACE)
268   set (STL_NAMESPACE "")
269 endif (STL_STD_NAMESPACE)
270
271 set (GOOGLE_NAMESPACE google)
272 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
273 set (_END_GOOGLE_NAMESPACE_ "}")
274
275 if (HAVE___UINT16)
276   set (ac_cv_have___uint16 1)
277 else (HAVE___UINT16)
278   set (ac_cv_have___uint16 0)
279 endif (HAVE___UINT16)
280
281 if (HAVE_INTTYPES_H)
282   set (ac_cv_have_inttypes_h 1)
283 else (HAVE_INTTYPES_H)
284   set (ac_cv_have_inttypes_h 0)
285 endif (HAVE_INTTYPES_H)
286
287 if (HAVE_LIB_GFLAGS)
288   set (ac_cv_have_libgflags 1)
289 else (HAVE_LIB_GFLAGS)
290   set (ac_cv_have_libgflags 0)
291 endif (HAVE_LIB_GFLAGS)
292
293 if (HAVE_STDINT_H)
294   set (ac_cv_have_stdint_h 1)
295 else (HAVE_STDINT_H)
296   set (ac_cv_have_stdint_h 0)
297 endif (HAVE_STDINT_H)
298
299 if (HAVE_SYS_TYPES_H)
300   set (ac_cv_have_systypes_h 1)
301 else (HAVE_SYS_TYPES_H)
302   set (ac_cv_have_systypes_h 0)
303 endif (HAVE_SYS_TYPES_H)
304
305 if (HAVE_U_INT16_T)
306   set (ac_cv_have_u_int16_t 1)
307 else (HAVE_U_INT16_T)
308   set (ac_cv_have_u_int16_t 0)
309 endif (HAVE_U_INT16_T)
310
311 if (HAVE_UINT16_T)
312   set (ac_cv_have_uint16_t 1)
313 else (HAVE_UINT16_T)
314   set (ac_cv_have_uint16_t 0)
315 endif (HAVE_UINT16_T)
316
317 if (HAVE_UNISTD_H)
318   set (ac_cv_have_unistd_h 1)
319 else (HAVE_UNISTD_H)
320   set (ac_cv_have_unistd_h 0)
321 endif (HAVE_UNISTD_H)
322
323 set (ac_google_namespace ${GOOGLE_NAMESPACE})
324 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
325 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
326
327 if (HAVE___ATTRIBUTE__)
328   set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
329   set (ac_cv___attribute___noinline "__attribute__((noinline))")
330 elseif (HAVE___DECLSPEC)
331   set (ac_cv___attribute___noreturn "__declspec(noreturn)")
332   #set (ac_cv___attribute___noinline "__declspec(noinline)")
333 endif (HAVE___ATTRIBUTE__)
334
335 if (HAVE___BUILTIN_EXPECT)
336   set (ac_cv_have___builtin_expect 1)
337 else (HAVE___BUILTIN_EXPECT)
338   set (ac_cv_have___builtin_expect 0)
339 endif (HAVE___BUILTIN_EXPECT)
340
341 if (HAVE_USING_OPERATOR)
342   set (ac_cv_cxx_using_operator 1)
343 else (HAVE_USING_OPERATOR)
344   set (ac_cv_cxx_using_operator 0)
345 endif (HAVE_USING_OPERATOR)
346
347 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
348
349 if (WITH_THREADS AND Threads_FOUND)
350   if (CMAKE_USE_PTHREADS_INIT)
351     set (HAVE_PTHREAD 1)
352   endif (CMAKE_USE_PTHREADS_INIT)
353 else (WITH_THREADS AND Threads_FOUND)
354   set (NO_THREADS 1)
355 endif (WITH_THREADS AND Threads_FOUND)
356
357 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
358
359 configure_file (src/config.h.cmake.in config.h)
360 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
361 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
362 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
363 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
364
365 set (CMAKE_CXX_VISIBILITY_PRESET default)
366 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
367
368 set (GLOG_PUBLIC_H
369   ${CMAKE_CURRENT_BINARY_DIR}/config.h
370   ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
371   ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
372   ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
373   ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
374   src/glog/log_severity.h
375 )
376
377 set (GLOG_SRCS
378   ${GLOG_PUBLIC_H}
379   src/base/commandlineflags.h
380   src/base/googleinit.h
381   src/base/mutex.h
382   src/demangle.cc
383   src/demangle.h
384   src/logging.cc
385   src/raw_logging.cc
386   src/symbolize.cc
387   src/symbolize.h
388   src/utilities.cc
389   src/utilities.h
390   src/vlog_is_on.cc
391 )
392
393 if (HAVE_PTHREAD OR WIN32)
394   list (APPEND GLOG_SRCS src/signalhandler.cc)
395 endif (HAVE_PTHREAD OR WIN32)
396
397 if (WIN32)
398   list (APPEND GLOG_SRCS
399     src/windows/port.cc
400     src/windows/port.h
401   )
402 endif (WIN32)
403
404 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
405
406 add_library (glog
407   ${GLOG_SRCS}
408 )
409
410 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
411
412 if (UNWIND_LIBRARY)
413   target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
414 endif (UNWIND_LIBRARY)
415
416 if (HAVE_PTHREAD)
417   target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
418 endif (HAVE_PTHREAD)
419
420 if (WIN32 AND HAVE_SNPRINTF)
421   set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
422     HAVE_SNPRINTF)
423 endif (WIN32 AND HAVE_SNPRINTF)
424
425 if (gflags_FOUND)
426   target_link_libraries (glog PUBLIC gflags)
427
428   if (NOT BUILD_SHARED_LIBS)
429     # Don't use __declspec(dllexport|dllimport) if this is a static build
430     targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
431   endif (NOT BUILD_SHARED_LIBS)
432 endif (gflags_FOUND)
433
434 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
435 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
436
437 if (WIN32)
438   target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
439 endif (WIN32)
440
441 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
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:include>"
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 bin
589   PUBLIC_HEADER DESTINATION include/glog
590   LIBRARY DESTINATION lib
591   ARCHIVE DESTINATION lib)
592
593 if (gflags_FOUND)
594   set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
595 endif (gflags_FOUND)
596
597 configure_package_config_file (glog-config.cmake.in
598   ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
599   INSTALL_DESTINATION lib/cmake/glog
600   NO_CHECK_REQUIRED_COMPONENTS_MACRO)
601
602 write_basic_package_version_file (glog-config-version.cmake VERSION
603   ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
604
605 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
606 export (PACKAGE glog)
607
608 install (FILES
609   ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
610   ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
611   DESTINATION lib/cmake/glog)
612
613 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION lib/cmake/glog)