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