xref: /aosp_15_r20/external/libultrahdr/CMakeLists.txt (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
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