2 # CMakeLists.txt --- a "CMake" file for building LZO
4 # This file is part of the LZO data compression library.
5 # http://www.oberhumer.com/opensource/lzo/
7 # Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer
11 cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
14 # simple usage example (Unix):
15 # mkdir -p build && cd build && cmake .. && make
17 # simple usage example (Windows MSVC):
20 # cmake .. -G "NMake Makefiles"
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
32 # see http://www.cmake.org/ for more info
35 # /***********************************************************************
37 # ************************************************************************/
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.")
47 if(NOT CMAKE_BUILD_TYPE)
48 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
51 project(lzo VERSION 2.10 LANGUAGES C)
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)
59 if(ENABLE_SHARED AND WIN32)
60 cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR) # needed for WINDOWS_EXPORT_ALL_SYMBOLS
64 if(NOT CMAKE_INSTALL_PREFIX)
65 message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined.")
67 include(FindPkgConfig QUIET)
68 include(GNUInstallDirs)
70 # /***********************************************************************
72 # ************************************************************************/
74 file(GLOB lzo_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")
75 list(SORT lzo_SOURCES)
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)
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)
93 if(lzo_USE_OBJECT_LIB)
94 add_library(lzo_static_lib STATIC $<TARGET_OBJECTS:lzo_object_lib>)
96 add_library(lzo_static_lib STATIC ${lzo_SOURCES})
97 list(APPEND lzo_COMPILE_TARGETS lzo_static_lib)
99 set_target_properties(lzo_static_lib PROPERTIES OUTPUT_NAME lzo2)
102 if(lzo_USE_OBJECT_LIB)
103 add_library(lzo_shared_lib SHARED $<TARGET_OBJECTS:lzo_object_lib>)
105 add_library(lzo_shared_lib SHARED ${lzo_SOURCES})
106 list(APPEND lzo_COMPILE_TARGETS lzo_shared_lib)
108 set_target_properties(lzo_shared_lib PROPERTIES OUTPUT_NAME lzo2)
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)
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)
118 macro(lzo_add_executable t)
119 add_executable(${t} ${ARGN})
121 target_link_libraries(${t} lzo_static_lib)
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}")
130 lzo_add_executable(lzotest lzotest/lzotest.c)
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
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)
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"
152 # /***********************************************************************
153 # // compilation flags
154 # // this section currently mostly matches the Autoconf version
155 # ************************************************************************/
157 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
158 include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
160 include(CheckFunctionExists)
161 include(CheckIncludeFile)
162 include(CheckLibraryExists)
163 include(CheckSymbolExists)
164 include(CheckTypeSize)
165 include(TestBigEndian)
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)
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)
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)
188 string(TOUPPER "${f}" var)
189 string(REGEX REPLACE "[^0-9A-Z_]" "_" var "${var}")
190 mfx_check_include_file("${f}" "HAVE_${var}")
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}})
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)
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}")
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)
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)
224 string(TOUPPER "${f}" var)
225 string(REGEX REPLACE "[^0-9A-Z_]" "_" var "${var}")
226 mfx_check_function_exists("${f}" "HAVE_${var}")
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)
236 message(FATAL_ERROR "ERROR: TEST_BIG_ENDIAN failed with result '${big_endian}'.")
240 add_definitions(-DLZO_CFG_NO_CONFIG_HEADER=1)
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)
249 # /***********************************************************************
251 # ************************************************************************/
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")
260 # /***********************************************************************
262 # ************************************************************************/
264 if(DEFINED CMAKE_INSTALL_FULL_LIBDIR)
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}")
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
275 install(FILES ${f} DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/lzo")
278 install(TARGETS lzo_static_lib ARCHIVE DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}")
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}"
289 set(f lzopack lzotest simple testmini) # examples
290 install(TARGETS ${f} DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lzo/examples")
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")
300 endif() # CMAKE_INSTALL_FULL_LIBDIR
302 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.maint.txt")
303 include("${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.maint.txt")
306 # finally print some info about the build-type
307 if(CMAKE_CONFIGURATION_TYPES)
308 message(STATUS "CMAKE_CONFIGURATION_TYPES = ${CMAKE_CONFIGURATION_TYPES}")
311 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
314 # vim:set ft=cmake ts=4 sw=4 tw=0 et: