From a3b68c195e27248e4401e727dbdb21ea1ef1258f Mon Sep 17 00:00:00 2001 From: Maryla Date: Wed, 27 Jul 2022 17:54:43 +0200 Subject: [PATCH] Build libsharpyuv as a full installable library. Headers are installed in a "sharpyuv" subdirectory of the webp dir, e.g. /usr/local/include/webp/sharpyuv/ Remove unnecessary dependency from sharpyuv to webp/types.h Add SHARPYUV_EXTERN so that only symbols meant to be public are exported. Sharpyuv users can use the library with: find_package(WebP) if(TARGET WebP::sharpyuv) # ... use WebP::sharpyuv endif() Change-Id: I602a25521a135a2edc39d6587610484fe6447ec5 --- CMakeLists.txt | 320 +++++++++++++++++++++------------------- sharpyuv/Makefile.am | 13 +- sharpyuv/sharpyuv.c | 2 +- sharpyuv/sharpyuv.h | 26 +++- sharpyuv/sharpyuv_csp.h | 7 +- 5 files changed, 199 insertions(+), 169 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fe8b072d..251b6f9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,159 +218,9 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h) add_definitions(-DHAVE_CONFIG_H) -# ############################################################################## -# Build the webpdecoder library. - -# Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and -# adds it to the specified target. Currently used only with Xcode. -# -# See also: -# https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries -# "Some native build systems (such as Xcode) may not like targets that have -# only object files, so consider adding at least one real source file to any -# target that references $." -function(libwebp_add_stub_file TARGET) - set(stub_source_dir "${CMAKE_BINARY_DIR}") - set(stub_source_file - "${stub_source_dir}/libwebp_${TARGET}_stub.c") - set(stub_source_code - "// Generated file. DO NOT EDIT!\n" - "// C source file created for target ${TARGET}.\n" - "void libwebp_${TARGET}_stub_function(void)\;\n" - "void libwebp_${TARGET}_stub_function(void) {}\n") - file(WRITE "${stub_source_file}" ${stub_source_code}) - - target_sources(${TARGET} PRIVATE ${stub_source_file}) -endfunction() - -parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" - "") -add_library(sharpyuv OBJECT ${WEBP_SHARPYUV_SRCS}) -target_include_directories(sharpyuv - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -set_target_properties( - sharpyuv - PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") - -if(MSVC) - # avoid security warnings for e.g., fopen() used in the examples. - add_definitions(-D_CRT_SECURE_NO_WARNINGS) -else() - add_definitions(-Wall) -endif() -include_directories(${WEBP_DEP_INCLUDE_DIRS}) -add_library(webpdecode OBJECT ${WEBP_DEC_SRCS}) -target_include_directories(webpdecode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}) -target_include_directories(webpdspdecode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webputilsdecode - OBJECT - ${WEBP_UTILS_COMMON_SRCS} - ${WEBP_UTILS_DEC_SRCS}) -target_include_directories(webputilsdecode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webpdecoder - $ - $ - $) -if(XCODE) - libwebp_add_stub_file(webpdecoder) -endif() -target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES}) -target_include_directories( - webpdecoder - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} - INTERFACE $ - $) -set_target_properties( - webpdecoder - PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") - -configure_pkg_config("src/libwebpdecoder.pc") - -# Build the webp library. -add_library(webpencode OBJECT ${WEBP_ENC_SRCS}) -target_include_directories(webpencode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webpdsp - OBJECT - ${WEBP_DSP_COMMON_SRCS} - ${WEBP_DSP_DEC_SRCS} - ${WEBP_DSP_ENC_SRCS}) -target_include_directories(webpdsp - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webputils - OBJECT - ${WEBP_UTILS_COMMON_SRCS} - ${WEBP_UTILS_DEC_SRCS} - ${WEBP_UTILS_ENC_SRCS}) -target_include_directories(webputils - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(webp - $ - $ - $ - $ - $) -if(XCODE) - libwebp_add_stub_file(webp) -endif() -target_link_libraries(webp ${WEBP_DEP_LIBRARIES}) -target_include_directories( - webp - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - PUBLIC $ - $) -set_target_properties( - webp - PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") - -# Make sure the OBJECT libraries are built with position independent code (it is -# not ON by default). -set_target_properties(sharpyuv - webpdecode - webpdspdecode - webputilsdecode - webpencode - webpdsp - webputils - PROPERTIES POSITION_INDEPENDENT_CODE ON) -configure_pkg_config("src/libwebp.pc") - -# Build the webp demux library. -add_library(webpdemux ${WEBP_DEMUX_SRCS}) -target_link_libraries(webpdemux webp) -target_include_directories(webpdemux - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - PUBLIC $) -set_target_properties( - webpdemux - PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ -${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") - -configure_pkg_config("src/demux/libwebpdemux.pc") - # Set the version numbers. macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE) - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/${FILE} SOURCE_FILE) + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} SOURCE_FILE) string(REGEX MATCH "${NAME_IN_MAKEFILE}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP @@ -420,9 +270,169 @@ macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE) ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}.${LT_REVISION}) endif() endmacro() -set_version(Makefile.am webp webp) -set_version(Makefile.am webpdecoder webpdecoder) -set_version(demux/Makefile.am webpdemux webpdemux) + +# ############################################################################## +# Build the webpdecoder library. + +# Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and +# adds it to the specified target. Currently used only with Xcode. +# +# See also: +# https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries +# "Some native build systems (such as Xcode) may not like targets that have +# only object files, so consider adding at least one real source file to any +# target that references $." +function(libwebp_add_stub_file TARGET) + set(stub_source_dir "${CMAKE_BINARY_DIR}") + set(stub_source_file + "${stub_source_dir}/libwebp_${TARGET}_stub.c") + set(stub_source_code + "// Generated file. DO NOT EDIT!\n" + "// C source file created for target ${TARGET}.\n" + "void libwebp_${TARGET}_stub_function(void)\;\n" + "void libwebp_${TARGET}_stub_function(void) {}\n") + file(WRITE "${stub_source_file}" ${stub_source_code}) + + target_sources(${TARGET} PRIVATE ${stub_source_file}) +endfunction() + +parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" + "") +add_library(sharpyuv ${WEBP_SHARPYUV_SRCS}) +set_version(sharpyuv/Makefile.am sharpyuv sharpyuv) +target_include_directories(sharpyuv + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/src) +set_target_properties( + sharpyuv + PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h") +install(TARGETS sharpyuv + EXPORT ${PROJECT_NAME}Targets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp/sharpyuv + INCLUDES + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/webp + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +if(MSVC) + # avoid security warnings for e.g., fopen() used in the examples. + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +else() + add_definitions(-Wall) +endif() +include_directories(${WEBP_DEP_INCLUDE_DIRS}) +add_library(webpdecode OBJECT ${WEBP_DEC_SRCS}) +target_include_directories(webpdecode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}) +target_include_directories(webpdspdecode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(webputilsdecode + OBJECT + ${WEBP_UTILS_COMMON_SRCS} + ${WEBP_UTILS_DEC_SRCS}) +target_include_directories(webputilsdecode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(webpdecoder + $ + $ + $) +if(XCODE) + libwebp_add_stub_file(webpdecoder) +endif() +target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES}) +target_include_directories( + webpdecoder + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} + INTERFACE $ + $) +set_target_properties( + webpdecoder + PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") + +configure_pkg_config("src/libwebpdecoder.pc") + +# Build the webp library. +add_library(webpencode OBJECT ${WEBP_ENC_SRCS}) +target_include_directories(webpencode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/src) +add_library(webpdsp + OBJECT + ${WEBP_DSP_COMMON_SRCS} + ${WEBP_DSP_DEC_SRCS} + ${WEBP_DSP_ENC_SRCS}) +target_include_directories(webpdsp + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(webputils + OBJECT + ${WEBP_UTILS_COMMON_SRCS} + ${WEBP_UTILS_DEC_SRCS} + ${WEBP_UTILS_ENC_SRCS}) +target_include_directories(webputils + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(webp + $ + $ + $ + $) +target_link_libraries(webp sharpyuv) +if(XCODE) + libwebp_add_stub_file(webp) +endif() +target_link_libraries(webp ${WEBP_DEP_LIBRARIES}) +target_include_directories( + webp + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + PUBLIC $ + $) +set_target_properties( + webp + PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") + +# Make sure the OBJECT libraries are built with position independent code (it is +# not ON by default). +set_target_properties(webpdecode + webpdspdecode + webputilsdecode + webpencode + webpdsp + webputils + PROPERTIES POSITION_INDEPENDENT_CODE ON) +configure_pkg_config("src/libwebp.pc") + +# Build the webp demux library. +add_library(webpdemux ${WEBP_DEMUX_SRCS}) +target_link_libraries(webpdemux webp) +target_include_directories(webpdemux + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + PUBLIC $) +set_target_properties( + webpdemux + PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ +${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") + +configure_pkg_config("src/demux/libwebpdemux.pc") + +set_version(src/Makefile.am webp webp) +set_version(src/Makefile.am webpdecoder webpdecoder) +set_version(src/demux/Makefile.am webpdemux webpdemux) file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_FILE) string(REGEX MATCH "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]" @@ -537,7 +547,7 @@ if(WEBP_BUILD_LIBWEBPMUX) target_include_directories(webpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) - set_version(mux/Makefile.am webpmux webpmux) + set_version(src/mux/Makefile.am webpmux webpmux) set_target_properties(webpmux PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h;\ diff --git a/sharpyuv/Makefile.am b/sharpyuv/Makefile.am index a2297a76..ed9869ba 100644 --- a/sharpyuv/Makefile.am +++ b/sharpyuv/Makefile.am @@ -1,12 +1,16 @@ AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src + +lib_LTLIBRARIES = libsharpyuv.la + noinst_LTLIBRARIES = -noinst_LTLIBRARIES += libsharpyuv.la noinst_LTLIBRARIES += libsharpyuv_sse2.la noinst_LTLIBRARIES += libsharpyuv_neon.la +libsharpyuvinclude_HEADERS = +libsharpyuvinclude_HEADERS += sharpyuv.h +libsharpyuvinclude_HEADERS += sharpyuv_csp.h noinst_HEADERS = -noinst_HEADERS += ../src/webp/types.h noinst_HEADERS += ../src/dsp/cpu.h libsharpyuv_sse2_la_SOURCES = @@ -26,9 +30,8 @@ libsharpyuv_la_SOURCES += sharpyuv_gamma.c sharpyuv_gamma.h libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS) -libsharpyuv_la_LDFLAGS = +libsharpyuv_la_LDFLAGS = -no-undefined -version-info 0:0:0 libsharpyuv_la_LIBADD = libsharpyuv_la_LIBADD += libsharpyuv_sse2.la libsharpyuv_la_LIBADD += libsharpyuv_neon.la - -noinst_PROGRAMS = +libsharpyuvincludedir = $(includedir)/webp/sharpyuv diff --git a/sharpyuv/sharpyuv.c b/sharpyuv/sharpyuv.c index 8b3ab721..6497fb02 100644 --- a/sharpyuv/sharpyuv.c +++ b/sharpyuv/sharpyuv.c @@ -417,7 +417,7 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr, // Hidden exported init function. // By default SharpYuvConvert calls it with NULL. If needed, users can declare // it as extern and call it with a VP8CPUInfo function. -extern void SharpYuvInit(VP8CPUInfo cpu_info_func); +SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func); void SharpYuvInit(VP8CPUInfo cpu_info_func) { static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used = (VP8CPUInfo)&sharpyuv_last_cpuinfo_used; diff --git a/sharpyuv/sharpyuv.h b/sharpyuv/sharpyuv.h index 9386ea21..7ce92f9b 100644 --- a/sharpyuv/sharpyuv.h +++ b/sharpyuv/sharpyuv.h @@ -18,6 +18,20 @@ extern "C" { #endif +#ifndef SHARPYUV_EXTERN +#ifdef WEBP_EXTERN +#define SHARPYUV_EXTERN WEBP_EXTERN +#else +// This explicitly marks library functions and allows for changing the +// signature for e.g., Windows DLL builds. +#if defined(__GNUC__) && __GNUC__ >= 4 +#define SHARPYUV_EXTERN extern __attribute__((visibility("default"))) +#else +#define SHARPYUV_EXTERN extern +#endif /* __GNUC__ >= 4 */ +#endif /* WEBP_EXTERN */ +#endif /* SHARPYUV_EXTERN */ + // SharpYUV API version following the convention from semver.org #define SHARPYUV_VERSION_MAJOR 0 #define SHARPYUV_VERSION_MINOR 1 @@ -65,11 +79,13 @@ typedef struct { // adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they // should be multiples of 2. // width, height: width and height of the image in pixels -int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr, - int rgb_step, int rgb_stride, int rgb_bit_depth, - void* y_ptr, int y_stride, void* u_ptr, int u_stride, - void* v_ptr, int v_stride, int yuv_bit_depth, int width, - int height, const SharpYuvConversionMatrix* yuv_matrix); +SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr, + const void* b_ptr, int rgb_step, + int rgb_stride, int rgb_bit_depth, + void* y_ptr, int y_stride, void* u_ptr, + int u_stride, void* v_ptr, int v_stride, + int yuv_bit_depth, int width, int height, + const SharpYuvConversionMatrix* yuv_matrix); // TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422 // support (it's rarely used in practice, especially for images). diff --git a/sharpyuv/sharpyuv_csp.h b/sharpyuv/sharpyuv_csp.h index 63c99ef5..3214e3ac 100644 --- a/sharpyuv/sharpyuv_csp.h +++ b/sharpyuv/sharpyuv_csp.h @@ -35,8 +35,9 @@ typedef struct { } SharpYuvColorSpace; // Fills in 'matrix' for the given YUVColorSpace. -void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space, - SharpYuvConversionMatrix* matrix); +SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix( + const SharpYuvColorSpace* yuv_color_space, + SharpYuvConversionMatrix* matrix); // Enums for precomputed conversion matrices. typedef enum { @@ -49,7 +50,7 @@ typedef enum { } SharpYuvMatrixType; // Returns a pointer to a matrix for one of the predefined colorspaces. -const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( +SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( SharpYuvMatrixType matrix_type); #ifdef __cplusplus