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