1# 2# Copyright (C) 2023 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); you may not 5# use this file except in compliance with the License. You may obtain a copy of 6# the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13# License for the specific language governing permissions and limitations under 14# the License. 15# 16 17cmake_minimum_required(VERSION 3.15) 18 19# CMP0091: MSVC runtime library flags are selected by an abstraction. 20# New in CMake 3.15. https://cmake.org/cmake/help/latest/policy/CMP0091.html 21if(POLICY CMP0091) 22 cmake_policy(SET CMP0091 OLD) 23endif() 24 25set(UHDR_MAJOR_VERSION 1) 26set(UHDR_MINOR_VERSION 3) 27set(UHDR_PATCH_VERSION 0) 28project(libuhdr 29 VERSION ${UHDR_MAJOR_VERSION}.${UHDR_MINOR_VERSION}.${UHDR_PATCH_VERSION} 30 LANGUAGES C CXX 31 DESCRIPTION "Library for encoding and decoding ultrahdr images") 32 33########################################################### 34# Detect system 35########################################################### 36if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 37elseif(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten") 38elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android") 39elseif(WIN32) 40elseif(APPLE) 41else() 42 message(FATAL_ERROR "Platform ${CMAKE_SYSTEM_NAME} not recognized") 43endif() 44 45if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") 46 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 47 set(ARCH "amd64") 48 else() 49 set(ARCH "i386") 50 endif() 51elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*") 52 set(ARCH "i386") 53elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)") 54 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 55 set(ARCH "aarch64") 56 else() 57 set(ARCH "arm") 58 endif() 59elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)") 60 set(ARCH "arm") 61elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv64") 62 set(ARCH "riscv64") 63elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv32") 64 set(ARCH "riscv32") 65elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^loongarch64") 66 set(ARCH "loong64") 67else() 68 message(FATAL_ERROR "Architecture: ${CMAKE_SYSTEM_PROCESSOR} not recognized") 69endif() 70 71########################################################### 72# Directories 73########################################################### 74set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) 75set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party) 76set(JAVA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/java) 77set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests) 78set(BENCHMARK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benchmark) 79set(FUZZERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/fuzzer) 80set(EXAMPLES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples) 81set(EXPORT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 82 83if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) 84 message(WARNING "Selected in-source build. Preferably, create a build/ directory and build from there.") 85endif() 86 87########################################################### 88# Options 89########################################################### 90get_cmake_property(IS_MULTI GENERATOR_IS_MULTI_CONFIG) 91if(NOT IS_MULTI) 92 if(NOT CMAKE_BUILD_TYPE) 93 message(STATUS "No build type chosen, selecting Release") 94 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release MinSizeRel RelWithDebInfo." FORCE) 95 endif() 96endif() 97 98if(EMSCRIPTEN) 99 # platform does not support dynamic linking? 100 message(STATUS "For wasm targets, selecting static only builds") 101 option(BUILD_SHARED_LIBS "Build shared libraries" FALSE) 102elseif(NOT DEFINED BUILD_SHARED_LIBS) 103 message(STATUS "No target type chosen, selecting Shared") 104 option(BUILD_SHARED_LIBS "Build shared libraries" TRUE) 105endif() 106 107function(option_if_not_defined name description default) 108 if(NOT DEFINED ${name}) 109 option(${name} ${description} ${default}) 110 endif() 111endfunction() 112 113option_if_not_defined(UHDR_BUILD_EXAMPLES "Build sample application " TRUE) 114option_if_not_defined(UHDR_BUILD_TESTS "Build unit tests " FALSE) 115option_if_not_defined(UHDR_BUILD_BENCHMARK "Build benchmark tests " FALSE) 116option_if_not_defined(UHDR_BUILD_FUZZERS "Build fuzz test applications " FALSE) 117option_if_not_defined(UHDR_BUILD_DEPS "Build deps and not use pre-installed packages " FALSE) 118option_if_not_defined(UHDR_BUILD_JAVA "Build JNI wrapper and Java front-end classes " FALSE) 119option_if_not_defined(UHDR_BUILD_PACKAGING "Build distribution packages using CPack " FALSE) 120 121option_if_not_defined(UHDR_ENABLE_LOGS "Build with verbose logging " FALSE) 122option_if_not_defined(UHDR_ENABLE_INSTALL "Enable install and uninstall targets for libuhdr package " TRUE) 123option_if_not_defined(UHDR_ENABLE_INTRINSICS "Build with SIMD acceleration " TRUE) 124option_if_not_defined(UHDR_ENABLE_GLES "Build with GPU acceleration " FALSE) 125option_if_not_defined(UHDR_ENABLE_WERROR "Build with -Werror" FALSE) 126 127# pre-requisites 128if(UHDR_BUILD_TESTS AND EMSCRIPTEN) 129 message(FATAL_ERROR "Building tests not supported for wasm targets") 130endif() 131 132if(UHDR_BUILD_BENCHMARK AND WIN32) 133 message(FATAL_ERROR "Building benchmarks not supported in Windows") 134endif() 135 136if(UHDR_BUILD_BENCHMARK AND EMSCRIPTEN) 137 message(FATAL_ERROR "Building benchmarks not supported for wasm targets") 138endif() 139 140# side effects 141if(CMAKE_CROSSCOMPILING AND UHDR_ENABLE_INSTALL) 142 set(UHDR_ENABLE_INSTALL FALSE) # disable install and uninstall targets during cross compilation. 143 message(STATUS "Install and uninstall targets - Disabled") 144endif() 145 146if(UHDR_BUILD_FUZZERS AND NOT UHDR_BUILD_DEPS) 147 set(UHDR_BUILD_DEPS TRUE) # For fuzz testing its best to build all dependencies from source. 148 # This is to instrument dependency libs as well. 149 message(STATUS "Building dependencies from source - Enabled") 150endif() 151 152if(DEFINED UHDR_SANITIZE_OPTIONS AND NOT UHDR_BUILD_DEPS) 153 set(UHDR_BUILD_DEPS TRUE) # If sanitize options are enabled, its best to build all dependencies from source. 154 # This is to instrument dependency libs as well. 155 message(STATUS "Building dependencies from source - Enabled") 156endif() 157 158if(UHDR_BUILD_DEPS AND UHDR_ENABLE_INSTALL) 159 set(UHDR_ENABLE_INSTALL FALSE) # If dependencies are not chosen from installed packages but are built 160 # from source, its best to disallow system wide installation of 161 # uhdr to avoid possible abi/api conflicts. 162 message(STATUS "Install and uninstall targets - Disabled") 163endif() 164 165########################################################### 166# Compile flags 167########################################################### 168set(CMAKE_CXX_STANDARD 17) 169set(CMAKE_CXX_STANDARD_REQUIRED ON) 170set(CMAKE_CXX_EXTENSIONS OFF) 171if(BUILD_SHARED_LIBS) 172 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 173 set(CMAKE_CXX_VISIBILITY_PRESET hidden) 174 set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) 175 set(UHDR_ENABLE_STATIC_LINKING OFF) 176 add_compile_options(-DUHDR_BUILDING_SHARED_LIBRARY) 177else() 178 if(WIN32) 179 set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a) 180 else() 181 set(CMAKE_FIND_LIBRARY_SUFFIXES .a) 182 endif() 183 if(APPLE) 184 message(STATUS "Apple does not support statically linking an entire executable, disabling '-static' option") 185 set(UHDR_ENABLE_STATIC_LINKING OFF) 186 elseif(DEFINED UHDR_SANITIZE_OPTIONS OR UHDR_BUILD_FUZZERS) 187 message(STATUS "Possible that sanitizer libraries are only DSO's, disabling '-static' option") 188 set(UHDR_ENABLE_STATIC_LINKING OFF) 189 elseif(MSVC) 190 message(STATUS "Disabling '-static' option in MSVC platforms") 191 set(UHDR_ENABLE_STATIC_LINKING OFF) 192 else() 193 set(UHDR_ENABLE_STATIC_LINKING ON) 194 endif() 195endif() 196if(UHDR_ENABLE_LOGS) 197 add_compile_options(-DLOG_NDEBUG) 198endif() 199if(UHDR_ENABLE_INTRINSICS) 200 add_compile_options(-DUHDR_ENABLE_INTRINSICS) 201endif() 202 203include(CheckCXXCompilerFlag) 204function(CheckCompilerOption opt res) 205 set(CMAKE_REQUIRED_FLAGS ${opt}) 206 check_cxx_compiler_flag(${opt} ${res}) 207 unset(CMAKE_REQUIRED_FLAGS) 208 if(NOT ${res}) 209 message(FATAL_ERROR "Unsupported compiler option(s) ${opt}") 210 endif() 211endfunction(CheckCompilerOption) 212 213if(DEFINED UHDR_SANITIZE_OPTIONS) 214 CheckCompilerOption("-fsanitize=${UHDR_SANITIZE_OPTIONS}" SUPPORTS_SAN_OPTIONS) 215 add_compile_options(-fsanitize=${UHDR_SANITIZE_OPTIONS}) 216 add_link_options(-fsanitize=${UHDR_SANITIZE_OPTIONS}) 217endif() 218 219if(UHDR_BUILD_FUZZERS) 220 CheckCompilerOption("-fsanitize=fuzzer-no-link" fuzz) 221 add_compile_options(-fsanitize=fuzzer-no-link) 222endif() 223 224set(UHDR_WERROR_FLAGS "") 225if(MSVC) 226 add_definitions(-D_CRT_SECURE_NO_WARNINGS) 227 # Disable specific warnings 228 # TODO: None of these should be disabled, but for now, for a warning-free msvc build these are 229 # added. fix the warnings and remove these filters 230 add_compile_options(/wd4244) # conversion from 'type1' to 'type2', possible loss of data 231 add_compile_options(/wd4267) # conversion from 'size_t' to 'type' possible loss of data 232 add_compile_options(/wd4305) # truncation from 'double' to 'float' 233 add_compile_options(/wd4838) # conversion from 'type1' to 'type2' requires a narrowing conversion 234 add_compile_options(/wd26812) # Prefer enum class over enum 235elseif(EMSCRIPTEN) 236 if(NOT UHDR_BUILD_DEPS) 237 include(CheckCSourceCompiles) 238 set(CMAKE_REQUIRED_FLAGS "--use-port=libjpeg") 239 set(CMAKE_REQUIRED_LINK_OPTIONS "--use-port=libjpeg") 240 check_c_source_compiles([=[ 241 #include <stdio.h> 242 #include <jpeglib.h> 243 int main(void) { 244 struct jpeg_compress_struct cinfo; 245 struct jpeg_error_mgr jerr; 246 cinfo.err=jpeg_std_error(&jerr); 247 jpeg_create_compress(&cinfo); 248 jpeg_destroy_compress(&cinfo); 249 return 0; 250 } 251 ]=] HAVE_JPEG) 252 if(NOT HAVE_JPEG) 253 message(FATAL_ERROR "Could NOT compile with --use-port=libjpeg, resolve this \ 254 or try 'cmake -DUHDR_BUILD_DEPS=1'") 255 endif() 256 endif() 257else() 258 add_compile_options(-ffunction-sections) 259 add_compile_options(-fdata-sections) 260 add_compile_options(-fomit-frame-pointer) 261 add_compile_options(-ffp-contract=fast) 262 if(ARCH STREQUAL "i386") 263 add_compile_options(-m32) 264 add_compile_options(-march=i386) 265 add_compile_options(-mtune=generic) 266 elseif(ARCH STREQUAL "amd64") 267 add_compile_options(-m64) 268 add_compile_options(-march=x86-64) 269 add_compile_options(-mtune=generic) 270 elseif(ARCH STREQUAL "arm") 271 add_compile_options(-march=armv7-a) 272 add_compile_options(-marm) 273 if(NOT ANDROID_ABI) 274 add_compile_options(-mfloat-abi=hard) 275 endif() 276 add_compile_options(-mfpu=neon-vfpv3) 277 add_compile_options(-fno-lax-vector-conversions) 278 elseif(ARCH STREQUAL "aarch64") 279 add_compile_options(-march=armv8-a) 280 add_compile_options(-fno-lax-vector-conversions) 281 elseif(ARCH STREQUAL "riscv64") 282 add_compile_options(-march=rv64gc) 283 add_compile_options(-mabi=lp64d) 284 elseif(ARCH STREQUAL "riscv32") 285 add_compile_options(-march=rv32gc) 286 add_compile_options(-mabi=ilp32d) 287 elseif(ARCH STREQUAL "loong64") 288 add_compile_options(-march=loongarch64) 289 add_compile_options(-mabi=lp64d) 290 endif() 291 292 if(UHDR_ENABLE_WERROR) 293 CheckCompilerOption("-Werror" SUPPORTS_WERROR) 294 set(UHDR_WERROR_FLAGS "-Werror") 295 endif() 296endif() 297 298########################################################### 299# Utils 300########################################################### 301# copied from https://github.com/google/shaderc/blob/main/cmake/utils.cmake 302macro(get_transitive_static_libs target out_list) 303 if(TARGET ${target}) 304 get_target_property(target_type ${target} TYPE) 305 if(target_type STREQUAL "STATIC_LIBRARY") 306 list(INSERT ${out_list} 0 ${target}) 307 get_target_property(libs ${target} LINK_LIBRARIES) 308 if(libs) 309 foreach(lib ${libs}) 310 get_transitive_static_libs(${lib} ${out_list}) 311 endforeach() 312 endif() 313 endif() 314 endif() 315endmacro() 316 317# combine a list of static libraries in to a single library 318function(combine_static_libs target output_target) 319 set(all_libs_list "") 320 get_transitive_static_libs(${target} all_libs_list) 321 foreach(lib IN LISTS all_libs_list) 322 target_sources(${output_target} PRIVATE $<TARGET_OBJECTS:${lib}>) 323 endforeach() 324endfunction() 325 326########################################################### 327# Dependencies 328########################################################### 329list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 330 331if(${CMAKE_SYSTEM_NAME} MATCHES "Android") 332 if (UHDR_ENABLE_LOGS) 333 find_library(log-lib log QUIET) 334 if(NOT log-lib) 335 message(FATAL_ERROR "Could NOT find log library, retry after installing \ 336 log library at sysroot or try 'cmake -DUHDR_ENABLE_LOGS=0'") 337 else() 338 message(STATUS "Found log-lib: ${log-lib}") 339 endif() 340 endif() 341endif() 342 343# Threads 344set(CMAKE_THREAD_PREFER_PTHREAD ON) 345set(THREADS_PREFER_PTHREAD_FLAG ON) 346find_package(Threads REQUIRED) 347 348include(ExternalProject) 349 350get_directory_property(UHDR_COMPILE_FLAGS COMPILE_OPTIONS) 351string (REPLACE ";" " " UHDR_COMPILE_FLAGS_STR "${UHDR_COMPILE_FLAGS}") 352set(UHDR_CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${UHDR_COMPILE_FLAGS_STR}") 353set(UHDR_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${UHDR_COMPILE_FLAGS_STR}") 354set(UHDR_CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}) 355list(APPEND UHDR_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) 356list(APPEND UHDR_CMAKE_ARGS -DCMAKE_C_FLAGS=${UHDR_CMAKE_C_FLAGS}) 357list(APPEND UHDR_CMAKE_ARGS -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}) 358list(APPEND UHDR_CMAKE_ARGS -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}) 359list(APPEND UHDR_CMAKE_ARGS -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}) 360list(APPEND UHDR_CMAKE_ARGS -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}) 361list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}) 362list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_FLAGS=${UHDR_CMAKE_CXX_FLAGS}) 363list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}) 364list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}) 365list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL}) 366list(APPEND UHDR_CMAKE_ARGS -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) 367if(BUILD_SHARED_LIBS) 368 list(APPEND UHDR_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON) 369endif() 370if(MSVC AND UHDR_BUILD_TESTS) 371 list(APPEND UHDR_CMAKE_ARGS "-Dgtest_force_shared_crt=ON") 372endif() 373if(DEFINED CMAKE_TOOLCHAIN_FILE) 374 list(APPEND UHDR_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE}) 375endif() 376if(DEFINED ANDROID_PLATFORM) 377 list(APPEND UHDR_CMAKE_ARGS -DANDROID_PLATFORM=${ANDROID_PLATFORM}) 378endif() 379if(DEFINED ANDROID_ABI) 380 list(APPEND UHDR_CMAKE_ARGS -DANDROID_ABI=${ANDROID_ABI}) 381endif() 382if(DEFINED UHDR_ANDROID_NDK_PATH) 383 list(APPEND UHDR_CMAKE_ARGS -DUHDR_ANDROID_NDK_PATH=${UHDR_ANDROID_NDK_PATH}) 384endif() 385 386# opengl es libraries 387if(UHDR_ENABLE_GLES) 388 find_package(EGL QUIET) 389 if(EGL_FOUND) 390 message(STATUS "Found EGL: ${EGL_LIBRARIES}") 391 find_package(OpenGLES3 QUIET) 392 if(OpenGLES3_FOUND) 393 message(STATUS "Found GLESv3: ${OPENGLES3_LIBRARIES} (API version \"${OpenGLES3_API_VERSION}\")") 394 else() 395 message(STATUS "Could NOT find GLESv3") 396 endif() 397 else() 398 message(STATUS "Could NOT find EGL") 399 endif() 400 if(EGL_FOUND AND OpenGLES3_FOUND) 401 add_compile_options(-DUHDR_ENABLE_GLES) 402 string(FIND "${OPENGLES3_LIBRARIES}" "GLESv3" result) 403 if(result GREATER -1) 404 set(UHDR_GL_DEPS "-lEGL -lGLESv3") 405 else() 406 set(UHDR_GL_DEPS "-lEGL -lGLESv2") 407 endif() 408 else() 409 set(UHDR_ENABLE_GLES FALSE) 410 endif() 411endif() 412 413# libjpeg-turbo 414if(NOT UHDR_BUILD_DEPS) 415 find_package(JPEG QUIET) 416 if(NOT JPEG_FOUND) 417 message(FATAL_ERROR "Could NOT find JPEG (missing: JPEG_LIBRARIES JPEG_INCLUDE_DIRS),\ 418 retry after installing JPEG library at sysroot or try 'cmake -DUHDR_BUILD_DEPS=1'") 419 else() 420 message(STATUS "Found JPEG: ${JPEG_LIBRARIES} (found version \"${JPEG_VERSION}\")") 421 endif() 422endif() 423 424if(NOT JPEG_FOUND) 425 set(JPEGTURBO_TARGET_NAME turbojpeg) 426 set(JPEGTURBO_PREFIX_DIR ${CMAKE_CURRENT_BINARY_DIR}/${JPEGTURBO_TARGET_NAME}) 427 set(JPEGTURBO_SOURCE_DIR ${THIRD_PARTY_DIR}/${JPEGTURBO_TARGET_NAME}) 428 set(JPEGTURBO_BINARY_DIR ${JPEGTURBO_PREFIX_DIR}/src/${JPEGTURBO_TARGET_NAME}-build) 429 set(JPEG_INCLUDE_DIRS ${JPEGTURBO_SOURCE_DIR} ${JPEGTURBO_BINARY_DIR}) 430 if(MSVC) 431 set(JPEG_LIB ${CMAKE_STATIC_LIBRARY_PREFIX}jpeg-static${CMAKE_STATIC_LIBRARY_SUFFIX}) 432 else() 433 set(JPEG_LIB ${CMAKE_STATIC_LIBRARY_PREFIX}jpeg${CMAKE_STATIC_LIBRARY_SUFFIX}) 434 endif() 435 if(IS_MULTI) 436 set(JPEG_LIB_PREFIX ${JPEGTURBO_BINARY_DIR}/$<CONFIG>/) 437 else() 438 set(JPEG_LIB_PREFIX ${JPEGTURBO_BINARY_DIR}/) 439 endif() 440 set(JPEG_LIBRARIES ${JPEG_LIB_PREFIX}${JPEG_LIB}) 441 if(EMSCRIPTEN) 442 ExternalProject_Add(${JPEGTURBO_TARGET_NAME} 443 GIT_REPOSITORY https://github.com/libjpeg-turbo/libjpeg-turbo.git 444 GIT_TAG 3.0.1 445 PREFIX ${JPEGTURBO_PREFIX_DIR} 446 SOURCE_DIR ${JPEGTURBO_SOURCE_DIR} 447 BINARY_DIR ${JPEGTURBO_BINARY_DIR} 448 CONFIGURE_COMMAND emcmake cmake ${JPEGTURBO_SOURCE_DIR} 449 -DENABLE_SHARED=0 -DWITH_SIMD=0 450 BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> --target jpeg-static 451 BUILD_BYPRODUCTS ${JPEG_LIBRARIES} 452 INSTALL_COMMAND "" 453 ) 454 else() 455 ExternalProject_Add(${JPEGTURBO_TARGET_NAME} 456 GIT_REPOSITORY https://github.com/libjpeg-turbo/libjpeg-turbo.git 457 GIT_TAG 3.0.1 458 PREFIX ${JPEGTURBO_PREFIX_DIR} 459 SOURCE_DIR ${JPEGTURBO_SOURCE_DIR} 460 BINARY_DIR ${JPEGTURBO_BINARY_DIR} 461 BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> --target jpeg-static 462 CMAKE_ARGS ${UHDR_CMAKE_ARGS} -DENABLE_SHARED=0 463 BUILD_BYPRODUCTS ${JPEG_LIBRARIES} 464 INSTALL_COMMAND "" 465 ) 466 endif() 467endif() 468 469if(UHDR_BUILD_JAVA) 470 # build jni and java util classes 471 find_package(Java REQUIRED) 472 if(${CMAKE_SYSTEM_NAME} MATCHES "Android") 473 find_package(JNI QUIET) 474 if(NOT JAVA_INCLUDE_PATH) 475 message(FATAL_ERROR "Could NOT find JNI Component") 476 else() 477 message(STATUS "Found JNI Component") 478 endif() 479 set(UHDR_JNI_INCLUDE_PATH ${JAVA_INCLUDE_PATH}) 480 else() 481 find_package(JNI REQUIRED) 482 set(UHDR_JNI_INCLUDE_PATH ${JNI_INCLUDE_DIRS}) 483 endif() 484endif() 485 486if(UHDR_BUILD_TESTS) 487 # gtest and gmock 488 set(GTEST_TARGET_NAME googletest) 489 set(GTEST_PREFIX_DIR ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_TARGET_NAME}) 490 set(GTEST_SOURCE_DIR ${THIRD_PARTY_DIR}/${GTEST_TARGET_NAME}) 491 set(GTEST_BINARY_DIR ${GTEST_PREFIX_DIR}/src/${GTEST_TARGET_NAME}-build) 492 set(GTEST_INCLUDE_DIRS 493 ${GTEST_SOURCE_DIR}/googletest/include 494 ${GTEST_SOURCE_DIR}/googlemock/include) 495 set(GTEST_LIB ${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}) 496 set(GTEST_LIB_MAIN ${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}) 497 if(IS_MULTI) 498 set(GTEST_LIB_PREFIX ${GTEST_BINARY_DIR}/lib/$<CONFIG>/) 499 else() 500 set(GTEST_LIB_PREFIX ${GTEST_BINARY_DIR}/lib/) 501 endif() 502 set(GTEST_BOTH_LIBRARIES ${GTEST_LIB_PREFIX}${GTEST_LIB} ${GTEST_LIB_PREFIX}${GTEST_LIB_MAIN}) 503 ExternalProject_Add(${GTEST_TARGET_NAME} 504 GIT_REPOSITORY https://github.com/google/googletest 505 GIT_TAG v1.14.0 506 PREFIX ${GTEST_PREFIX_DIR} 507 SOURCE_DIR ${GTEST_SOURCE_DIR} 508 BINARY_DIR ${GTEST_BINARY_DIR} 509 CMAKE_ARGS ${UHDR_CMAKE_ARGS} 510 BUILD_BYPRODUCTS ${GTEST_BOTH_LIBRARIES} 511 INSTALL_COMMAND "" 512 ) 513endif() 514 515if(UHDR_BUILD_BENCHMARK) 516 # benchmark 517 set(BM_TARGET_NAME benchmark) 518 set(BM_PREFIX_DIR ${CMAKE_CURRENT_BINARY_DIR}/${BM_TARGET_NAME}) 519 set(BM_SOURCE_DIR ${THIRD_PARTY_DIR}/${BM_TARGET_NAME}) 520 set(BM_BINARY_DIR ${BM_PREFIX_DIR}/src/${BM_TARGET_NAME}-build) 521 set(BENCHMARK_INCLUDE_DIR ${BM_SOURCE_DIR}/include) 522 set(BM_LIB ${CMAKE_STATIC_LIBRARY_PREFIX}benchmark${CMAKE_STATIC_LIBRARY_SUFFIX}) 523 set(BM_LIB_MAIN ${CMAKE_STATIC_LIBRARY_PREFIX}benchmark_main${CMAKE_STATIC_LIBRARY_SUFFIX}) 524 if(IS_MULTI) 525 set(BM_LIB_PREFIX ${BM_BINARY_DIR}/src/$<CONFIG>/) 526 else() 527 set(BM_LIB_PREFIX ${BM_BINARY_DIR}/src/) 528 endif() 529 set(BENCHMARK_LIBRARIES ${BM_LIB_PREFIX}${BM_LIB} ${BM_LIB_PREFIX}${BM_LIB_MAIN}) 530 ExternalProject_Add(${BM_TARGET_NAME} 531 GIT_REPOSITORY https://github.com/google/benchmark.git 532 GIT_TAG v1.8.3 533 PREFIX ${BM_PREFIX_DIR} 534 SOURCE_DIR ${BM_SOURCE_DIR} 535 BINARY_DIR ${BM_BINARY_DIR} 536 CMAKE_ARGS ${UHDR_CMAKE_ARGS} 537 -DBENCHMARK_ENABLE_TESTING=OFF 538 -DBENCHMARK_DOWNLOAD_DEPENDENCIES=OFF 539 BUILD_BYPRODUCTS ${BENCHMARK_LIBRARIES} 540 INSTALL_COMMAND "" 541 ) 542endif() 543 544set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES 545 ${JPEGTURBO_BINARY_DIR} ${GTEST_BINARY_DIR} ${BM_BINARY_DIR}) 546 547########################################################### 548# File Lists 549########################################################### 550file(GLOB UHDR_CORE_SRCS_LIST "${SOURCE_DIR}/src/*.cpp") 551if(UHDR_ENABLE_INTRINSICS) 552 if(ARCH STREQUAL "arm" OR ARCH STREQUAL "aarch64") 553 file(GLOB UHDR_CORE_NEON_SRCS_LIST "${SOURCE_DIR}/src/dsp/arm/*.cpp") 554 list(APPEND UHDR_CORE_SRCS_LIST ${UHDR_CORE_NEON_SRCS_LIST}) 555 endif() 556endif() 557if(UHDR_ENABLE_GLES) 558 file(GLOB UHDR_CORE_GLES_SRCS_LIST "${SOURCE_DIR}/src/gpu/*.cpp") 559 list(APPEND UHDR_CORE_SRCS_LIST ${UHDR_CORE_GLES_SRCS_LIST}) 560endif() 561if(UHDR_BUILD_JAVA) 562 file(GLOB UHDR_JNI_SRCS_LIST "${JAVA_DIR}/jni/*.cpp") 563 file(GLOB UHDR_JAVA_SRCS_LIST "${JAVA_DIR}/com/google/media/codecs/ultrahdr/*.java") 564 file(GLOB UHDR_APP_SRC "${JAVA_DIR}/UltraHdrApp.java") 565endif() 566file(GLOB UHDR_TEST_SRCS_LIST "${TESTS_DIR}/*.cpp") 567file(GLOB UHDR_BM_SRCS_LIST "${BENCHMARK_DIR}/*.cpp") 568file(GLOB IMAGE_IO_SRCS_LIST "${THIRD_PARTY_DIR}/image_io/src/**/*.cc") 569 570set(PRIVATE_INCLUDE_DIR ${SOURCE_DIR}/include/ ${JPEG_INCLUDE_DIRS}) 571set(COMMON_LIBS_LIST ${JPEG_LIBRARIES} Threads::Threads) 572 573########################################################### 574# Targets 575########################################################### 576set(IMAGEIO_TARGET_NAME image_io) 577add_library(${IMAGEIO_TARGET_NAME} STATIC ${IMAGE_IO_SRCS_LIST}) 578target_include_directories(${IMAGEIO_TARGET_NAME} PRIVATE 579 "${THIRD_PARTY_DIR}/image_io/includes" 580 "${THIRD_PARTY_DIR}/image_io/src/modp_b64" 581 "${THIRD_PARTY_DIR}/image_io/src/modp_b64/modp_b64") 582 583set(UHDR_CORE_LIB_NAME core) 584add_library(${UHDR_CORE_LIB_NAME} STATIC ${UHDR_CORE_SRCS_LIST}) 585target_compile_options(${UHDR_CORE_LIB_NAME} PRIVATE ${UHDR_WERROR_FLAGS}) 586if(NOT JPEG_FOUND) 587 add_dependencies(${UHDR_CORE_LIB_NAME} ${JPEGTURBO_TARGET_NAME}) 588endif() 589if(NOT MSVC) 590 target_compile_options(${UHDR_CORE_LIB_NAME} PRIVATE -Wall -Wextra -Wshadow) 591endif() 592if(DEFINED UHDR_MAX_DIMENSION) 593 target_compile_options(${UHDR_CORE_LIB_NAME} PRIVATE -DUHDR_MAX_DIMENSION=${UHDR_MAX_DIMENSION}) 594endif() 595target_include_directories(${UHDR_CORE_LIB_NAME} PRIVATE 596 ${PRIVATE_INCLUDE_DIR} 597 "${THIRD_PARTY_DIR}/image_io/includes/" 598) 599target_include_directories(${UHDR_CORE_LIB_NAME} PUBLIC ${EXPORT_INCLUDE_DIR}) 600if(${CMAKE_SYSTEM_NAME} MATCHES "Android") 601 target_link_libraries(${UHDR_CORE_LIB_NAME} PUBLIC ${log-lib}) 602endif() 603if(UHDR_ENABLE_GLES) 604 target_link_libraries(${UHDR_CORE_LIB_NAME} PRIVATE ${EGL_LIBRARIES} ${OPENGLES3_LIBRARIES}) 605endif() 606target_link_libraries(${UHDR_CORE_LIB_NAME} PRIVATE ${COMMON_LIBS_LIST} ${IMAGEIO_TARGET_NAME}) 607 608if(UHDR_BUILD_EXAMPLES) 609 set(UHDR_SAMPLE_APP ultrahdr_app) 610 add_executable(${UHDR_SAMPLE_APP} "${EXAMPLES_DIR}/ultrahdr_app.cpp") 611 add_dependencies(${UHDR_SAMPLE_APP} ${UHDR_CORE_LIB_NAME}) 612 target_compile_options(${UHDR_SAMPLE_APP} PRIVATE ${UHDR_WERROR_FLAGS}) 613 if(UHDR_BUILD_FUZZERS) 614 target_link_options(${UHDR_SAMPLE_APP} PRIVATE -fsanitize=fuzzer-no-link) 615 endif() 616 if(UHDR_ENABLE_STATIC_LINKING) 617 target_link_options(${UHDR_SAMPLE_APP} PRIVATE -static) 618 endif() 619 target_link_libraries(${UHDR_SAMPLE_APP} PRIVATE ${UHDR_CORE_LIB_NAME}) 620endif() 621 622if(UHDR_BUILD_TESTS OR UHDR_BUILD_BENCHMARK) 623 include(CTest) 624 if(WIN32) 625 file(COPY "${TESTS_DIR}/data/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/data") 626 else() 627 execute_process(COMMAND "${CMAKE_COMMAND}" -E create_symlink 628 "${TESTS_DIR}/data/" "${CMAKE_CURRENT_BINARY_DIR}/data" 629 RESULT_VARIABLE result 630 ERROR_VARIABLE errorinfo) 631 string(FIND "${errorinfo}" "error" errorstatus) 632 if(result GREATER 0 OR errorstatus GREATER -1) 633 message(FATAL_ERROR "Creating sym link failed with info ${errorinfo}") 634 endif() 635 endif() 636endif() 637 638if(UHDR_BUILD_TESTS) 639 add_executable(ultrahdr_unit_test ${UHDR_TEST_SRCS_LIST}) 640 add_dependencies(ultrahdr_unit_test ${GTEST_TARGET_NAME} ${UHDR_CORE_LIB_NAME}) 641 target_compile_options(ultrahdr_unit_test PRIVATE ${UHDR_WERROR_FLAGS}) 642 target_include_directories(ultrahdr_unit_test PRIVATE 643 ${PRIVATE_INCLUDE_DIR} 644 ${GTEST_INCLUDE_DIRS} 645 ) 646 if(UHDR_BUILD_FUZZERS) 647 target_link_options(ultrahdr_unit_test PRIVATE -fsanitize=fuzzer-no-link) 648 endif() 649 target_link_libraries(ultrahdr_unit_test ${UHDR_CORE_LIB_NAME} ${GTEST_BOTH_LIBRARIES}) 650 add_test(NAME UHDRUnitTests, COMMAND ultrahdr_unit_test) 651endif() 652 653if(UHDR_BUILD_BENCHMARK) 654 add_executable(ultrahdr_bm ${UHDR_BM_SRCS_LIST}) 655 add_dependencies(ultrahdr_bm ${BM_TARGET_NAME} ${UHDR_CORE_LIB_NAME}) 656 target_compile_options(ultrahdr_bm PRIVATE ${UHDR_WERROR_FLAGS}) 657 target_include_directories(ultrahdr_bm PRIVATE 658 ${PRIVATE_INCLUDE_DIR} 659 ${BENCHMARK_INCLUDE_DIR} 660 ) 661 if(UHDR_BUILD_FUZZERS) 662 target_link_options(ultrahdr_bm PRIVATE -fsanitize=fuzzer-no-link) 663 endif() 664 target_link_libraries(ultrahdr_bm ${UHDR_CORE_LIB_NAME} ${BENCHMARK_LIBRARIES}) 665 666 set(RES_FILE "${TESTS_DIR}/data/UltrahdrBenchmarkTestRes-1.2.zip") 667 set(RES_FILE_MD5SUM "31fc352444f95bc1ab4b9d6e397de6c1") 668 set(GET_RES_FILE TRUE) 669 if(EXISTS ${RES_FILE}) 670 file(MD5 ${RES_FILE} CURR_MD5_SUM) 671 if(CURR_MD5_SUM STREQUAL RES_FILE_MD5SUM) 672 message("Zip File already exists: " ${RES_FILE}) 673 set(GET_RES_FILE FALSE) 674 else() 675 file(REMOVE "${RES_FILE}") 676 endif() 677 endif() 678 679 if(GET_RES_FILE) 680 message("-- Downloading benchmark test resources") 681 set(RES_URL "https://storage.googleapis.com/android_media/external/libultrahdr/benchmark/UltrahdrBenchmarkTestRes-1.2.zip") 682 file(DOWNLOAD ${RES_URL} ${RES_FILE} STATUS result EXPECTED_MD5 ${RES_FILE_MD5SUM}) 683 list(GET result 0 retval) 684 if(retval) 685 file(REMOVE "${RES_FILE}") 686 list(GET result 0 errcode) 687 list(GET result 1 info) 688 message(FATAL_ERROR "Error downloading ${RES_URL}: ${info} (${errcode})") 689 endif() 690 endif() 691 message("-- Extracting benchmark test resources") 692 execute_process(COMMAND "${CMAKE_COMMAND}" -E tar xf "${RES_FILE}" 693 WORKING_DIRECTORY "${TESTS_DIR}/data/" 694 RESULT_VARIABLE result 695 ERROR_VARIABLE errorinfo) 696 string(FIND "${errorinfo}" "error" errorstatus) 697 if(result GREATER 0 OR errorstatus GREATER -1) 698 message(FATAL_ERROR "Extracting benchmark test resources failed with info ${errorinfo}") 699 endif() 700endif() 701 702if(UHDR_BUILD_FUZZERS) 703 add_executable(ultrahdr_enc_fuzzer ${FUZZERS_DIR}/ultrahdr_enc_fuzzer.cpp) 704 add_dependencies(ultrahdr_enc_fuzzer ${UHDR_CORE_LIB_NAME}) 705 target_compile_options(ultrahdr_enc_fuzzer PRIVATE ${UHDR_WERROR_FLAGS}) 706 target_include_directories(ultrahdr_enc_fuzzer PRIVATE ${PRIVATE_INCLUDE_DIR}) 707 if(DEFINED ENV{LIB_FUZZING_ENGINE}) 708 target_link_options(ultrahdr_enc_fuzzer PRIVATE $ENV{LIB_FUZZING_ENGINE}) 709 else() 710 target_link_options(ultrahdr_enc_fuzzer PRIVATE -fsanitize=fuzzer) 711 endif() 712 target_link_libraries(ultrahdr_enc_fuzzer ${UHDR_CORE_LIB_NAME}) 713 714 add_executable(ultrahdr_dec_fuzzer ${FUZZERS_DIR}/ultrahdr_dec_fuzzer.cpp) 715 add_dependencies(ultrahdr_dec_fuzzer ${UHDR_CORE_LIB_NAME}) 716 target_compile_options(ultrahdr_dec_fuzzer PRIVATE ${UHDR_WERROR_FLAGS}) 717 target_include_directories(ultrahdr_dec_fuzzer PRIVATE ${PRIVATE_INCLUDE_DIR}) 718 if(DEFINED ENV{LIB_FUZZING_ENGINE}) 719 target_link_options(ultrahdr_dec_fuzzer PRIVATE $ENV{LIB_FUZZING_ENGINE}) 720 else() 721 target_link_options(ultrahdr_dec_fuzzer PRIVATE -fsanitize=fuzzer) 722 endif() 723 target_link_libraries(ultrahdr_dec_fuzzer ${UHDR_CORE_LIB_NAME}) 724 725 add_executable(ultrahdr_legacy_fuzzer ${FUZZERS_DIR}/ultrahdr_legacy_fuzzer.cpp) 726 add_dependencies(ultrahdr_legacy_fuzzer ${UHDR_CORE_LIB_NAME}) 727 target_compile_options(ultrahdr_legacy_fuzzer PRIVATE ${UHDR_WERROR_FLAGS}) 728 target_include_directories(ultrahdr_legacy_fuzzer PRIVATE ${PRIVATE_INCLUDE_DIR}) 729 if(DEFINED ENV{LIB_FUZZING_ENGINE}) 730 target_link_options(ultrahdr_legacy_fuzzer PRIVATE $ENV{LIB_FUZZING_ENGINE}) 731 else() 732 target_link_options(ultrahdr_legacy_fuzzer PRIVATE -fsanitize=fuzzer) 733 endif() 734 target_link_libraries(ultrahdr_legacy_fuzzer ${UHDR_CORE_LIB_NAME}) 735endif() 736 737set(UHDR_TARGET_NAME uhdr) 738add_library(${UHDR_TARGET_NAME}) 739add_dependencies(${UHDR_TARGET_NAME} ${UHDR_CORE_LIB_NAME}) 740target_compile_options(${UHDR_TARGET_NAME} PRIVATE ${UHDR_WERROR_FLAGS}) 741if(UHDR_ENABLE_GLES) 742 target_link_libraries(${UHDR_TARGET_NAME} PRIVATE ${EGL_LIBRARIES} ${OPENGLES3_LIBRARIES}) 743endif() 744if(${CMAKE_SYSTEM_NAME} MATCHES "Android") 745 target_link_libraries(${UHDR_TARGET_NAME} PRIVATE ${log-lib}) 746endif() 747target_link_libraries(${UHDR_TARGET_NAME} PRIVATE ${JPEG_LIBRARIES}) 748set_target_properties(${UHDR_TARGET_NAME} 749 PROPERTIES PUBLIC_HEADER ultrahdr_api.h) 750if(BUILD_SHARED_LIBS) 751 # If target is STATIC no need to set VERSION and SOVERSION 752 set_target_properties(${UHDR_TARGET_NAME} 753 PROPERTIES VERSION ${PROJECT_VERSION} 754 SOVERSION ${PROJECT_VERSION_MAJOR}) 755endif() 756combine_static_libs(${UHDR_CORE_LIB_NAME} ${UHDR_TARGET_NAME}) 757 758# Build static library as well 759if(BUILD_SHARED_LIBS) 760 set(UHDR_TARGET_NAME_STATIC uhdr-static) 761 add_library(${UHDR_TARGET_NAME_STATIC} STATIC) 762 add_dependencies(${UHDR_TARGET_NAME_STATIC} ${UHDR_CORE_LIB_NAME}) 763 target_compile_options(${UHDR_TARGET_NAME_STATIC} PRIVATE ${UHDR_WERROR_FLAGS}) 764 if(UHDR_ENABLE_GLES) 765 target_link_libraries(${UHDR_TARGET_NAME_STATIC} PRIVATE ${EGL_LIBRARIES} ${OPENGLES3_LIBRARIES}) 766 endif() 767 if(${CMAKE_SYSTEM_NAME} MATCHES "Android") 768 target_link_libraries(${UHDR_TARGET_NAME_STATIC} PRIVATE ${log-lib}) 769 endif() 770 target_link_libraries(${UHDR_TARGET_NAME_STATIC} PRIVATE ${JPEG_LIBRARIES}) 771 combine_static_libs(${UHDR_CORE_LIB_NAME} ${UHDR_TARGET_NAME_STATIC}) 772 if(NOT MSVC) 773 set_target_properties(${UHDR_TARGET_NAME_STATIC} 774 PROPERTIES OUTPUT_NAME ${UHDR_TARGET_NAME}) 775 endif() 776endif() 777 778if(UHDR_BUILD_JAVA) 779 include(UseJava) 780 781 set(UHDR_JNI_TARGET_NAME uhdrjni) 782 add_library(${UHDR_JNI_TARGET_NAME} SHARED ${UHDR_JNI_SRCS_LIST}) 783 add_dependencies(${UHDR_JNI_TARGET_NAME} ${UHDR_TARGET_NAME}) 784 target_include_directories(${UHDR_JNI_TARGET_NAME} PRIVATE ${UHDR_JNI_INCLUDE_PATH} ${EXPORT_INCLUDE_DIR}) 785 target_compile_options(${UHDR_JNI_TARGET_NAME} PRIVATE ${UHDR_WERROR_FLAGS}) 786 target_link_libraries(${UHDR_JNI_TARGET_NAME} PRIVATE ${UHDR_TARGET_NAME}) 787 788 add_jar(uhdr-java SOURCES ${UHDR_JAVA_SRCS_LIST} ${UHDR_APP_SRC} ENTRY_POINT UltraHdrApp) 789endif() 790 791if(UHDR_ENABLE_INSTALL) 792 if(NOT(MSVC OR XCODE)) 793 include(GNUInstallDirs) 794 795 # pkg-config: libuhdr.pc 796 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/libuhdr.pc.in" 797 "${CMAKE_CURRENT_BINARY_DIR}/libuhdr.pc" @ONLY NEWLINE_STYLE UNIX) 798 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libuhdr.pc" 799 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 800 install(TARGETS ${UHDR_TARGET_NAME} ${UHDR_TARGET_NAME_STATIC} ${UHDR_SAMPLE_APP} 801 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 802 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 803 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 804 PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 805 if(BUILD_SHARED_LIBS) 806 if(APPLE) 807 install(CODE "message(STATUS \"You may need to add path \" 808 \"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/ \" 809 \"to DYLD_FALLBACK_LIBRARY_PATH if binaries are unable to load uhdr library \n\" 810 \"e.g. export DYLD_FALLBACK_LIBRARY_PATH=$DYLD_FALLBACK_LIBRARY_PATH:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/ \")") 811 elseif(UNIX) 812 install(CODE "message(STATUS \"You may need to add path \" 813 \"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/ \" 814 \"to LD_LIBRARY_PATH if binaries are unable to load uhdr library \n\" 815 \"e.g. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/ \")") 816 endif() 817 endif() 818 819 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" 820 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) 821 add_custom_target(uninstall 822 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) 823 824 # packaging 825 if(UHDR_BUILD_PACKAGING) 826 include(cmake/package.cmake) 827 include(CPack) 828 endif() 829 830 endif() 831endif() 832