CMakeLists.txt (32704B)
1 # Copyright (c) 2020 Google LLC. 2 # 3 # Use of this source code is governed by a BSD-style license 4 # that can be found in the LICENSE file in the root of the source 5 # tree. An additional intellectual property rights grant can be found 6 # in the file PATENTS. All contributing project authors may 7 # be found in the AUTHORS file in the root of the source tree. 8 9 if(APPLE) 10 cmake_minimum_required(VERSION 3.17) 11 else() 12 cmake_minimum_required(VERSION 3.16) 13 endif() 14 15 project(WebP C) 16 17 # Options for coder / decoder executables. 18 if(BUILD_SHARED_LIBS) 19 set(WEBP_LINK_STATIC_DEFAULT OFF) 20 else() 21 set(WEBP_LINK_STATIC_DEFAULT ON) 22 endif() 23 option(WEBP_LINK_STATIC 24 "Link using static libraries. If OFF, use dynamic libraries." 25 ${WEBP_LINK_STATIC_DEFAULT}) 26 if(NOT EMSCRIPTEN) 27 # Disable SIMD on Emscripten by default, as it's a new unstable Wasm feature. 28 # Users can still explicitly opt-in to make a SIMD-enabled build. 29 set(WEBP_ENABLE_SIMD_DEFAULT ON) 30 endif() 31 option(WEBP_ENABLE_SIMD "Enable any SIMD optimization." 32 ${WEBP_ENABLE_SIMD_DEFAULT}) 33 option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON) 34 option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON) 35 option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON) 36 option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." ON) 37 option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." ON) 38 option(WEBP_BUILD_VWEBP "Build the vwebp viewer tool." ON) 39 option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." ON) 40 option(WEBP_BUILD_LIBWEBPMUX "Build the libwebpmux library." ON) 41 option(WEBP_BUILD_WEBPMUX "Build the webpmux command line tool." ON) 42 option(WEBP_BUILD_EXTRAS "Build extras." ON) 43 option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF) 44 option(WEBP_BUILD_FUZZTEST "Build the fuzztest tests." OFF) 45 option(WEBP_USE_THREAD "Enable threading support" ON) 46 option(WEBP_NEAR_LOSSLESS "Enable near-lossless encoding" ON) 47 option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces." 48 OFF) 49 set(WEBP_BITTRACE "0" CACHE STRING "Bit trace mode (0=none, 1=bit, 2=bytes)") 50 set_property(CACHE WEBP_BITTRACE PROPERTY STRINGS 0 1 2) 51 option(WEBP_ENABLE_WUNUSED_RESULT "Add [[nodiscard]] to some functions. \ 52 CMake must be at least 3.21 to force C23" OFF) 53 54 if(WEBP_LINK_STATIC) 55 if(WIN32) 56 set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) 57 else() 58 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) 59 endif() 60 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 61 # vwebp does not compile on Ubuntu with static libraries so disabling it for 62 # now. 63 set(WEBP_BUILD_VWEBP OFF) 64 endif() 65 66 # Option needed for handling Unicode file names on Windows. 67 if(WIN32) 68 option(WEBP_UNICODE "Build Unicode executables." ON) 69 endif() 70 71 if(WEBP_BUILD_WEBP_JS) 72 set(WEBP_BUILD_ANIM_UTILS OFF) 73 set(WEBP_BUILD_CWEBP OFF) 74 set(WEBP_BUILD_DWEBP OFF) 75 set(WEBP_BUILD_GIF2WEBP OFF) 76 set(WEBP_BUILD_IMG2WEBP OFF) 77 set(WEBP_BUILD_VWEBP OFF) 78 set(WEBP_BUILD_WEBPINFO OFF) 79 set(WEBP_BUILD_WEBPMUX OFF) 80 set(WEBP_BUILD_EXTRAS OFF) 81 set(WEBP_USE_THREAD OFF) 82 83 if(WEBP_ENABLE_SIMD) 84 message(NOTICE 85 "wasm2js does not support SIMD, disabling webp.js generation.") 86 endif() 87 88 if(NOT EMSCRIPTEN_VERSION) 89 message( 90 WARNING 91 "EMSCRIPTEN_VERSION not detected!\n" 92 "WEBP_BUILD_WEBP_JS is only supported with emcmake/emmake.\n" 93 "The build may fail if those tools are not used. See webp_js/README.md." 94 ) 95 endif() 96 endif() 97 98 set(SHARPYUV_DEP_LIBRARIES) 99 set(SHARPYUV_DEP_INCLUDE_DIRS) 100 set(WEBP_DEP_LIBRARIES) 101 set(WEBP_DEP_INCLUDE_DIRS) 102 103 if(NOT CMAKE_BUILD_TYPE) 104 set(CMAKE_BUILD_TYPE "Release" 105 CACHE STRING "Build type: Release, Debug, MinSizeRel or RelWithDebInfo" 106 FORCE) 107 endif() 108 109 # Include dependencies. 110 if(WEBP_BUILD_ANIM_UTILS 111 OR WEBP_BUILD_CWEBP 112 OR WEBP_BUILD_DWEBP 113 OR WEBP_BUILD_EXTRAS 114 OR WEBP_BUILD_GIF2WEBP 115 OR WEBP_BUILD_IMG2WEBP) 116 set(WEBP_FIND_IMG_LIBS TRUE) 117 else() 118 set(WEBP_FIND_IMG_LIBS FALSE) 119 endif() 120 include(cmake/deps.cmake) 121 include(GNUInstallDirs) 122 123 if(BUILD_SHARED_LIBS AND NOT DEFINED CMAKE_INSTALL_RPATH) 124 # Set the rpath to match autoconf/libtool behavior. Note this must be set 125 # before target creation. 126 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 127 endif() 128 129 # ############################################################################## 130 # Options. 131 if(WEBP_ENABLE_SWAP_16BIT_CSP) 132 add_definitions(-DWEBP_SWAP_16BIT_CSP=1) 133 endif() 134 135 if(NOT WEBP_BITTRACE STREQUAL "0") 136 add_definitions(-DBITTRACE=${WEBP_BITTRACE}) 137 endif() 138 139 if(WEBP_UNICODE) 140 # Windows recommends setting both UNICODE and _UNICODE. 141 add_definitions(-DUNICODE -D_UNICODE) 142 endif() 143 144 if(WIN32 AND BUILD_SHARED_LIBS) 145 add_definitions(-DWEBP_DLL) 146 endif() 147 148 # pkg-config variables used by *.pc.in. 149 set(prefix ${CMAKE_INSTALL_PREFIX}) 150 set(exec_prefix "\${prefix}") 151 if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") 152 set(libdir "${CMAKE_INSTALL_LIBDIR}") 153 else() 154 set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") 155 endif() 156 if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") 157 set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") 158 else() 159 set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") 160 endif() 161 set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT}) 162 set(INSTALLED_LIBRARIES) 163 164 if(MSVC) 165 # match the naming convention used by nmake 166 set(webp_libname_prefix "lib") 167 set(CMAKE_SHARED_LIBRARY_PREFIX "${webp_libname_prefix}") 168 set(CMAKE_IMPORT_LIBRARY_PREFIX "${webp_libname_prefix}") 169 set(CMAKE_STATIC_LIBRARY_PREFIX "${webp_libname_prefix}") 170 endif() 171 172 if(NOT WIN32) 173 set(CMAKE_C_VISIBILITY_PRESET hidden) 174 endif() 175 176 if(WEBP_ENABLE_WUNUSED_RESULT) 177 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0) 178 set(CMAKE_C_STANDARD 23) 179 else() 180 unset(CMAKE_C_STANDARD) 181 add_compile_options($<$<COMPILE_LANGUAGE:C>:-std=gnu2x>) 182 endif() 183 add_compile_options(-Wunused-result) 184 add_definitions(-DWEBP_ENABLE_NODISCARD=1) 185 endif() 186 187 # ############################################################################## 188 # Android only. 189 if(ANDROID) 190 include_directories(${ANDROID_NDK}/sources/android/cpufeatures) 191 add_library(cpufeatures-webp STATIC 192 ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) 193 list(APPEND INSTALLED_LIBRARIES cpufeatures-webp) 194 target_link_libraries(cpufeatures-webp dl) 195 set(SHARPYUV_DEP_LIBRARIES ${SHARPYUV_DEP_LIBRARIES} cpufeatures-webp) 196 set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures-webp) 197 set(cpufeatures_include_dir ${ANDROID_NDK}/sources/android/cpufeatures) 198 set(SHARPYUV_DEP_INCLUDE_DIRS ${SHARPYUV_DEP_INCLUDE_DIRS} 199 ${cpufeatures_include_dir}) 200 set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${cpufeatures_include_dir}) 201 add_definitions(-DHAVE_CPU_FEATURES_H=1) 202 set(HAVE_CPU_FEATURES_H 1) 203 else() 204 set(HAVE_CPU_FEATURES_H 0) 205 endif() 206 207 function(configure_pkg_config FILE) 208 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.in" 209 "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" @ONLY) 210 211 if(HAVE_MATH_LIBRARY) 212 # MSVC doesn't have libm 213 file(READ ${CMAKE_CURRENT_BINARY_DIR}/${FILE} data) 214 string(REPLACE "-lm" "" data ${data}) 215 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${FILE} ${data}) 216 endif() 217 218 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" 219 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) 220 endfunction() 221 222 # ############################################################################## 223 # WebP source files. Read the Makefile.am to get the source files. 224 225 # We expect the Makefiles to define the sources as defined in the first regex. 226 # E.g.: libimagedec_la_SOURCES = image_dec.c image_dec.h 227 function(parse_Makefile_am FOLDER VAR SRC_REGEX) 228 file(READ ${FOLDER}/Makefile.am MAKEFILE_AM) 229 string(REGEX MATCHALL "${SRC_REGEX}_SOURCES[ ]*\\+?=[ ]+[0-9a-z\\._ ]*" 230 FILES_PER_LINE ${MAKEFILE_AM}) 231 set(SRCS ${${VAR}}) 232 foreach(FILES ${FILES_PER_LINE}) 233 string(FIND ${FILES} "=" OFFSET) 234 math(EXPR OFFSET "${OFFSET} + 2") 235 string(SUBSTRING ${FILES} ${OFFSET} -1 FILES) 236 if(FILES) 237 string(REGEX MATCHALL "[0-9a-z\\._]+" FILES ${FILES}) 238 foreach(FILE ${FILES}) 239 list(APPEND SRCS ${FOLDER}/${FILE}) 240 endforeach() 241 endif() 242 endforeach() 243 set(${VAR} ${SRCS} PARENT_SCOPE) 244 endfunction() 245 246 set(WEBP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) 247 parse_makefile_am(${WEBP_SRC_DIR}/dec "WEBP_DEC_SRCS" "") 248 parse_makefile_am(${WEBP_SRC_DIR}/demux "WEBP_DEMUX_SRCS" "") 249 parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_COMMON_SRCS" "COMMON") 250 parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "ENC") 251 parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "dsp_[^ ]*") 252 parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_DEC_SRCS" "decode_[^ ]*") 253 parse_makefile_am(${WEBP_SRC_DIR}/enc "WEBP_ENC_SRCS" "") 254 parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_COMMON_SRCS" "COMMON") 255 parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_ENC_SRCS" "ENC") 256 parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_DEC_SRCS" "decode_[^ ]*") 257 258 # Remove the files specific to SIMD we don't use. 259 foreach(FILE ${WEBP_SIMD_FILES_NOT_TO_INCLUDE}) 260 list(REMOVE_ITEM WEBP_DSP_ENC_SRCS ${FILE}) 261 list(REMOVE_ITEM WEBP_DSP_DEC_SRCS ${FILE}) 262 endforeach() 263 264 # Generate the config.h file. 265 configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in 266 ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h @ONLY) 267 add_definitions(-DHAVE_CONFIG_H) 268 269 # Set the version numbers. 270 macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE) 271 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} SOURCE_FILE) 272 string(REGEX MATCH 273 "${NAME_IN_MAKEFILE}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP 274 ${SOURCE_FILE}) 275 string(REGEX MATCH "[0-9:]+" TMP ${TMP}) 276 string(REGEX REPLACE ":" " " LT_VERSION ${TMP}) 277 278 # See the libtool docs for more information: 279 # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info 280 # 281 # c=<current>, a=<age>, r=<revision> 282 # 283 # libtool generates a .so file as .so.[c-a].a.r, while -version-info c:r:a is 284 # passed to libtool. 285 # 286 # We set FULL = [c-a].a.r and MAJOR = [c-a]. 287 separate_arguments(LT_VERSION) 288 list(GET LT_VERSION 0 LT_CURRENT) 289 list(GET LT_VERSION 1 LT_REVISION) 290 list(GET LT_VERSION 2 LT_AGE) 291 math(EXPR LT_CURRENT_MINUS_AGE "${LT_CURRENT} - ${LT_AGE}") 292 293 set_target_properties( 294 ${TARGET_NAME} 295 PROPERTIES VERSION ${LT_CURRENT_MINUS_AGE}.${LT_AGE}.${LT_REVISION} 296 SOVERSION ${LT_CURRENT_MINUS_AGE}) 297 if(APPLE) 298 # For compatibility, set MACHO_COMPATIBILITY_VERSION and 299 # MACHO_CURRENT_VERSION to match libtool. These properties were introduced 300 # in 3.17: 301 # https://cmake.org/cmake/help/latest/prop_tgt/MACHO_COMPATIBILITY_VERSION.html 302 math(EXPR LIBWEBP_MACHO_COMPATIBILITY_VERSION "${LT_CURRENT} + 1") 303 set_target_properties( 304 ${TARGET_NAME} 305 PROPERTIES MACHO_COMPATIBILITY_VERSION 306 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION} 307 MACHO_CURRENT_VERSION 308 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}.${LT_REVISION}) 309 endif() 310 endmacro() 311 312 # ############################################################################## 313 # Build the webpdecoder library. 314 315 # Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and 316 # adds it to the specified target. Currently used only with Xcode. 317 # 318 # See also: 319 # https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries 320 # "Some native build systems (such as Xcode) may not like targets that have only 321 # object files, so consider adding at least one real source file to any target 322 # that references $<TARGET_OBJECTS:objlib>." 323 function(libwebp_add_stub_file TARGET) 324 set(stub_source_dir "${CMAKE_BINARY_DIR}") 325 set(stub_source_file "${stub_source_dir}/libwebp_${TARGET}_stub.c") 326 set(stub_source_code 327 "// Generated file. DO NOT EDIT!\n" 328 "// C source file created for target ${TARGET}.\n" 329 "void libwebp_${TARGET}_stub_function(void)\;\n" 330 "void libwebp_${TARGET}_stub_function(void) {}\n") 331 file(WRITE "${stub_source_file}" ${stub_source_code}) 332 333 target_sources(${TARGET} PRIVATE ${stub_source_file}) 334 endfunction() 335 336 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" "") 337 add_library(sharpyuv ${WEBP_SHARPYUV_SRCS}) 338 target_link_libraries(sharpyuv ${SHARPYUV_DEP_LIBRARIES}) 339 set_version(sharpyuv/Makefile.am sharpyuv sharpyuv) 340 target_include_directories( 341 sharpyuv PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 342 ${CMAKE_CURRENT_SOURCE_DIR}/src) 343 set_target_properties( 344 sharpyuv 345 PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\ 346 ${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h") 347 configure_pkg_config("sharpyuv/libsharpyuv.pc") 348 install( 349 TARGETS sharpyuv 350 EXPORT ${PROJECT_NAME}Targets 351 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp/sharpyuv 352 INCLUDES 353 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 354 ${CMAKE_INSTALL_INCLUDEDIR}/webp 355 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 356 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 357 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 358 359 if(MSVC) 360 # avoid security warnings for e.g., fopen() used in the examples. 361 add_definitions(-D_CRT_SECURE_NO_WARNINGS) 362 else() 363 add_compile_options(-Wall) 364 endif() 365 include_directories(${WEBP_DEP_INCLUDE_DIRS}) 366 add_library(webpdecode OBJECT ${WEBP_DEC_SRCS}) 367 target_include_directories(webpdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 368 ${CMAKE_CURRENT_SOURCE_DIR}) 369 add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}) 370 target_include_directories(webpdspdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 371 ${CMAKE_CURRENT_SOURCE_DIR}) 372 add_library(webputilsdecode OBJECT ${WEBP_UTILS_COMMON_SRCS} 373 ${WEBP_UTILS_DEC_SRCS}) 374 target_include_directories(webputilsdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 375 ${CMAKE_CURRENT_SOURCE_DIR}) 376 add_library( 377 webpdecoder $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdspdecode> 378 $<TARGET_OBJECTS:webputilsdecode>) 379 if(XCODE) 380 libwebp_add_stub_file(webpdecoder) 381 endif() 382 target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES}) 383 target_include_directories( 384 webpdecoder 385 PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 386 INTERFACE 387 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}>" 388 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) 389 set_target_properties( 390 webpdecoder 391 PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ 392 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") 393 394 configure_pkg_config("src/libwebpdecoder.pc") 395 396 # Build the webp library. 397 add_library(webpencode OBJECT ${WEBP_ENC_SRCS}) 398 target_include_directories( 399 webpencode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 400 ${CMAKE_CURRENT_SOURCE_DIR}/src) 401 add_library(webpdsp OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS} 402 ${WEBP_DSP_ENC_SRCS}) 403 target_include_directories(webpdsp PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 404 ${CMAKE_CURRENT_SOURCE_DIR}) 405 add_library(webputils OBJECT ${WEBP_UTILS_COMMON_SRCS} ${WEBP_UTILS_DEC_SRCS} 406 ${WEBP_UTILS_ENC_SRCS}) 407 target_include_directories(webputils PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 408 ${CMAKE_CURRENT_SOURCE_DIR}) 409 add_library(webp $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdsp> 410 $<TARGET_OBJECTS:webpencode> $<TARGET_OBJECTS:webputils>) 411 target_link_libraries(webp sharpyuv) 412 if(XCODE) 413 libwebp_add_stub_file(webp) 414 endif() 415 target_link_libraries(webp ${WEBP_DEP_LIBRARIES}) 416 target_include_directories( 417 webp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} 418 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> 419 $<INSTALL_INTERFACE:include>) 420 set_target_properties( 421 webp 422 PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ 423 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\ 424 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") 425 426 # Make sure the OBJECT libraries are built with position independent code (it is 427 # not ON by default). 428 set_target_properties(webpdecode webpdspdecode webputilsdecode webpencode 429 webpdsp webputils PROPERTIES POSITION_INDEPENDENT_CODE ON) 430 configure_pkg_config("src/libwebp.pc") 431 432 # Build the webp demux library. 433 add_library(webpdemux ${WEBP_DEMUX_SRCS}) 434 target_link_libraries(webpdemux webp) 435 target_include_directories( 436 webpdemux PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} 437 PUBLIC $<INSTALL_INTERFACE:include>) 438 set_target_properties( 439 webpdemux 440 PROPERTIES 441 PUBLIC_HEADER 442 "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ 443 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\ 444 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ 445 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") 446 447 configure_pkg_config("src/demux/libwebpdemux.pc") 448 449 set_version(src/Makefile.am webp webp) 450 set_version(src/Makefile.am webpdecoder webpdecoder) 451 set_version(src/demux/Makefile.am webpdemux webpdemux) 452 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_FILE) 453 string(REGEX MATCH "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]" TMP ${CONFIGURE_FILE}) 454 string(REGEX MATCH "[0-9\\.]+" PROJECT_VERSION ${TMP}) 455 456 # Define the libraries to install. 457 list(APPEND INSTALLED_LIBRARIES webpdecoder webp webpdemux) 458 459 # Deal with SIMD. Change the compile flags for SIMD files we use. 460 list(LENGTH WEBP_SIMD_FILES_TO_INCLUDE WEBP_SIMD_FILES_TO_INCLUDE_LENGTH) 461 math(EXPR WEBP_SIMD_FILES_TO_INCLUDE_RANGE 462 "${WEBP_SIMD_FILES_TO_INCLUDE_LENGTH}-1") 463 464 foreach(I_FILE RANGE ${WEBP_SIMD_FILES_TO_INCLUDE_RANGE}) 465 list(GET WEBP_SIMD_FILES_TO_INCLUDE ${I_FILE} FILE) 466 list(GET WEBP_SIMD_FLAGS_TO_INCLUDE ${I_FILE} SIMD_COMPILE_FLAG) 467 set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS 468 ${SIMD_COMPILE_FLAG}) 469 endforeach() 470 471 if(NOT WEBP_BUILD_LIBWEBPMUX) 472 set(WEBP_BUILD_GIF2WEBP OFF) 473 set(WEBP_BUILD_IMG2WEBP OFF) 474 set(WEBP_BUILD_WEBPMUX OFF) 475 endif() 476 477 if(WEBP_BUILD_GIF2WEBP AND NOT GIF_FOUND) 478 set(WEBP_BUILD_GIF2WEBP OFF) 479 endif() 480 481 if(WEBP_BUILD_ANIM_UTILS AND NOT GIF_FOUND) 482 set(WEBP_BUILD_ANIM_UTILS OFF) 483 endif() 484 485 # Build the executables if asked for. 486 if(WEBP_BUILD_ANIM_UTILS 487 OR WEBP_BUILD_CWEBP 488 OR WEBP_BUILD_DWEBP 489 OR WEBP_BUILD_EXTRAS 490 OR WEBP_BUILD_FUZZTEST 491 OR WEBP_BUILD_GIF2WEBP 492 OR WEBP_BUILD_IMG2WEBP 493 OR WEBP_BUILD_VWEBP 494 OR WEBP_BUILD_WEBPMUX 495 OR WEBP_BUILD_WEBPINFO) 496 # Example utility library. 497 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS" 498 "example_util_[^ ]*") 499 list(APPEND EXAMPLEUTIL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h) 500 add_library(exampleutil STATIC ${EXAMPLEUTIL_SRCS}) 501 target_include_directories( 502 exampleutil PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>) 503 504 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEIOUTILS_SRCS" 505 "imageio_util_[^ ]*") 506 add_library(imageioutil STATIC ${IMAGEIOUTILS_SRCS}) 507 target_link_libraries(imageioutil webp) 508 target_link_libraries(exampleutil imageioutil) 509 510 # Image-decoding utility library. 511 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEDEC_SRCS" 512 "imagedec_[^ ]*") 513 add_library(imagedec STATIC ${IMAGEDEC_SRCS}) 514 target_link_libraries(imagedec imageioutil webpdemux webp 515 ${WEBP_DEP_IMG_LIBRARIES}) 516 517 # Image-encoding utility library. 518 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEENC_SRCS" 519 "imageenc_[^ ]*") 520 add_library(imageenc STATIC ${IMAGEENC_SRCS}) 521 target_link_libraries(imageenc imageioutil webp) 522 523 set_property( 524 TARGET exampleutil imageioutil imagedec imageenc 525 PROPERTY INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src 526 ${CMAKE_CURRENT_BINARY_DIR}/src) 527 target_include_directories(imagedec PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS}) 528 target_include_directories(imageenc PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS}) 529 endif() 530 531 if(WEBP_BUILD_DWEBP) 532 # dwebp 533 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "DWEBP_SRCS" "dwebp") 534 add_executable(dwebp ${DWEBP_SRCS}) 535 target_link_libraries(dwebp exampleutil imagedec imageenc) 536 target_include_directories(dwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) 537 install(TARGETS dwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 538 endif() 539 540 if(WEBP_BUILD_CWEBP) 541 # cwebp 542 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "CWEBP_SRCS" "cwebp") 543 add_executable(cwebp ${CWEBP_SRCS}) 544 target_link_libraries(cwebp exampleutil imagedec webp) 545 target_include_directories(cwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src 546 ${CMAKE_CURRENT_SOURCE_DIR}) 547 install(TARGETS cwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 548 endif() 549 550 if(WEBP_BUILD_LIBWEBPMUX) 551 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "WEBP_MUX_SRCS" "") 552 add_library(libwebpmux ${WEBP_MUX_SRCS}) 553 target_link_libraries(libwebpmux webp) 554 target_include_directories(libwebpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 555 ${CMAKE_CURRENT_SOURCE_DIR}) 556 set_version(src/mux/Makefile.am libwebpmux webpmux) 557 set_target_properties( 558 libwebpmux 559 PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h;\ 560 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ 561 ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h;") 562 set_target_properties(libwebpmux PROPERTIES OUTPUT_NAME webpmux) 563 list(APPEND INSTALLED_LIBRARIES libwebpmux) 564 configure_pkg_config("src/mux/libwebpmux.pc") 565 endif() 566 567 if(WEBP_BUILD_GIF2WEBP) 568 # gif2webp 569 include_directories(${WEBP_DEP_GIF_INCLUDE_DIRS}) 570 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "GIF2WEBP_SRCS" 571 "gif2webp") 572 add_executable(gif2webp ${GIF2WEBP_SRCS}) 573 target_link_libraries(gif2webp exampleutil imageioutil webp libwebpmux 574 ${WEBP_DEP_GIF_LIBRARIES}) 575 target_include_directories(gif2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src 576 ${CMAKE_CURRENT_SOURCE_DIR}) 577 install(TARGETS gif2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 578 endif() 579 580 if(WEBP_BUILD_IMG2WEBP) 581 # img2webp 582 include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) 583 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "IMG2WEBP_SRCS" 584 "img2webp") 585 add_executable(img2webp ${IMG2WEBP_SRCS}) 586 target_link_libraries(img2webp exampleutil imagedec imageioutil webp 587 libwebpmux) 588 target_include_directories(img2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src 589 ${CMAKE_CURRENT_SOURCE_DIR}) 590 install(TARGETS img2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 591 endif() 592 593 if(WEBP_BUILD_VWEBP) 594 # vwebp 595 find_package(GLUT) 596 if(GLUT_FOUND) 597 include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) 598 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "VWEBP_SRCS" "vwebp") 599 add_executable(vwebp ${VWEBP_SRCS}) 600 target_link_libraries( 601 vwebp 602 ${OPENGL_LIBRARIES} 603 exampleutil 604 GLUT::GLUT 605 imageioutil 606 webp 607 webpdemux) 608 target_include_directories( 609 vwebp PRIVATE ${GLUT_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src 610 ${OPENGL_INCLUDE_DIR}) 611 install(TARGETS vwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 612 if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") 613 check_c_compiler_flag("-Wno-deprecated-declarations" HAS_NO_DEPRECATED) 614 if(HAS_NO_DEPRECATED) 615 target_compile_options(vwebp PRIVATE "-Wno-deprecated-declarations") 616 endif() 617 endif() 618 endif() 619 endif() 620 621 if(WEBP_BUILD_WEBPINFO) 622 # webpinfo 623 include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) 624 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPINFO_SRCS" 625 "webpinfo") 626 add_executable(webpinfo ${WEBPINFO_SRCS}) 627 target_link_libraries(webpinfo exampleutil imageioutil) 628 target_include_directories(webpinfo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src 629 ${CMAKE_CURRENT_SOURCE_DIR}/src) 630 install(TARGETS webpinfo RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 631 endif() 632 633 if(WEBP_BUILD_WEBPMUX) 634 # webpmux 635 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPMUX_SRCS" 636 "webpmux") 637 add_executable(webpmux ${WEBPMUX_SRCS}) 638 target_link_libraries(webpmux exampleutil imageioutil libwebpmux webp) 639 target_include_directories(webpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) 640 install(TARGETS webpmux RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 641 endif() 642 643 if(WEBP_BUILD_EXTRAS) 644 set(EXTRAS_MAKEFILE "${CMAKE_CURRENT_SOURCE_DIR}/extras") 645 parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_EXTRAS_SRCS" "libwebpextras_la") 646 parse_makefile_am(${EXTRAS_MAKEFILE} "GET_DISTO_SRCS" "get_disto") 647 parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_QUALITY_SRCS" "webp_quality") 648 parse_makefile_am(${EXTRAS_MAKEFILE} "VWEBP_SDL_SRCS" "vwebp_sdl") 649 650 # libextras 651 add_library(extras STATIC ${WEBP_EXTRAS_SRCS}) 652 target_include_directories( 653 extras PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 654 ${CMAKE_CURRENT_SOURCE_DIR}/src) 655 656 # get_disto 657 add_executable(get_disto ${GET_DISTO_SRCS}) 658 target_link_libraries(get_disto imagedec) 659 target_include_directories(get_disto PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} 660 ${CMAKE_CURRENT_BINARY_DIR}/src) 661 662 # webp_quality 663 add_executable(webp_quality ${WEBP_QUALITY_SRCS}) 664 target_link_libraries(webp_quality exampleutil imagedec extras) 665 target_include_directories(webp_quality PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} 666 ${CMAKE_CURRENT_BINARY_DIR}) 667 668 # vwebp_sdl 669 find_package(SDL2 QUIET) 670 if(WEBP_BUILD_VWEBP AND SDL2_FOUND) 671 add_executable(vwebp_sdl ${VWEBP_SDL_SRCS}) 672 target_link_libraries(vwebp_sdl ${SDL2_LIBRARIES} imageioutil webp) 673 target_include_directories( 674 vwebp_sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} 675 ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL2_INCLUDE_DIRS}) 676 set(WEBP_HAVE_SDL 1) 677 target_compile_definitions(vwebp_sdl PUBLIC WEBP_HAVE_SDL) 678 679 set(CMAKE_REQUIRED_INCLUDES "${SDL2_INCLUDE_DIRS}") 680 check_c_source_compiles( 681 " 682 #define SDL_MAIN_HANDLED 683 #include \"SDL.h\" 684 int main(void) { 685 return 0; 686 } 687 " 688 HAVE_JUST_SDL_H) 689 set(CMAKE_REQUIRED_INCLUDES) 690 if(HAVE_JUST_SDL_H) 691 target_compile_definitions(vwebp_sdl PRIVATE WEBP_HAVE_JUST_SDL_H) 692 endif() 693 endif() 694 endif() 695 696 if(WEBP_BUILD_WEBP_JS) 697 # The default stack size changed from 5MB to 64KB in 3.1.27. See 698 # https://crbug.com/webp/614. 699 if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.27") 700 # TOTAL_STACK size was renamed to STACK_SIZE in 3.1.27. The old name was 701 # kept for compatibility, but prefer the new one in case it is removed in 702 # the future. 703 set(emscripten_stack_size "-sSTACK_SIZE=5MB") 704 else() 705 set(emscripten_stack_size "-sTOTAL_STACK=5MB") 706 endif() 707 find_package(SDL2 REQUIRED) 708 # wasm2js does not support SIMD. 709 if(NOT WEBP_ENABLE_SIMD) 710 # JavaScript version 711 add_executable(webp_js ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c) 712 target_link_libraries(webp_js webpdecoder SDL2) 713 target_include_directories(webp_js PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 714 set(WEBP_HAVE_SDL 1) 715 set_target_properties( 716 webp_js 717 PROPERTIES 718 # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at 719 # compile time to ensure the headers are downloaded. 720 COMPILE_OPTIONS "${SDL2_LIBRARIES}" 721 LINK_FLAGS 722 "-sWASM=0 ${emscripten_stack_size} \ 723 -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \ 724 -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \ 725 -sALLOW_MEMORY_GROWTH") 726 set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp) 727 target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL) 728 endif() 729 730 # WASM version 731 add_executable(webp_wasm ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c) 732 target_link_libraries(webp_wasm webpdecoder SDL2) 733 target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 734 set_target_properties( 735 webp_wasm 736 PROPERTIES 737 # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at 738 # compile time to ensure the headers are downloaded. 739 COMPILE_OPTIONS "${SDL2_LIBRARIES}" 740 LINK_FLAGS 741 "-sWASM=1 ${emscripten_stack_size} \ 742 -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \ 743 -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \ 744 -sALLOW_MEMORY_GROWTH") 745 target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL) 746 747 target_compile_definitions(webpdspdecode PUBLIC EMSCRIPTEN) 748 endif() 749 750 if(WEBP_BUILD_ANIM_UTILS) 751 # anim_diff 752 include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS}) 753 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DIFF_SRCS" 754 "anim_diff") 755 add_executable(anim_diff ${ANIM_DIFF_SRCS}) 756 target_link_libraries( 757 anim_diff 758 exampleutil 759 imagedec 760 imageenc 761 imageioutil 762 webp 763 webpdemux 764 ${WEBP_DEP_GIF_LIBRARIES}) 765 target_include_directories(anim_diff PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) 766 767 # anim_dump 768 include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS}) 769 parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DUMP_SRCS" 770 "anim_dump") 771 add_executable(anim_dump ${ANIM_DUMP_SRCS}) 772 target_link_libraries( 773 anim_dump 774 exampleutil 775 imagedec 776 imageenc 777 imageioutil 778 webp 779 webpdemux 780 ${WEBP_DEP_GIF_LIBRARIES}) 781 target_include_directories(anim_dump PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) 782 endif() 783 784 if(WEBP_BUILD_FUZZTEST) 785 add_subdirectory(tests/fuzzer) 786 endif() 787 788 # Install the different headers and libraries. 789 install( 790 TARGETS ${INSTALLED_LIBRARIES} 791 EXPORT ${PROJECT_NAME}Targets 792 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp 793 INCLUDES 794 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 795 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 796 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 797 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 798 set(ConfigPackageLocation ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/cmake/) 799 install(EXPORT ${PROJECT_NAME}Targets NAMESPACE ${PROJECT_NAME}:: 800 DESTINATION ${ConfigPackageLocation}) 801 802 # Create the CMake version file. 803 include(CMakePackageConfigHelpers) 804 write_basic_package_version_file( 805 "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake" 806 VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion) 807 808 # Create the Config file. 809 include(CMakePackageConfigHelpers) 810 # Fix libwebpmux reference. The target name libwebpmux is used for compatibility 811 # purposes, but the library mentioned in WebPConfig.cmake should be the 812 # unprefixed version. Note string(...) can be replaced with list(TRANSFORM ...) 813 # if cmake_minimum_required is >= 3.12. 814 string(REGEX REPLACE "libwebpmux" "webpmux" INSTALLED_LIBRARIES 815 "${INSTALLED_LIBRARIES}") 816 817 if(MSVC) 818 # For compatibility with nmake, MSVC builds use a custom prefix (lib) that 819 # needs to be included in the library name. 820 string(REGEX REPLACE "[A-Za-z0-9_]+" "${CMAKE_STATIC_LIBRARY_PREFIX}\\0" 821 INSTALLED_LIBRARIES "${INSTALLED_LIBRARIES}") 822 endif() 823 824 configure_package_config_file( 825 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/WebPConfig.cmake.in 826 ${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake 827 INSTALL_DESTINATION ${ConfigPackageLocation} 828 PATH_VARS CMAKE_INSTALL_INCLUDEDIR) 829 830 # Install the generated CMake files. 831 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake" 832 "${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake" 833 DESTINATION ${ConfigPackageLocation}) 834 835 # Install the man pages. 836 set(MAN_PAGES 837 cwebp.1 838 dwebp.1 839 gif2webp.1 840 img2webp.1 841 vwebp.1 842 webpmux.1 843 webpinfo.1) 844 set(EXEC_BUILDS 845 "CWEBP" 846 "DWEBP" 847 "GIF2WEBP" 848 "IMG2WEBP" 849 "VWEBP" 850 "WEBPMUX" 851 "WEBPINFO") 852 list(LENGTH MAN_PAGES MAN_PAGES_LENGTH) 853 math(EXPR MAN_PAGES_RANGE "${MAN_PAGES_LENGTH} - 1") 854 855 foreach(I_MAN RANGE ${MAN_PAGES_RANGE}) 856 list(GET EXEC_BUILDS ${I_MAN} EXEC_BUILD) 857 if(WEBP_BUILD_${EXEC_BUILD}) 858 list(GET MAN_PAGES ${I_MAN} MAN_PAGE) 859 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man/${MAN_PAGE} 860 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) 861 endif() 862 endforeach()