-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
233 lines (188 loc) · 6.7 KB
/
CMakeLists.txt
File metadata and controls
233 lines (188 loc) · 6.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
################################################################################
######
###### HEIFTools CMake Configuration File
######
################################################################################
cmake_minimum_required(VERSION 3.15.0)
#set minimum MacOS target version if not defined as environment variable
if(APPLE)
if(NOT DEFINED ENV{MACOSX_DEPLOYMENT_TARGET})
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.3" CACHE STRING "Minimum OSX deployment version")
endif()
endif()
project(HEIFTools
VERSION 1.0.0
DESCRIPTION "LibraryLink paclet that provides Wolfram Language support for HEIF via libheif."
LANGUAGES CXX
)
#set the install directory so that it has a sensible default
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "Paclet install prefix" FORCE)
endif()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
set(LLU_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/CPPSource/LibraryLinkUtilities" CACHE PATH "Location of LLU sources.")
mark_as_advanced(LLU_SOURCE_DIR)
# guard to prevent this file from running twice
if(NOT TARGET HEIFTools)
#=============================================
#============== DEPENDENCIES =================
#=============================================
set(LLU_ROOT "${CMAKE_BINARY_DIR}/LLU/install" CACHE PATH "Location of LLU installation.")
# If LLU is not installed on the system, try building from sources
if(NOT EXISTS "${LLU_ROOT}")
if(NOT EXISTS "${LLU_SOURCE_DIR}")
# Here we could also checkout the appropriate version of LLU from Stash
message(FATAL_ERROR "A path to LLU installation or LLU sources must be provided.")
endif()
message(STATUS "Building LLU from sources.")
# Choose build directory for LLU.
set(LLU_BUILD_DIR "${CMAKE_BINARY_DIR}/LLU/build")
file(MAKE_DIRECTORY "${LLU_BUILD_DIR}")
# Install LLU in the build tree
set(LLU_ROOT "${CMAKE_BINARY_DIR}/LLU/install")
# Configure LLU
set(LLU_CMAKE_OPTS
"-G${CMAKE_GENERATOR}"
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
"-DCMAKE_INSTALL_PREFIX=${LLU_ROOT}"
"-DWOLFRAM_WSTP_PATH=${WOLFRAM_WSTP_PATH}"
"-DWOLFRAM_LIBRARY_PATH=${WOLFRAM_LIBRARY_PATH}"
)
# This assumes only one of the following is set
if(Mathematica_INSTALL_DIR OR MATHEMATICA_INSTALL_DIR OR WolframLanguage_INSTALL_DIR)
list(APPEND LLU_CMAKE_OPTS "-DWolframLanguage_ROOT=${Mathematica_INSTALL_DIR}${MATHEMATICA_INSTALL_DIR}${WolframLanguage_INSTALL_DIR}")
endif()
if(CMAKE_GENERATOR_TOOLSET)
list(APPEND LLU_CMAKE_OPTS -T ${CMAKE_GENERATOR_TOOLSET})
endif()
if(CMAKE_GENERATOR_PLATFORM)
list(APPEND LLU_CMAKE_OPTS -A ${CMAKE_GENERATOR_PLATFORM})
endif()
execute_process(
COMMAND ${CMAKE_COMMAND} ${LLU_CMAKE_OPTS} "${LLU_SOURCE_DIR}"
WORKING_DIRECTORY "${LLU_BUILD_DIR}"
)
# Build and install LLU
execute_process(
COMMAND ${CMAKE_COMMAND} --build "${LLU_BUILD_DIR}" --config ${CMAKE_BUILD_TYPE} --target install
)
endif ()
find_package(LLU 3.5.1 REQUIRED NO_MODULE PATH_SUFFIXES LLU)
include(${LLU_ROOT}/cmake/LLU/Wolfram/CVSUtilities.cmake)
#=============================================
#================= libheif ===================
#=============================================
# Internal Wolfram build
if (DEFINED ENV{NEXUSROOT})
# Parses components.json to set CMake variables for all dependencies
parse_components_config()
# Find libheif or download if necessary
find_component(libheif)
endif ()
list(APPEND CMAKE_PREFIX_PATH ${libheif_DIR})
# Find libheif
find_package(libheif ${libheif_VERSION} REQUIRED NO_MODULE)
#=============================================
#=========== MAIN PACLET LIBRARY =============
#=============================================
set(LIBHEIF_SOURCE_FILES
CPPSource/Sources/HEIFTools.cpp
)
set(LIBHEIF_INTERNAL_READER_FILES
CPPSource/Sources/Reader/Reader.hpp
CPPSource/Sources/Reader/Reader.cpp
)
source_group("Reader" FILES ${LIBHEIF_INTERNAL_READER_FILES})
set(LIBHEIF_INTERNAL_WRITER_FILES
CPPSource/Sources/Writer/Writer.hpp
CPPSource/Sources/Writer/Writer.cpp
)
source_group("Writer" FILES ${LIBHEIF_INTERNAL_WRITER_FILES})
set(LIBHEIF_INTERNAL_UTILITY_FILES
CPPSource/Sources/Utilities/Utilities.hpp
CPPSource/Sources/Utilities/Utilities.cpp
)
source_group("Utilities" FILES ${LIBHEIF_INTERNAL_UTILITY_FILES})
set(LIBHEIF_INTERNAL_METADATA_FILES
CPPSource/Sources/Metadata/Metadata.hpp
CPPSource/Sources/Metadata/Metadata.cpp
)
source_group("Metadata" FILES ${LIBHEIF_INTERNAL_METADATA_FILES})
add_library(HEIFTools SHARED
${LIBHEIF_SOURCE_FILES}
${LIBHEIF_INTERNAL_READER_FILES}
${LIBHEIF_INTERNAL_WRITER_FILES}
${LIBHEIF_INTERNAL_UTILITY_FILES}
${LIBHEIF_INTERNAL_METADATA_FILES}
)
if(MSVC)
set_windows_static_runtime()
else()
set_rpath(HEIFTools "")
endif()
#compilation options
set_target_properties(HEIFTools PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
CXX_VISIBILITY_PRESET hidden
POSITION_INDEPENDENT_CODE YES
)
if(MSVC)
target_compile_options(HEIFTools PRIVATE
"/W4"
"/EHsc"
"$<$<CONFIG:Debug>:/Zi>"
"$<$<NOT:$<CONFIG:Debug>>:/O2>"
)
else()
target_compile_options(HEIFTools PRIVATE
"-Wall"
"-Wextra"
"-pedantic"
"$<$<NOT:$<CONFIG:Debug>>:-O3>"
)
endif()
#in paclets we skip the usual "lib" prefix
set_property(TARGET HEIFTools PROPERTY PREFIX "")
#link libraries
target_link_libraries(HEIFTools PRIVATE
LLU::LLU
heif
)
target_include_directories(HEIFTools PRIVATE "CPPSource/Sources")
# determine target machine bit-ness
set_machine_flags(HEIFTools)
#=============================================
#=========== INSTALL FILES ===================
#=============================================
# Set up the install target for HEIFTools. LLU location is needed to find the LibraryLinkUtilities.wl file,
# which needs to be installed with the paclet.
install_paclet_files(
TARGET
HEIFTools
LLU_LOCATION
${LLU_ROOT}
)
detect_system_id(SYSTEM_ID)
if(SYSTEM_ID STREQUAL "Linux-ARM64")
# With libheif built via vcpkg we know how to find libx265 shared library.
# Otherwise, pass these values from command line
if(VCPKG_IMPORT_PREFIX)
set(x265_DEBUG_LIB "${VCPKG_IMPORT_PREFIX}/debug/lib/libx265.so")
set(x265_LIB "${VCPKG_IMPORT_PREFIX}/lib/libx265.so")
endif()
install(FILES
$<IF:$<CONFIG:DEBUG>,${x265_DEBUG_LIB},${x265_LIB}>
DESTINATION HEIFTools/LibraryResources/${SYSTEM_ID}
)
endif()
add_paclet_target(paclet
NAME HEIFTools
VERIFY
INSTALL
)
endif() # end IF NOT TARGET HEIFTools