xref: /aosp_15_r20/external/webp/CMakeLists.txt (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
1#  Copyright (c) 2020 Google LLC.
2#
3#  Use of this source code is governed by a BSD-style license
4#  that can be found in the LICENSE file in the root of the source
5#  tree. An additional intellectual property rights grant can be found
6#  in the file PATENTS.  All contributing project authors may
7#  be found in the AUTHORS file in the root of the source tree.
8
9if(APPLE)
10  cmake_minimum_required(VERSION 3.17)
11else()
12  cmake_minimum_required(VERSION 3.7)
13endif()
14
15if(POLICY CMP0072)
16  cmake_policy(SET CMP0072 NEW)
17endif()
18
19project(WebP C)
20
21# Options for coder / decoder executables.
22if(BUILD_SHARED_LIBS)
23  set(WEBP_LINK_STATIC_DEFAULT OFF)
24else()
25  set(WEBP_LINK_STATIC_DEFAULT ON)
26endif()
27option(WEBP_LINK_STATIC
28       "Link using static libraries. If OFF, use dynamic libraries."
29       ${WEBP_LINK_STATIC_DEFAULT})
30if(NOT EMSCRIPTEN)
31  # Disable SIMD on Emscripten by default, as it's a new unstable Wasm feature.
32  # Users can still explicitly opt-in to make a SIMD-enabled build.
33  set(WEBP_ENABLE_SIMD_DEFAULT ON)
34endif()
35option(WEBP_ENABLE_SIMD "Enable any SIMD optimization."
36       ${WEBP_ENABLE_SIMD_DEFAULT})
37option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON)
38option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON)
39option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON)
40option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." ON)
41option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." ON)
42option(WEBP_BUILD_VWEBP "Build the vwebp viewer tool." ON)
43option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." ON)
44option(WEBP_BUILD_LIBWEBPMUX "Build the libwebpmux library." ON)
45option(WEBP_BUILD_WEBPMUX "Build the webpmux command line tool." ON)
46option(WEBP_BUILD_EXTRAS "Build extras." ON)
47option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF)
48option(WEBP_USE_THREAD "Enable threading support" ON)
49option(WEBP_NEAR_LOSSLESS "Enable near-lossless encoding" ON)
50option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces."
51       OFF)
52set(WEBP_BITTRACE "0" CACHE STRING "Bit trace mode (0=none, 1=bit, 2=bytes)")
53set_property(CACHE WEBP_BITTRACE PROPERTY STRINGS 0 1 2)
54option(WEBP_ENABLE_WUNUSED_RESULT "Add [[nodiscard]] to some functions. \
55       CMake must be at least 3.21 to force C23" OFF)
56
57if(WEBP_LINK_STATIC)
58  if(WIN32)
59    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
60  else()
61    set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
62  endif()
63  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
64  # vwebp does not compile on Ubuntu with static libraries so disabling it for
65  # now.
66  set(WEBP_BUILD_VWEBP OFF)
67endif()
68
69# Option needed for handling Unicode file names on Windows.
70if(WIN32)
71  option(WEBP_UNICODE "Build Unicode executables." ON)
72endif()
73
74if(WEBP_BUILD_WEBP_JS)
75  set(WEBP_BUILD_ANIM_UTILS OFF)
76  set(WEBP_BUILD_CWEBP OFF)
77  set(WEBP_BUILD_DWEBP OFF)
78  set(WEBP_BUILD_GIF2WEBP OFF)
79  set(WEBP_BUILD_IMG2WEBP OFF)
80  set(WEBP_BUILD_VWEBP OFF)
81  set(WEBP_BUILD_WEBPINFO OFF)
82  set(WEBP_BUILD_WEBPMUX OFF)
83  set(WEBP_BUILD_EXTRAS OFF)
84  set(WEBP_USE_THREAD OFF)
85
86  if(WEBP_ENABLE_SIMD)
87    message(NOTICE
88            "wasm2js does not support SIMD, disabling webp.js generation.")
89  endif()
90endif()
91
92set(SHARPYUV_DEP_LIBRARIES)
93set(SHARPYUV_DEP_INCLUDE_DIRS)
94set(WEBP_DEP_LIBRARIES)
95set(WEBP_DEP_INCLUDE_DIRS)
96
97if(NOT CMAKE_BUILD_TYPE)
98  set(CMAKE_BUILD_TYPE "Release"
99      CACHE STRING "Build type: Release, Debug, MinSizeRel or RelWithDebInfo"
100            FORCE)
101endif()
102
103# Include dependencies.
104if(WEBP_BUILD_ANIM_UTILS
105   OR WEBP_BUILD_CWEBP
106   OR WEBP_BUILD_DWEBP
107   OR WEBP_BUILD_EXTRAS
108   OR WEBP_BUILD_GIF2WEBP
109   OR WEBP_BUILD_IMG2WEBP)
110  set(WEBP_FIND_IMG_LIBS TRUE)
111else()
112  set(WEBP_FIND_IMG_LIBS FALSE)
113endif()
114include(cmake/deps.cmake)
115include(GNUInstallDirs)
116
117if(BUILD_SHARED_LIBS AND NOT DEFINED CMAKE_INSTALL_RPATH)
118  # Set the rpath to match autoconf/libtool behavior. Note this must be set
119  # before target creation.
120  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
121endif()
122
123# ##############################################################################
124# Options.
125if(WEBP_ENABLE_SWAP_16BIT_CSP)
126  add_definitions(-DWEBP_SWAP_16BIT_CSP=1)
127endif()
128
129if(NOT WEBP_BITTRACE STREQUAL "0")
130  add_definitions(-DBITTRACE=${WEBP_BITTRACE})
131endif()
132
133if(WEBP_UNICODE)
134  # Windows recommends setting both UNICODE and _UNICODE.
135  add_definitions(-DUNICODE -D_UNICODE)
136endif()
137
138if(WIN32 AND BUILD_SHARED_LIBS)
139  add_definitions(-DWEBP_DLL)
140endif()
141
142# pkg-config variables used by *.pc.in.
143set(prefix ${CMAKE_INSTALL_PREFIX})
144set(exec_prefix "\${prefix}")
145if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
146  set(libdir "${CMAKE_INSTALL_LIBDIR}")
147else()
148  set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
149endif()
150if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
151  set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
152else()
153  set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
154endif()
155set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
156set(INSTALLED_LIBRARIES)
157
158if(MSVC)
159  # match the naming convention used by nmake
160  set(webp_libname_prefix "lib")
161  set(CMAKE_SHARED_LIBRARY_PREFIX "${webp_libname_prefix}")
162  set(CMAKE_IMPORT_LIBRARY_PREFIX "${webp_libname_prefix}")
163  set(CMAKE_STATIC_LIBRARY_PREFIX "${webp_libname_prefix}")
164endif()
165
166if(NOT WIN32)
167  set(CMAKE_C_VISIBILITY_PRESET hidden)
168endif()
169
170if(WEBP_ENABLE_WUNUSED_RESULT)
171  if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0)
172    set(CMAKE_C_STANDARD 23)
173  else()
174    unset(CMAKE_C_STANDARD)
175    add_compile_options($<$<COMPILE_LANGUAGE:C>:-std=gnu2x>)
176  endif()
177  add_compile_options(-Wunused-result)
178  add_definitions(-DWEBP_ENABLE_NODISCARD=1)
179endif()
180
181# ##############################################################################
182# Android only.
183if(ANDROID)
184  include_directories(${ANDROID_NDK}/sources/android/cpufeatures)
185  add_library(cpufeatures-webp STATIC
186              ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
187  list(APPEND INSTALLED_LIBRARIES cpufeatures-webp)
188  target_link_libraries(cpufeatures-webp dl)
189  set(SHARPYUV_DEP_LIBRARIES ${SHARPYUV_DEP_LIBRARIES} cpufeatures-webp)
190  set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures-webp)
191  set(cpufeatures_include_dir ${ANDROID_NDK}/sources/android/cpufeatures)
192  set(SHARPYUV_DEP_INCLUDE_DIRS ${SHARPYUV_DEP_INCLUDE_DIRS}
193                                ${cpufeatures_include_dir})
194  set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${cpufeatures_include_dir})
195  add_definitions(-DHAVE_CPU_FEATURES_H=1)
196  set(HAVE_CPU_FEATURES_H 1)
197else()
198  set(HAVE_CPU_FEATURES_H 0)
199endif()
200
201function(configure_pkg_config FILE)
202  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.in"
203                 "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" @ONLY)
204
205  if(HAVE_MATH_LIBRARY)
206    # MSVC doesn't have libm
207    file(READ ${CMAKE_CURRENT_BINARY_DIR}/${FILE} data)
208    string(REPLACE "-lm" "" data ${data})
209    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${FILE} ${data})
210  endif()
211
212  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${FILE}"
213          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
214endfunction()
215
216# ##############################################################################
217# WebP source files. Read the Makefile.am to get the source files.
218
219# We expect the Makefiles to define the sources as defined in the first regex.
220# E.g.: libimagedec_la_SOURCES  = image_dec.c image_dec.h
221function(parse_Makefile_am FOLDER VAR SRC_REGEX)
222  file(READ ${FOLDER}/Makefile.am MAKEFILE_AM)
223  string(REGEX MATCHALL "${SRC_REGEX}_SOURCES[ ]*\\+?=[ ]+[0-9a-z\\._ ]*"
224               FILES_PER_LINE ${MAKEFILE_AM})
225  set(SRCS ${${VAR}})
226  foreach(FILES ${FILES_PER_LINE})
227    string(FIND ${FILES} "=" OFFSET)
228    math(EXPR OFFSET "${OFFSET} + 2")
229    string(SUBSTRING ${FILES} ${OFFSET} -1 FILES)
230    if(FILES)
231      string(REGEX MATCHALL "[0-9a-z\\._]+" FILES ${FILES})
232      foreach(FILE ${FILES})
233        list(APPEND SRCS ${FOLDER}/${FILE})
234      endforeach()
235    endif()
236  endforeach()
237  set(${VAR} ${SRCS} PARENT_SCOPE)
238endfunction()
239
240set(WEBP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
241parse_makefile_am(${WEBP_SRC_DIR}/dec "WEBP_DEC_SRCS" "")
242parse_makefile_am(${WEBP_SRC_DIR}/demux "WEBP_DEMUX_SRCS" "")
243parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_COMMON_SRCS" "COMMON")
244parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "ENC")
245parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "dsp_[^ ]*")
246parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_DEC_SRCS" "decode_[^ ]*")
247parse_makefile_am(${WEBP_SRC_DIR}/enc "WEBP_ENC_SRCS" "")
248parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_COMMON_SRCS" "COMMON")
249parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_ENC_SRCS" "ENC")
250parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_DEC_SRCS" "decode_[^ ]*")
251
252# Remove the files specific to SIMD we don't use.
253foreach(FILE ${WEBP_SIMD_FILES_NOT_TO_INCLUDE})
254  list(REMOVE_ITEM WEBP_DSP_ENC_SRCS ${FILE})
255  list(REMOVE_ITEM WEBP_DSP_DEC_SRCS ${FILE})
256endforeach()
257
258# Generate the config.h file.
259configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in
260               ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h @ONLY)
261add_definitions(-DHAVE_CONFIG_H)
262
263# Set the version numbers.
264macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE)
265  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} SOURCE_FILE)
266  string(REGEX MATCH
267               "${NAME_IN_MAKEFILE}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP
268               ${SOURCE_FILE})
269  string(REGEX MATCH "[0-9:]+" TMP ${TMP})
270  string(REGEX REPLACE ":" " " LT_VERSION ${TMP})
271
272  # See the libtool docs for more information:
273  # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
274  #
275  # c=<current>, a=<age>, r=<revision>
276  #
277  # libtool generates a .so file as .so.[c-a].a.r, while -version-info c:r:a is
278  # passed to libtool.
279  #
280  # We set FULL = [c-a].a.r and MAJOR = [c-a].
281  separate_arguments(LT_VERSION)
282  list(GET LT_VERSION 0 LT_CURRENT)
283  list(GET LT_VERSION 1 LT_REVISION)
284  list(GET LT_VERSION 2 LT_AGE)
285  math(EXPR LT_CURRENT_MINUS_AGE "${LT_CURRENT} - ${LT_AGE}")
286
287  set_target_properties(
288    ${TARGET_NAME}
289    PROPERTIES VERSION ${LT_CURRENT_MINUS_AGE}.${LT_AGE}.${LT_REVISION}
290               SOVERSION ${LT_CURRENT_MINUS_AGE})
291  if(APPLE)
292    # For compatibility, set MACHO_COMPATIBILITY_VERSION and
293    # MACHO_CURRENT_VERSION to match libtool. These properties were introduced
294    # in 3.17:
295    # https://cmake.org/cmake/help/latest/prop_tgt/MACHO_COMPATIBILITY_VERSION.html
296    math(EXPR LIBWEBP_MACHO_COMPATIBILITY_VERSION "${LT_CURRENT} + 1")
297    set_target_properties(
298      ${TARGET_NAME}
299      PROPERTIES MACHO_COMPATIBILITY_VERSION
300                 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}
301                 MACHO_CURRENT_VERSION
302                 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}.${LT_REVISION})
303  endif()
304endmacro()
305
306# ##############################################################################
307# Build the webpdecoder library.
308
309# Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and
310# adds it to the specified target. Currently used only with Xcode.
311#
312# See also:
313# https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries
314# "Some native build systems (such as Xcode) may not like targets that have only
315# object files, so consider adding at least one real source file to any target
316# that references $<TARGET_OBJECTS:objlib>."
317function(libwebp_add_stub_file TARGET)
318  set(stub_source_dir "${CMAKE_BINARY_DIR}")
319  set(stub_source_file "${stub_source_dir}/libwebp_${TARGET}_stub.c")
320  set(stub_source_code
321      "// Generated file. DO NOT EDIT!\n"
322      "// C source file created for target ${TARGET}.\n"
323      "void libwebp_${TARGET}_stub_function(void)\;\n"
324      "void libwebp_${TARGET}_stub_function(void) {}\n")
325  file(WRITE "${stub_source_file}" ${stub_source_code})
326
327  target_sources(${TARGET} PRIVATE ${stub_source_file})
328endfunction()
329
330parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" "")
331add_library(sharpyuv ${WEBP_SHARPYUV_SRCS})
332target_link_libraries(sharpyuv ${SHARPYUV_DEP_LIBRARIES})
333set_version(sharpyuv/Makefile.am sharpyuv sharpyuv)
334target_include_directories(
335  sharpyuv PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
336                   ${CMAKE_CURRENT_SOURCE_DIR}/src)
337set_target_properties(
338  sharpyuv
339  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\
340${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h")
341configure_pkg_config("sharpyuv/libsharpyuv.pc")
342install(
343  TARGETS sharpyuv
344  EXPORT ${PROJECT_NAME}Targets
345  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp/sharpyuv
346  INCLUDES
347  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
348  ${CMAKE_INSTALL_INCLUDEDIR}/webp
349  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
350  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
351  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
352
353if(MSVC)
354  # avoid security warnings for e.g., fopen() used in the examples.
355  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
356else()
357  add_compile_options(-Wall)
358endif()
359include_directories(${WEBP_DEP_INCLUDE_DIRS})
360add_library(webpdecode OBJECT ${WEBP_DEC_SRCS})
361target_include_directories(webpdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
362                                              ${CMAKE_CURRENT_SOURCE_DIR})
363add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS})
364target_include_directories(webpdspdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
365                                                 ${CMAKE_CURRENT_SOURCE_DIR})
366add_library(webputilsdecode OBJECT ${WEBP_UTILS_COMMON_SRCS}
367                                   ${WEBP_UTILS_DEC_SRCS})
368target_include_directories(webputilsdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
369                                                   ${CMAKE_CURRENT_SOURCE_DIR})
370add_library(
371  webpdecoder $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdspdecode>
372              $<TARGET_OBJECTS:webputilsdecode>)
373if(XCODE)
374  libwebp_add_stub_file(webpdecoder)
375endif()
376target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES})
377target_include_directories(
378  webpdecoder PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
379  INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
380            $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
381set_target_properties(
382  webpdecoder
383  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
384${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
385
386configure_pkg_config("src/libwebpdecoder.pc")
387
388# Build the webp library.
389add_library(webpencode OBJECT ${WEBP_ENC_SRCS})
390target_include_directories(
391  webpencode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
392                     ${CMAKE_CURRENT_SOURCE_DIR}/src)
393add_library(webpdsp OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}
394                           ${WEBP_DSP_ENC_SRCS})
395target_include_directories(webpdsp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
396                                           ${CMAKE_CURRENT_SOURCE_DIR})
397add_library(webputils OBJECT ${WEBP_UTILS_COMMON_SRCS} ${WEBP_UTILS_DEC_SRCS}
398                             ${WEBP_UTILS_ENC_SRCS})
399target_include_directories(webputils PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
400                                             ${CMAKE_CURRENT_SOURCE_DIR})
401add_library(webp $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdsp>
402                 $<TARGET_OBJECTS:webpencode> $<TARGET_OBJECTS:webputils>)
403target_link_libraries(webp sharpyuv)
404if(XCODE)
405  libwebp_add_stub_file(webp)
406endif()
407target_link_libraries(webp ${WEBP_DEP_LIBRARIES})
408target_include_directories(
409  webp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
410  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
411         $<INSTALL_INTERFACE:include>)
412set_target_properties(
413  webp
414  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
415${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\
416${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
417
418# Make sure the OBJECT libraries are built with position independent code (it is
419# not ON by default).
420set_target_properties(webpdecode webpdspdecode webputilsdecode webpencode
421                      webpdsp webputils PROPERTIES POSITION_INDEPENDENT_CODE ON)
422configure_pkg_config("src/libwebp.pc")
423
424# Build the webp demux library.
425add_library(webpdemux ${WEBP_DEMUX_SRCS})
426target_link_libraries(webpdemux webp)
427target_include_directories(
428  webpdemux PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
429  PUBLIC $<INSTALL_INTERFACE:include>)
430set_target_properties(
431  webpdemux
432  PROPERTIES
433    PUBLIC_HEADER
434    "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
435${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\
436${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\
437${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
438
439configure_pkg_config("src/demux/libwebpdemux.pc")
440
441set_version(src/Makefile.am webp webp)
442set_version(src/Makefile.am webpdecoder webpdecoder)
443set_version(src/demux/Makefile.am webpdemux webpdemux)
444file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_FILE)
445string(REGEX MATCH "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]" TMP ${CONFIGURE_FILE})
446string(REGEX MATCH "[0-9\\.]+" PROJECT_VERSION ${TMP})
447
448# Define the libraries to install.
449list(APPEND INSTALLED_LIBRARIES webpdecoder webp webpdemux)
450
451# Deal with SIMD. Change the compile flags for SIMD files we use.
452list(LENGTH WEBP_SIMD_FILES_TO_INCLUDE WEBP_SIMD_FILES_TO_INCLUDE_LENGTH)
453math(EXPR WEBP_SIMD_FILES_TO_INCLUDE_RANGE
454     "${WEBP_SIMD_FILES_TO_INCLUDE_LENGTH}-1")
455
456foreach(I_FILE RANGE ${WEBP_SIMD_FILES_TO_INCLUDE_RANGE})
457  list(GET WEBP_SIMD_FILES_TO_INCLUDE ${I_FILE} FILE)
458  list(GET WEBP_SIMD_FLAGS_TO_INCLUDE ${I_FILE} SIMD_COMPILE_FLAG)
459  set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS
460                                                 ${SIMD_COMPILE_FLAG})
461endforeach()
462
463if(NOT WEBP_BUILD_LIBWEBPMUX)
464  set(WEBP_BUILD_GIF2WEBP OFF)
465  set(WEBP_BUILD_IMG2WEBP OFF)
466  set(WEBP_BUILD_WEBPMUX OFF)
467endif()
468
469if(WEBP_BUILD_GIF2WEBP AND NOT GIF_FOUND)
470  set(WEBP_BUILD_GIF2WEBP OFF)
471endif()
472
473if(WEBP_BUILD_ANIM_UTILS AND NOT GIF_FOUND)
474  set(WEBP_BUILD_ANIM_UTILS OFF)
475endif()
476
477# Build the executables if asked for.
478if(WEBP_BUILD_ANIM_UTILS
479   OR WEBP_BUILD_CWEBP
480   OR WEBP_BUILD_DWEBP
481   OR WEBP_BUILD_EXTRAS
482   OR WEBP_BUILD_GIF2WEBP
483   OR WEBP_BUILD_IMG2WEBP
484   OR WEBP_BUILD_VWEBP
485   OR WEBP_BUILD_WEBPMUX
486   OR WEBP_BUILD_WEBPINFO)
487  # Example utility library.
488  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS"
489                    "example_util_[^ ]*")
490  list(APPEND EXAMPLEUTIL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h)
491  add_library(exampleutil STATIC ${EXAMPLEUTIL_SRCS})
492  target_include_directories(
493    exampleutil PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>)
494
495  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEIOUTILS_SRCS"
496                    "imageio_util_[^ ]*")
497  add_library(imageioutil STATIC ${IMAGEIOUTILS_SRCS})
498  target_link_libraries(imageioutil webp)
499  target_link_libraries(exampleutil imageioutil)
500
501  # Image-decoding utility library.
502  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEDEC_SRCS"
503                    "imagedec_[^ ]*")
504  add_library(imagedec STATIC ${IMAGEDEC_SRCS})
505  target_link_libraries(imagedec imageioutil webpdemux webp
506                        ${WEBP_DEP_IMG_LIBRARIES})
507
508  # Image-encoding utility library.
509  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEENC_SRCS"
510                    "imageenc_[^ ]*")
511  add_library(imageenc STATIC ${IMAGEENC_SRCS})
512  target_link_libraries(imageenc imageioutil webp)
513
514  set_property(
515    TARGET exampleutil imageioutil imagedec imageenc
516    PROPERTY INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src
517             ${CMAKE_CURRENT_BINARY_DIR}/src)
518  target_include_directories(imagedec PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS})
519  target_include_directories(imageenc PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS})
520endif()
521
522if(WEBP_BUILD_DWEBP)
523  # dwebp
524  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "DWEBP_SRCS" "dwebp")
525  add_executable(dwebp ${DWEBP_SRCS})
526  target_link_libraries(dwebp exampleutil imagedec imageenc)
527  target_include_directories(dwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
528  install(TARGETS dwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
529endif()
530
531if(WEBP_BUILD_CWEBP)
532  # cwebp
533  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "CWEBP_SRCS" "cwebp")
534  add_executable(cwebp ${CWEBP_SRCS})
535  target_link_libraries(cwebp exampleutil imagedec webp)
536  target_include_directories(cwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
537                                           ${CMAKE_CURRENT_SOURCE_DIR})
538  install(TARGETS cwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
539endif()
540
541if(WEBP_BUILD_LIBWEBPMUX)
542  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "WEBP_MUX_SRCS" "")
543  add_library(libwebpmux ${WEBP_MUX_SRCS})
544  target_link_libraries(libwebpmux webp)
545  target_include_directories(libwebpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
546                                                ${CMAKE_CURRENT_SOURCE_DIR})
547  set_version(src/mux/Makefile.am libwebpmux webpmux)
548  set_target_properties(
549    libwebpmux
550    PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h;\
551${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\
552${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h;")
553  set_target_properties(libwebpmux PROPERTIES OUTPUT_NAME webpmux)
554  list(APPEND INSTALLED_LIBRARIES libwebpmux)
555  configure_pkg_config("src/mux/libwebpmux.pc")
556endif()
557
558if(WEBP_BUILD_GIF2WEBP)
559  # gif2webp
560  include_directories(${WEBP_DEP_GIF_INCLUDE_DIRS})
561  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "GIF2WEBP_SRCS"
562                    "gif2webp")
563  add_executable(gif2webp ${GIF2WEBP_SRCS})
564  target_link_libraries(gif2webp exampleutil imageioutil webp libwebpmux
565                        ${WEBP_DEP_GIF_LIBRARIES})
566  target_include_directories(gif2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
567  install(TARGETS gif2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
568endif()
569
570if(WEBP_BUILD_IMG2WEBP)
571  # img2webp
572  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
573  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "IMG2WEBP_SRCS"
574                    "img2webp")
575  add_executable(img2webp ${IMG2WEBP_SRCS})
576  target_link_libraries(img2webp exampleutil imagedec imageioutil webp
577                        libwebpmux)
578  target_include_directories(img2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
579                                              ${CMAKE_CURRENT_SOURCE_DIR})
580  install(TARGETS img2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
581endif()
582
583if(WEBP_BUILD_VWEBP)
584  # vwebp
585  find_package(GLUT)
586  if(GLUT_FOUND)
587    include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
588    parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "VWEBP_SRCS" "vwebp")
589    add_executable(vwebp ${VWEBP_SRCS})
590    target_link_libraries(
591      vwebp
592      ${OPENGL_LIBRARIES}
593      exampleutil
594      GLUT::GLUT
595      imageioutil
596      webp
597      webpdemux)
598    target_include_directories(
599      vwebp PRIVATE ${GLUT_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src
600                    ${OPENGL_INCLUDE_DIR})
601    install(TARGETS vwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
602    if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
603      check_c_compiler_flag("-Wno-deprecated-declarations" HAS_NO_DEPRECATED)
604      if(HAS_NO_DEPRECATED)
605        target_compile_options(vwebp PRIVATE "-Wno-deprecated-declarations")
606      endif()
607    endif()
608  endif()
609endif()
610
611if(WEBP_BUILD_WEBPINFO)
612  # webpinfo
613  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
614  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPINFO_SRCS"
615                    "webpinfo")
616  add_executable(webpinfo ${WEBPINFO_SRCS})
617  target_link_libraries(webpinfo exampleutil imageioutil)
618  target_include_directories(webpinfo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
619                                              ${CMAKE_CURRENT_SOURCE_DIR}/src)
620  install(TARGETS webpinfo RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
621endif()
622
623if(WEBP_BUILD_WEBPMUX)
624  # webpmux
625  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPMUX_SRCS"
626                    "webpmux")
627  add_executable(webpmux ${WEBPMUX_SRCS})
628  target_link_libraries(webpmux exampleutil imageioutil libwebpmux webp)
629  target_include_directories(webpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
630  install(TARGETS webpmux RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
631endif()
632
633if(WEBP_BUILD_EXTRAS)
634  set(EXTRAS_MAKEFILE "${CMAKE_CURRENT_SOURCE_DIR}/extras")
635  parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_EXTRAS_SRCS" "libwebpextras_la")
636  parse_makefile_am(${EXTRAS_MAKEFILE} "GET_DISTO_SRCS" "get_disto")
637  parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_QUALITY_SRCS" "webp_quality")
638  parse_makefile_am(${EXTRAS_MAKEFILE} "VWEBP_SDL_SRCS" "vwebp_sdl")
639
640  # libextras
641  add_library(extras STATIC ${WEBP_EXTRAS_SRCS})
642  target_include_directories(
643    extras PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
644                   ${CMAKE_CURRENT_SOURCE_DIR}/src)
645
646  # get_disto
647  add_executable(get_disto ${GET_DISTO_SRCS})
648  target_link_libraries(get_disto imagedec)
649  target_include_directories(get_disto PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
650                                               ${CMAKE_CURRENT_BINARY_DIR}/src)
651
652  # webp_quality
653  add_executable(webp_quality ${WEBP_QUALITY_SRCS})
654  target_link_libraries(webp_quality exampleutil imagedec extras)
655  target_include_directories(webp_quality PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
656                                                  ${CMAKE_CURRENT_BINARY_DIR})
657
658  # vwebp_sdl
659  find_package(SDL2 QUIET)
660  if(WEBP_BUILD_VWEBP AND SDL2_FOUND)
661    add_executable(vwebp_sdl ${VWEBP_SDL_SRCS})
662    target_link_libraries(vwebp_sdl ${SDL2_LIBRARIES} imageioutil webp)
663    target_include_directories(
664      vwebp_sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
665                        ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL2_INCLUDE_DIRS})
666    set(WEBP_HAVE_SDL 1)
667    target_compile_definitions(vwebp_sdl PUBLIC WEBP_HAVE_SDL)
668
669    set(CMAKE_REQUIRED_INCLUDES "${SDL2_INCLUDE_DIRS}")
670    check_c_source_compiles(
671      "
672        #define SDL_MAIN_HANDLED
673        #include \"SDL.h\"
674        int main(void) {
675          return 0;
676        }
677      "
678      HAVE_JUST_SDL_H)
679    set(CMAKE_REQUIRED_INCLUDES)
680    if(HAVE_JUST_SDL_H)
681      target_compile_definitions(vwebp_sdl PRIVATE WEBP_HAVE_JUST_SDL_H)
682    endif()
683  endif()
684endif()
685
686if(WEBP_BUILD_WEBP_JS)
687  # The default stack size changed from 5MB to 64KB in 3.1.27. See
688  # https://crbug.com/webp/614.
689  if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.27")
690    # TOTAL_STACK size was renamed to STACK_SIZE in 3.1.27. The old name was
691    # kept for compatibility, but prefer the new one in case it is removed in
692    # the future.
693    set(emscripten_stack_size "-sSTACK_SIZE=5MB")
694  else()
695    set(emscripten_stack_size "-sTOTAL_STACK=5MB")
696  endif()
697  find_package(SDL2 REQUIRED)
698  # wasm2js does not support SIMD.
699  if(NOT WEBP_ENABLE_SIMD)
700    # JavaScript version
701    add_executable(webp_js ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
702    target_link_libraries(webp_js webpdecoder SDL2)
703    target_include_directories(webp_js PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
704    set(WEBP_HAVE_SDL 1)
705    set_target_properties(
706      webp_js
707      PROPERTIES
708        # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at
709        # compile time to ensure the headers are downloaded.
710        COMPILE_OPTIONS "${SDL2_LIBRARIES}"
711        LINK_FLAGS
712        "-sWASM=0 ${emscripten_stack_size} \
713         -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
714         -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \
715         -sALLOW_MEMORY_GROWTH")
716    set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
717    target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
718  endif()
719
720  # WASM version
721  add_executable(webp_wasm ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
722  target_link_libraries(webp_wasm webpdecoder SDL2)
723  target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
724  set_target_properties(
725    webp_wasm
726    PROPERTIES
727      # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at
728      # compile time to ensure the headers are downloaded.
729      COMPILE_OPTIONS "${SDL2_LIBRARIES}"
730      LINK_FLAGS
731      "-sWASM=1 ${emscripten_stack_size} \
732       -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
733       -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \
734       -sALLOW_MEMORY_GROWTH")
735  target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
736
737  target_compile_definitions(webpdspdecode PUBLIC EMSCRIPTEN)
738endif()
739
740if(WEBP_BUILD_ANIM_UTILS)
741  # anim_diff
742  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS})
743  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DIFF_SRCS"
744                    "anim_diff")
745  add_executable(anim_diff ${ANIM_DIFF_SRCS})
746  target_link_libraries(
747    anim_diff
748    exampleutil
749    imagedec
750    imageenc
751    imageioutil
752    webp
753    webpdemux
754    ${WEBP_DEP_GIF_LIBRARIES})
755  target_include_directories(anim_diff PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
756
757  # anim_dump
758  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS})
759  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DUMP_SRCS"
760                    "anim_dump")
761  add_executable(anim_dump ${ANIM_DUMP_SRCS})
762  target_link_libraries(
763    anim_dump
764    exampleutil
765    imagedec
766    imageenc
767    imageioutil
768    webp
769    webpdemux
770    ${WEBP_DEP_GIF_LIBRARIES})
771  target_include_directories(anim_dump PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
772endif()
773
774# Install the different headers and libraries.
775install(
776  TARGETS ${INSTALLED_LIBRARIES}
777  EXPORT ${PROJECT_NAME}Targets
778  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp
779  INCLUDES
780  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
781  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
782  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
783  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
784set(ConfigPackageLocation ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/cmake/)
785install(EXPORT ${PROJECT_NAME}Targets NAMESPACE ${PROJECT_NAME}::
786        DESTINATION ${ConfigPackageLocation})
787
788# Create the CMake version file.
789include(CMakePackageConfigHelpers)
790write_basic_package_version_file(
791  "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake"
792  VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion)
793
794# Create the Config file.
795include(CMakePackageConfigHelpers)
796# Fix libwebpmux reference. The target name libwebpmux is used for compatibility
797# purposes, but the library mentioned in WebPConfig.cmake should be the
798# unprefixed version. Note string(...) can be replaced with list(TRANSFORM ...)
799# if cmake_minimum_required is >= 3.12.
800string(REGEX REPLACE "libwebpmux" "webpmux" INSTALLED_LIBRARIES
801                     "${INSTALLED_LIBRARIES}")
802
803if(MSVC)
804  # For compatibility with nmake, MSVC builds use a custom prefix (lib) that
805  # needs to be included in the library name.
806  string(REGEX REPLACE "[A-Za-z0-9_]+" "${CMAKE_STATIC_LIBRARY_PREFIX}\\0"
807                       INSTALLED_LIBRARIES "${INSTALLED_LIBRARIES}")
808endif()
809
810configure_package_config_file(
811  ${CMAKE_CURRENT_SOURCE_DIR}/cmake/WebPConfig.cmake.in
812  ${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake
813  INSTALL_DESTINATION ${ConfigPackageLocation}
814  PATH_VARS CMAKE_INSTALL_INCLUDEDIR)
815
816# Install the generated CMake files.
817install(FILES "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake"
818              "${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake"
819        DESTINATION ${ConfigPackageLocation})
820
821# Install the man pages.
822set(MAN_PAGES
823    cwebp.1
824    dwebp.1
825    gif2webp.1
826    img2webp.1
827    vwebp.1
828    webpmux.1
829    webpinfo.1)
830set(EXEC_BUILDS
831    "CWEBP"
832    "DWEBP"
833    "GIF2WEBP"
834    "IMG2WEBP"
835    "VWEBP"
836    "WEBPMUX"
837    "WEBPINFO")
838list(LENGTH MAN_PAGES MAN_PAGES_LENGTH)
839math(EXPR MAN_PAGES_RANGE "${MAN_PAGES_LENGTH} - 1")
840
841foreach(I_MAN RANGE ${MAN_PAGES_RANGE})
842  list(GET EXEC_BUILDS ${I_MAN} EXEC_BUILD)
843  if(WEBP_BUILD_${EXEC_BUILD})
844    list(GET MAN_PAGES ${I_MAN} MAN_PAGE)
845    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man/${MAN_PAGE}
846            DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc)
847  endif()
848endforeach()
849