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