summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 2aa5ceca540721ada026983915a23bdad5310f5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

# ----------------------------------------------------------------------------
# package information
set (PROJECT_NAME      "gflags")
set (PACKAGE_NAME      "${PROJECT_NAME}")
set (PACKAGE_VERSION   "2.1.0")
set (PACKAGE_STRING    "${PROJECT_NAME} ${PACKAGE_VERSION}")
set (PACKAGE_TARNAME   "${PROJECT_NAME}-${PACKAGE_VERSION}")
set (PACKAGE_BUGREPORT "https://code.google.com/p/gflags/issues/")

project (${PROJECT_NAME})

# ----------------------------------------------------------------------------
# configure options
option (BUILD_SHARED_LIBS "Request build of shared libraries." OFF)

set (GFLAGS_NAMESPACE "gflags" CACHE STRING "C++ namespace identifier of gflags library.")
mark_as_advanced (GFLAGS_NAMESPACE)

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS AND NOT CMAKE_C_FLAGS)
  set (
    CMAKE_BUILD_TYPE "Release"
    CACHE STRING "Choose the type of build, options are: None (CMAKE_C_FLAGS and CMAKE_CXX_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
    FORCE
  )
endif ()

# ----------------------------------------------------------------------------
# system checks
include (CheckTypeSize)
foreach (type IN ITEMS uint16_t u_int16_t __int16)
  CHECK_TYPE_SIZE (${type} SIZE)
  if (SIZE)
    set (HAVE_${type} 1)
  else ()
    set (HAVE_${type} 0)
  endif ()
endforeach ()

include (CheckIncludeFileCXX)
foreach (fname IN ITEMS fnmatch inttypes unistd sys/stat)
  string (TOUPPER "${fname}" FNAME)
  string (REGEX REPLACE "/" "_" FNAME "${FNAME}")
  CHECK_INCLUDE_FILE_CXX ("${fname}.h" HAVE_${FNAME}_H)
  if (HAVE_${FNAME}_H)
    set (HAVE_${FNAME}_H 1)
  else ()
    set (HAVE_${FNAME}_H 0)
  endif ()
endforeach ()

include (CheckSymbolExists)
foreach (fname IN ITEMS strtoll strtoq)
  string (TOUPPER "${fname}" FNAME)
  CHECK_SYMBOL_EXISTS ("${fname}" stdlib.h HAVE_${FNAME})
  if (HAVE_${FNAME})
    set (HAVE_${FNAME} 1)
  else ()
    set (HAVE_${FNAME} 0)
  endif ()
endforeach ()

find_package (Threads)
if (Threads_FOUND)
  if (CMAKE_USE_PTHREADS_INIT)
    set (HAVE_PTHREAD 1)
  else  ()
    set (HAVE_PTHREAD 0)
  endif ()
endif ()

# ----------------------------------------------------------------------------
# source files - excluding root subdirectory and/or .in suffix
set (PUBLIC_HDRS
  "gflags/gflags.h"
  "gflags/gflags_declare.h"
  "gflags/gflags_completions.h"
)

set (PRIVATE_HDRS
  "config.h"
)

set (GFLAGS_SRCS
  "gflags.cc"
  "gflags_reporting.cc"
  "gflags_completions.cc"
)

# ----------------------------------------------------------------------------
# configure source files
if (CMAKE_COMPILER_IS_GNUCXX)
  set (__ATTRIBUTE__UNUSED "__attribute((unused))")
else ()
  set (__ATTRIBUTE__UNUSED)
endif ()

function (configure_sources out subdir)
  set (tmp)
  foreach (src IN LISTS ARGN)
    set (src "${subdir}/${src}")
    if (EXISTS "${PROJECT_SOURCE_DIR}/${src}.in")
      configure_file ("${PROJECT_SOURCE_DIR}/${src}.in" "${PROJECT_BINARY_DIR}/${src}" @ONLY)
      list (APPEND tmp "${PROJECT_BINARY_DIR}/${src}")
    else ()
      list (APPEND tmp "${PROJECT_SOURCE_DIR}/${src}")
    endif ()
  endforeach ()
  set (${out} "${tmp}" PARENT_SCOPE)
endfunction ()

configure_sources (PUBLIC_HDRS  include ${PUBLIC_HDRS})
configure_sources (PRIVATE_HDRS src     ${PRIVATE_HDRS})
configure_sources (GFLAGS_SRCS  src     ${GFLAGS_SRCS})

# ----------------------------------------------------------------------------
# output directories
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib")

# ----------------------------------------------------------------------------
# add library target
include_directories (
  "${PROJECT_BINARY_DIR}/include"
  "${PROJECT_SOURCE_DIR}/include"
  "${PROJECT_BINARY_DIR}/src"
  "${PROJECT_SOURCE_DIR}/src"
)

if (WIN32)
  add_definitions (-DGFLAGS_DLL_EXPORT)
endif ()

add_library (gflags ${GFLAGS_SRCS})

# ----------------------------------------------------------------------------
# installation
install (TARGETS gflags DESTINATION lib)
install (FILES ${PUBLIC_HDRS} DESTINATION include/gflags)