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