Imported Upstream version 2.10
[platform/upstream/lzo.git] / CMakeLists.txt
1 #
2 # CMakeLists.txt --- a "CMake" file for building LZO
3 #
4 # This file is part of the LZO data compression library.
5 #   http://www.oberhumer.com/opensource/lzo/
6 #
7 # Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer
8 # All Rights Reserved.
9 #
10
11 cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
12
13 #
14 # simple usage example (Unix):
15 #     mkdir -p build && cd build && cmake .. && make
16 #
17 # simple usage example (Windows MSVC):
18 #     md build
19 #     cd build
20 #     cmake .. -G "NMake Makefiles"
21 #     nmake
22 #
23 # another usage example (Unix):
24 #     mkdir -p build/release-i686
25 #     cd       build/release-i686
26 #     cmake ../.. -DENABLE_STATIC=0 -DENABLE_SHARED=1 \
27 #         -DCMAKE_C_COMPILER=gcc -DCMAKE_C_FLAGS="-m32 -march=i686" \
28 #         -DCMAKE_INSTALL_PREFIX=/opt/local/prefix-i686
29 #     make VERBOSE=1
30 #     make install
31 #
32 # see http://www.cmake.org/ for more info
33 #
34
35 # /***********************************************************************
36 # // init
37 # ************************************************************************/
38
39 # Disallow in-source builds. Note that you will still have to manually
40 # clean up a few files if you accidentally try an in-source build.
41 set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
42 set(CMAKE_DISABLE_SOURCE_CHANGES  ON)
43 if(",${CMAKE_SOURCE_DIR}," STREQUAL ",${CMAKE_BINARY_DIR},")
44     message(FATAL_ERROR "ERROR: In-source builds are not allowed.")
45 endif()
46
47 if(NOT CMAKE_BUILD_TYPE)
48     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
49 endif()
50
51 project(lzo VERSION 2.10 LANGUAGES C)
52
53 # configuration options
54 option(ENABLE_STATIC "Build static LZO library." ON)
55 option(ENABLE_SHARED "Build shared LZO library." OFF)
56 if(NOT ENABLE_STATIC AND NOT ENABLE_SHARED)
57     set(ENABLE_STATIC ON)
58 endif()
59 if(ENABLE_SHARED AND WIN32)
60     cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR) # needed for WINDOWS_EXPORT_ALL_SYMBOLS
61 endif()
62
63 # install directories
64 if(NOT CMAKE_INSTALL_PREFIX)
65     message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined.")
66 endif()
67 include(FindPkgConfig QUIET)
68 include(GNUInstallDirs)
69
70 # /***********************************************************************
71 # // targets
72 # ************************************************************************/
73
74 file(GLOB lzo_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")
75 list(SORT lzo_SOURCES)
76
77 # LZO library
78 if(NOT DEFINED lzo_USE_OBJECT_LIB)
79     if(ENABLE_STATIC AND ENABLE_SHARED)
80         if(CMAKE_POSITION_INDEPENDENT_CODE OR MSVC)
81             # all objects are PIC on this system => can share objects
82             set(lzo_USE_OBJECT_LIB 1)
83         endif()
84     endif()
85 endif()
86 set(lzo_COMPILE_TARGETS )
87 if(lzo_USE_OBJECT_LIB)
88     add_library(lzo_object_lib OBJECT ${lzo_SOURCES})
89     list(APPEND lzo_COMPILE_TARGETS lzo_object_lib)
90     set_property(TARGET lzo_object_lib PROPERTY POSITION_INDEPENDENT_CODE ON)
91 endif()
92 if(ENABLE_STATIC)
93     if(lzo_USE_OBJECT_LIB)
94         add_library(lzo_static_lib STATIC $<TARGET_OBJECTS:lzo_object_lib>)
95     else()
96         add_library(lzo_static_lib STATIC ${lzo_SOURCES})
97         list(APPEND lzo_COMPILE_TARGETS lzo_static_lib)
98     endif()
99     set_target_properties(lzo_static_lib PROPERTIES OUTPUT_NAME lzo2)
100 endif()
101 if(ENABLE_SHARED)
102     if(lzo_USE_OBJECT_LIB)
103         add_library(lzo_shared_lib SHARED $<TARGET_OBJECTS:lzo_object_lib>)
104     else()
105         add_library(lzo_shared_lib SHARED ${lzo_SOURCES})
106         list(APPEND lzo_COMPILE_TARGETS lzo_shared_lib)
107     endif()
108     set_target_properties(lzo_shared_lib PROPERTIES OUTPUT_NAME lzo2)
109     if(ENABLE_STATIC)
110         # avoid name clash between static lzo2.lib and DLL import-lib lzo2.lib
111         set_target_properties(lzo_shared_lib PROPERTIES ARCHIVE_OUTPUT_NAME lzo2_dllimport)
112     endif()
113     set_target_properties(lzo_shared_lib PROPERTIES SOVERSION 2 VERSION 2.0.0) # ABI version is 2.0.0 !
114     set_target_properties(lzo_shared_lib PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
115 endif()
116
117 # tests & examples
118 macro(lzo_add_executable t)
119     add_executable(${t} ${ARGN})
120     if(ENABLE_STATIC)
121         target_link_libraries(${t} lzo_static_lib)
122     else()
123         target_link_libraries(${t} lzo_shared_lib)
124         if(DEFINED CMAKE_INSTALL_FULL_LIBDIR)
125             set_target_properties(${t} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}")
126         endif()
127     endif()
128 endmacro()
129 # main test driver
130 lzo_add_executable(lzotest  lzotest/lzotest.c)
131 # examples
132 lzo_add_executable(dict     examples/dict.c)
133 lzo_add_executable(lzopack  examples/lzopack.c)
134 lzo_add_executable(overlap  examples/overlap.c)
135 lzo_add_executable(precomp  examples/precomp.c)
136 lzo_add_executable(precomp2 examples/precomp2.c)
137 lzo_add_executable(simple   examples/simple.c)
138 # some boring internal test programs
139 if(0)
140     lzo_add_executable(align    tests/align.c)
141     lzo_add_executable(chksum   tests/chksum.c)
142     lzo_add_executable(promote  tests/promote.c)
143     lzo_add_executable(sizes    tests/sizes.c)
144 endif()
145
146 # miniLZO
147 if(1)
148     add_executable(testmini minilzo/testmini.c minilzo/minilzo.c)
149     target_include_directories(testmini PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/lzo") # needed for "lzoconf.h"
150 endif()
151
152 # /***********************************************************************
153 # // compilation flags
154 # // this section currently mostly matches the Autoconf version
155 # ************************************************************************/
156
157 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
158 include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
159
160 include(CheckFunctionExists)
161 include(CheckIncludeFile)
162 include(CheckLibraryExists)
163 include(CheckSymbolExists)
164 include(CheckTypeSize)
165 include(TestBigEndian)
166
167 if(MSVC)
168     # disable silly warnings about using "deprecated" POSIX functions like fopen()
169     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
170     add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
171     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
172     add_definitions(-D_CRT_SECURE_NO_WARNINGS)
173 endif()
174
175 # Checks for header files
176 macro(mfx_check_include_file f var)
177     check_include_file("${f}" "mfx_${var}")
178     if(NOT ",${mfx_${var}}," STREQUAL ",,")
179         add_definitions(-D${var}=1)
180         set(mfx_${var} 1)
181     else()
182         set(mfx_${var} 0)
183     endif()
184 endmacro()
185 # mfx_ACC_CHECK_HEADERS
186 set(l assert.h ctype.h dirent.h errno.h fcntl.h float.h limits.h malloc.h memory.h setjmp.h signal.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h strings.h time.h unistd.h utime.h sys/mman.h sys/resource.h sys/stat.h sys/time.h sys/types.h sys/wait.h)
187 foreach(f ${l})
188     string(TOUPPER "${f}" var)
189     string(REGEX REPLACE "[^0-9A-Z_]" "_" var "${var}")
190     mfx_check_include_file("${f}" "HAVE_${var}")
191 endforeach()
192
193 # Checks for typedefs and structures
194 macro(mfx_check_type_size type var)
195     check_type_size("${type}" "mfx_${var}")
196     if("${mfx_${var}}" MATCHES "^[1-9][0-9]*$")
197         add_definitions(-D${var}=${mfx_${var}})
198     else()
199         set(mfx_${var} 0)
200     endif()
201 endmacro()
202 # mfx_ACC_CHECK_SIZEOF + mfx_CHECK_SIZEOF
203 set(l short int long "long long" __int16 __int32 __int64 "void *" size_t ptrdiff_t intmax_t uintmax_t intptr_t uintptr_t float double "long double" dev_t fpos_t mode_t off_t ssize_t time_t)
204 foreach(f ${l})
205     string(TOUPPER "${f}" var)
206     string(REGEX REPLACE " \\*" "_P" var "${var}")
207     string(REGEX REPLACE "[^0-9A-Z_]" "_" var "${var}")
208     mfx_check_type_size("${f}" "SIZEOF_${var}")
209 endforeach()
210
211 # Checks for library functions
212 macro(mfx_check_function_exists func var)
213     check_function_exists("${func}" "mfx_${var}")
214     if(NOT ",${mfx_${var}}," STREQUAL ",,")
215         add_definitions(-D${var}=1)
216         set(mfx_${var} 1)
217     else()
218         set(mfx_${var} 0)
219     endif()
220 endmacro()
221 # mfx_ACC_CHECK_FUNCS
222 set(l access alloca atexit atoi atol chmod chown clock_getcpuclockid clock_getres clock_gettime ctime difftime fstat getenv getpagesize getrusage gettimeofday gmtime isatty localtime longjmp lstat memcmp memcpy memmove memset mkdir mktime mmap mprotect munmap qsort raise rmdir setjmp signal snprintf strcasecmp strchr strdup strerror strftime stricmp strncasecmp strnicmp strrchr strstr time umask utime vsnprintf)
223 foreach(f ${l})
224     string(TOUPPER "${f}" var)
225     string(REGEX REPLACE "[^0-9A-Z_]" "_" var "${var}")
226     mfx_check_function_exists("${f}" "HAVE_${var}")
227 endforeach()
228
229 # mfx_LZO_CHECK_ENDIAN
230 TEST_BIG_ENDIAN(big_endian)
231 if ("${big_endian}" MATCHES "^1$")
232     add_definitions(-DLZO_ABI_BIG_ENDIAN=1)
233 elseif ("${big_endian}" MATCHES "^0$")
234     add_definitions(-DLZO_ABI_LITTLE_ENDIAN=1)
235 else()
236     message(FATAL_ERROR "ERROR: TEST_BIG_ENDIAN failed with result '${big_endian}'.")
237 endif()
238
239 # LZO_HAVE_CONFIG_H
240 add_definitions(-DLZO_CFG_NO_CONFIG_HEADER=1)
241
242 # warnings
243 foreach(t ${lzo_COMPILE_TARGETS})
244     if(CMAKE_C_COMPILER_ID MATCHES "^(Clang|GNU)$")
245         target_compile_options(${t} PRIVATE -Wall -W -Wcast-qual)
246     endif()
247 endforeach()
248
249 # /***********************************************************************
250 # // "make test"
251 # ************************************************************************/
252
253 include(CTest)
254 add_test(NAME simple     COMMAND simple)
255 add_test(NAME testmini   COMMAND testmini)
256 add_test(NAME lzotest-01 COMMAND lzotest -mlzo   -n2  -q "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
257 add_test(NAME lzotest-02 COMMAND lzotest -mavail -n10 -q "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
258 add_test(NAME lzotest-03 COMMAND lzotest -mall   -n10 -q "${CMAKE_CURRENT_SOURCE_DIR}/include/lzo/lzodefs.h")
259
260 # /***********************************************************************
261 # // "make install"
262 # ************************************************************************/
263
264 if(DEFINED CMAKE_INSTALL_FULL_LIBDIR)
265
266 set(f AUTHORS COPYING NEWS THANKS doc/LZO.FAQ doc/LZO.TXT doc/LZOAPI.TXT)
267 install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}")
268
269 set(f include/lzo/lzo1.h include/lzo/lzo1a.h include/lzo/lzo1b.h
270     include/lzo/lzo1c.h include/lzo/lzo1f.h include/lzo/lzo1x.h
271     include/lzo/lzo1y.h include/lzo/lzo1z.h include/lzo/lzo2a.h
272     include/lzo/lzo_asm.h include/lzo/lzoconf.h include/lzo/lzodefs.h
273     include/lzo/lzoutil.h
274 )
275 install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/lzo")
276
277 if(ENABLE_STATIC)
278     install(TARGETS lzo_static_lib ARCHIVE DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}")
279 endif()
280 if(ENABLE_SHARED)
281     install(TARGETS lzo_shared_lib
282         ARCHIVE DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}"
283         LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}"
284         RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}"
285     )
286 endif()
287
288 if(1)
289     set(f lzopack lzotest simple testmini) # examples
290     install(TARGETS ${f} DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lzo/examples")
291 endif()
292
293 if(PKG_CONFIG_FOUND)
294     configure_file(lzo2.pc.cmakein lzo2.pc @ONLY)
295     #if(EXISTS "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig")
296     install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lzo2.pc" DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig")
297     #endif()
298 endif()
299
300 endif() # CMAKE_INSTALL_FULL_LIBDIR
301
302 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.maint.txt")
303 include("${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.maint.txt")
304 endif()
305
306 # finally print some info about the build-type
307 if(CMAKE_CONFIGURATION_TYPES)
308 message(STATUS "CMAKE_CONFIGURATION_TYPES = ${CMAKE_CONFIGURATION_TYPES}")
309 endif()
310 if(CMAKE_BUILD_TYPE)
311 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
312 endif()
313
314 # vim:set ft=cmake ts=4 sw=4 tw=0 et: