From 004d5690869babe970254566eb0d9de5a3182497 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Thu, 7 Jul 2016 20:21:51 +0200 Subject: [PATCH] Split the main CMake file. This will well isolate contributions for original code, generated code and SIMD (especially for Android). Change-Id: Ie47664decc7f43c2f57260a72cab951c347281a7 (cherry picked from commit 6c628410763c8fce6a22768f9186327eb0d91a16) --- CMakeLists.txt | 205 +------------------------------------------ cmake/config.h.cmake | 141 +++++++++++++++++++++++++++++ cmake/cpu.cmake | 63 +++++++++++++ 3 files changed, 205 insertions(+), 204 deletions(-) create mode 100644 cmake/config.h.cmake create mode 100644 cmake/cpu.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cb9c3bc..9d5fa774 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,210 +17,7 @@ if(NOT CMAKE_BUILD_TYPE) ) endif() -################################################################################ -# Generate the config.h to compile with specific intrinsics / libs. - -## Check for compiler options. -include(CheckCSourceCompiles) -check_c_source_compiles(" - int main(void) { - (void)__builtin_bswap16(0); - return 0; - } - " - HAVE_BUILTIN_BSWAP16 -) -check_c_source_compiles(" - int main(void) { - (void)__builtin_bswap32(0); - return 0; - } - " - HAVE_BUILTIN_BSWAP32 -) -check_c_source_compiles(" - int main(void) { - (void)__builtin_bswap64(0); - return 0; - } - " - HAVE_BUILTIN_BSWAP64 -) - -## Check for libraries. -find_package(Threads) -if(Threads_FOUND) - if(CMAKE_USE_PTHREADS_INIT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") - endif() - foreach(PTHREAD_TEST HAVE_PTHREAD_PRIO_INHERIT PTHREAD_CREATE_UNDETACHED) - check_c_source_compiles(" - #include - int main (void) { - int attr = ${PTHREAD_TEST}; - return attr; - } - " ${PTHREAD_TEST} - ) - endforeach() - list(APPEND WEBP_DEP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) -endif() -set(WEBP_USE_THREAD ${Threads_FOUND}) - -# TODO: this seems unused, check with autotools. -set(LT_OBJDIR ".libs/") - -# Only useful for vwebp, so useless for now. -# find_package(OpenGL) -# set(WEBP_HAVE_GL ${OPENGL_FOUND}) -# set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS}) -# set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} ${OPENGL_LIBRARIES}) - -# Find the standard C math library. -find_library(MATH_LIBRARY NAMES m) -if(MATH_LIBRARY) - list(APPEND WEBP_DEP_LIBRARIES ${MATH_LIBRARY}) -endif() - -# Find the standard image libraries. -set(WEBP_DEP_IMG_LIBRARIES) -set(WEBP_DEP_IMG_INCLUDE_DIRS) -foreach(I_LIB PNG JPEG TIFF GIF) - find_package(${I_LIB}) - set(WEBP_HAVE_${I_LIB} ${${I_LIB}_FOUND}) - if(${I_LIB}_FOUND) - list(APPEND WEBP_DEP_IMG_LIBRARIES ${${I_LIB}_LIBRARIES}) - list(APPEND WEBP_DEP_IMG_INCLUDE_DIRS ${${I_LIB}_INCLUDE_DIRS}) - endif() -endforeach() - -## Check for specific headers. -include(CheckIncludeFiles) -check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) -check_include_files(dlfcn.h HAVE_DLFCN_H) -check_include_files(GLUT/glut.h HAVE_GLUT_GLUT_H) -check_include_files(GL/glut.h HAVE_GL_GLUT_H) -check_include_files(inttypes.h HAVE_INTTYPES_H) -check_include_files(memory.h HAVE_MEMORY_H) -check_include_files(OpenGL/glut.h HAVE_OPENGL_GLUT_H) -check_include_files(shlwapi.h HAVE_SHLWAPI_H) -check_include_files(stdint.h HAVE_STDINT_H) -check_include_files(stdlib.h HAVE_STDLIB_H) -check_include_files(strings.h HAVE_STRINGS_H) -check_include_files(string.h HAVE_STRING_H) -check_include_files(sys/stat.h HAVE_SYS_STAT_H) -check_include_files(sys/types.h HAVE_SYS_TYPES_H) -check_include_files(unistd.h HAVE_UNISTD_H) -check_include_files(wincodec.h HAVE_WINCODEC_H) -check_include_files(windows.h HAVE_WINDOWS_H) - -# Windows specifics -if(HAVE_WINCODEC_H) - list(APPEND WEBP_DEP_LIBRARIES shlwapi ole32 windowscodecs) -endif() - -## Check for SIMD extensions. -set(WEBP_SIMD_FLAGS "SSE2;SSE41;AVX2") -set(WEBP_SIMD_FILE_EXTENSIONS "_sse2.c;_sse41.c;_avx2.c") -if(MSVC) - # MSVC does not have a SSE4 flag but AVX2 support implies - # SSE4 support. - set(SIMD_ENABLE_FLAGS "/arch:SSE2;/arch:AVX2;/arch:AVX2") - set(SIMD_DISABLE_FLAGS) -else() - set(SIMD_ENABLE_FLAGS "-msse2;-msse4.1;-mavx2") - set(SIMD_DISABLE_FLAGS "-mno-sse2;-mno-sse4.1;-mno-avx2") -endif() - -set(WEBP_SIMD_FILES_TO_NOT_INCLUDE) -set(WEBP_SIMD_FILES_TO_INCLUDE) -set(WEBP_SIMD_FLAGS_TO_INCLUDE) - -list(LENGTH WEBP_SIMD_FLAGS WEBP_SIMD_FLAGS_LENGTH) -math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1") - -foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE}) - list(GET WEBP_SIMD_FLAGS ${I_SIMD} WEBP_SIMD_FLAG) - list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) - set(CMAKE_REQUIRED_FLAGS ${SIMD_COMPILE_FLAG}) - check_c_source_compiles(" - #include \"${CMAKE_CURRENT_LIST_DIR}/src/dsp/dsp.h\" - int main(void) { - #if !defined(WEBP_USE_${WEBP_SIMD_FLAG}) - this is not valid code - #endif - return 0; - } - " - WEBP_HAVE_${WEBP_SIMD_FLAG} - ) - - # Check which files we should include or not. - list(GET WEBP_SIMD_FILE_EXTENSIONS ${I_SIMD} WEBP_SIMD_FILE_EXTENSION) - file(GLOB SIMD_FILES RELATIVE ${CMAKE_CURRENT_LIST_DIR} - "${CMAKE_CURRENT_SOURCE_DIR}/src/dsp/*${WEBP_SIMD_FILE_EXTENSION}" - ) - if(WEBP_HAVE_${WEBP_SIMD_FLAG}) - # Memorize the file and flags. - foreach(FILE ${SIMD_FILES}) - list(APPEND WEBP_SIMD_FILES_TO_INCLUDE ${FILE}) - list(APPEND WEBP_SIMD_FLAGS_TO_INCLUDE ${SIMD_COMPILE_FLAG}) - endforeach() - else() - # Remove the file from the list. - foreach(FILE ${SIMD_FILES}) - list(APPEND WEBP_SIMD_FILES_NOT_TO_INCLUDE ${FILE}) - endforeach() - # Explicitly disable SIMD. - if(SIMD_DISABLE_FLAGS) - list(GET SIMD_DISABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) - include(CheckCCompilerFlag) - check_c_compiler_flag(${SIMD_COMPILE_FLAG} HAS_COMPILE_FLAG) - if(HAS_COMPILE_FLAG) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SIMD_COMPILE_FLAG}") - endif() - endif() - endif() -endforeach() - -## Define extra info. -set(PACKAGE ${PROJECT_NAME}) -set(PACKAGE_NAME ${PROJECT_NAME}) - -# Read from configure.ac. -file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_AC) -string(REGEX MATCHALL "\\[([0-9a-z\\.:/]*)\\]" - CONFIGURE_AC_PACKAGE_INFO ${CONFIGURE_AC} -) -function(strip_bracket VAR) - string(LENGTH ${${VAR}} TMP_LEN) - math(EXPR TMP_LEN ${TMP_LEN}-2) - string(SUBSTRING ${${VAR}} 1 ${TMP_LEN} TMP_SUB) - set(${VAR} ${TMP_SUB} PARENT_SCOPE) -endfunction() - -list(GET CONFIGURE_AC_PACKAGE_INFO 1 PACKAGE_VERSION) -strip_bracket(PACKAGE_VERSION) -list(GET CONFIGURE_AC_PACKAGE_INFO 2 PACKAGE_BUGREPORT) -strip_bracket(PACKAGE_BUGREPORT) -list(GET CONFIGURE_AC_PACKAGE_INFO 3 PACKAGE_URL) -strip_bracket(PACKAGE_URL) - -# Build more info. -set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") -set(PACKAGE_TARNAME ${PACKAGE_NAME}) -set(VERSION ${PACKAGE_VERSION}) - -## Generate the config.h header. -configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/include/webp/config.h) -add_definitions(-DHAVE_CONFIG_H) -# The webp folder is included as we reference config.h as -# ../webp/config.h or webp/config.h -include_directories(${CMAKE_CURRENT_BINARY_DIR}/include - ${CMAKE_CURRENT_BINARY_DIR}/include/webp -) - +include(cmake/config.h.cmake) ################################################################################ # WebP source files. diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake new file mode 100644 index 00000000..0aade0c0 --- /dev/null +++ b/cmake/config.h.cmake @@ -0,0 +1,141 @@ +# Generate the config.h to compile with specific intrinsics / libs. + +## Check for compiler options. +include(CheckCSourceCompiles) +check_c_source_compiles(" + int main(void) { + (void)__builtin_bswap16(0); + return 0; + } + " + HAVE_BUILTIN_BSWAP16 +) +check_c_source_compiles(" + int main(void) { + (void)__builtin_bswap32(0); + return 0; + } + " + HAVE_BUILTIN_BSWAP32 +) +check_c_source_compiles(" + int main(void) { + (void)__builtin_bswap64(0); + return 0; + } + " + HAVE_BUILTIN_BSWAP64 +) + +## Check for libraries. +find_package(Threads) +if(Threads_FOUND) + if(CMAKE_USE_PTHREADS_INIT) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") + endif() + foreach(PTHREAD_TEST HAVE_PTHREAD_PRIO_INHERIT PTHREAD_CREATE_UNDETACHED) + check_c_source_compiles(" + #include + int main (void) { + int attr = ${PTHREAD_TEST}; + return attr; + } + " ${PTHREAD_TEST} + ) + endforeach() + list(APPEND WEBP_DEP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) +endif() +set(WEBP_USE_THREAD ${Threads_FOUND}) + +# TODO: this seems unused, check with autotools. +set(LT_OBJDIR ".libs/") + +# Only useful for vwebp, so useless for now. +# find_package(OpenGL) +# set(WEBP_HAVE_GL ${OPENGL_FOUND}) +# set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS}) +# set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} ${OPENGL_LIBRARIES}) + +# Find the standard C math library. +find_library(MATH_LIBRARY NAMES m) +if(MATH_LIBRARY) + list(APPEND WEBP_DEP_LIBRARIES ${MATH_LIBRARY}) +endif() + +# Find the standard image libraries. +set(WEBP_DEP_IMG_LIBRARIES) +set(WEBP_DEP_IMG_INCLUDE_DIRS) +foreach(I_LIB PNG JPEG TIFF GIF) + find_package(${I_LIB}) + set(WEBP_HAVE_${I_LIB} ${${I_LIB}_FOUND}) + if(${I_LIB}_FOUND) + list(APPEND WEBP_DEP_IMG_LIBRARIES ${${I_LIB}_LIBRARIES}) + list(APPEND WEBP_DEP_IMG_INCLUDE_DIRS ${${I_LIB}_INCLUDE_DIRS}) + endif() +endforeach() + +## Check for specific headers. +include(CheckIncludeFiles) +check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) +check_include_files(dlfcn.h HAVE_DLFCN_H) +check_include_files(GLUT/glut.h HAVE_GLUT_GLUT_H) +check_include_files(GL/glut.h HAVE_GL_GLUT_H) +check_include_files(inttypes.h HAVE_INTTYPES_H) +check_include_files(memory.h HAVE_MEMORY_H) +check_include_files(OpenGL/glut.h HAVE_OPENGL_GLUT_H) +check_include_files(shlwapi.h HAVE_SHLWAPI_H) +check_include_files(stdint.h HAVE_STDINT_H) +check_include_files(stdlib.h HAVE_STDLIB_H) +check_include_files(strings.h HAVE_STRINGS_H) +check_include_files(string.h HAVE_STRING_H) +check_include_files(sys/stat.h HAVE_SYS_STAT_H) +check_include_files(sys/types.h HAVE_SYS_TYPES_H) +check_include_files(unistd.h HAVE_UNISTD_H) +check_include_files(wincodec.h HAVE_WINCODEC_H) +check_include_files(windows.h HAVE_WINDOWS_H) + +# Windows specifics +if(HAVE_WINCODEC_H) + list(APPEND WEBP_DEP_LIBRARIES shlwapi ole32 windowscodecs) +endif() + +## Check for SIMD extensions. +include(${CMAKE_CURRENT_LIST_DIR}/cpu.cmake) + +## Define extra info. +set(PACKAGE ${PROJECT_NAME}) +set(PACKAGE_NAME ${PROJECT_NAME}) + +# Read from configure.ac. +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_AC) +string(REGEX MATCHALL "\\[([0-9a-z\\.:/]*)\\]" + CONFIGURE_AC_PACKAGE_INFO ${CONFIGURE_AC} +) +function(strip_bracket VAR) + string(LENGTH ${${VAR}} TMP_LEN) + math(EXPR TMP_LEN ${TMP_LEN}-2) + string(SUBSTRING ${${VAR}} 1 ${TMP_LEN} TMP_SUB) + set(${VAR} ${TMP_SUB} PARENT_SCOPE) +endfunction() + +list(GET CONFIGURE_AC_PACKAGE_INFO 1 PACKAGE_VERSION) +strip_bracket(PACKAGE_VERSION) +list(GET CONFIGURE_AC_PACKAGE_INFO 2 PACKAGE_BUGREPORT) +strip_bracket(PACKAGE_BUGREPORT) +list(GET CONFIGURE_AC_PACKAGE_INFO 3 PACKAGE_URL) +strip_bracket(PACKAGE_URL) + +# Build more info. +set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") +set(PACKAGE_TARNAME ${PACKAGE_NAME}) +set(VERSION ${PACKAGE_VERSION}) + +## Generate the config.h header. +configure_file(${CMAKE_CURRENT_LIST_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/include/webp/config.h) +add_definitions(-DHAVE_CONFIG_H) +# The webp folder is included as we reference config.h as +# ../webp/config.h or webp/config.h +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include + ${CMAKE_CURRENT_BINARY_DIR}/include/webp +) diff --git a/cmake/cpu.cmake b/cmake/cpu.cmake new file mode 100644 index 00000000..85fb89df --- /dev/null +++ b/cmake/cpu.cmake @@ -0,0 +1,63 @@ +## Check for SIMD extensions. +set(WEBP_SIMD_FLAGS "SSE2;SSE41;AVX2") +set(WEBP_SIMD_FILE_EXTENSIONS "_sse2.c;_sse41.c;_avx2.c") +if(MSVC) + # MSVC does not have a SSE4 flag but AVX2 support implies + # SSE4 support. + set(SIMD_ENABLE_FLAGS "/arch:SSE2;/arch:AVX2;/arch:AVX2") + set(SIMD_DISABLE_FLAGS) +else() + set(SIMD_ENABLE_FLAGS "-msse2;-msse4.1;-mavx2") + set(SIMD_DISABLE_FLAGS "-mno-sse2;-mno-sse4.1;-mno-avx2") +endif() + +set(WEBP_SIMD_FILES_TO_NOT_INCLUDE) +set(WEBP_SIMD_FILES_TO_INCLUDE) +set(WEBP_SIMD_FLAGS_TO_INCLUDE) + +list(LENGTH WEBP_SIMD_FLAGS WEBP_SIMD_FLAGS_LENGTH) +math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1") + +foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE}) + list(GET WEBP_SIMD_FLAGS ${I_SIMD} WEBP_SIMD_FLAG) + list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) + set(CMAKE_REQUIRED_FLAGS ${SIMD_COMPILE_FLAG}) + check_c_source_compiles(" + #include \"${CMAKE_CURRENT_LIST_DIR}/../src/dsp/dsp.h\" + int main(void) { + #if !defined(WEBP_USE_${WEBP_SIMD_FLAG}) + this is not valid code + #endif + return 0; + } + " + WEBP_HAVE_${WEBP_SIMD_FLAG} + ) + + # Check which files we should include or not. + list(GET WEBP_SIMD_FILE_EXTENSIONS ${I_SIMD} WEBP_SIMD_FILE_EXTENSION) + file(GLOB SIMD_FILES "${CMAKE_CURRENT_LIST_DIR}/../" + "src/dsp/*${WEBP_SIMD_FILE_EXTENSION}" + ) + if(WEBP_HAVE_${WEBP_SIMD_FLAG}) + # Memorize the file and flags. + foreach(FILE ${SIMD_FILES}) + list(APPEND WEBP_SIMD_FILES_TO_INCLUDE ${FILE}) + list(APPEND WEBP_SIMD_FLAGS_TO_INCLUDE ${SIMD_COMPILE_FLAG}) + endforeach() + else() + # Remove the file from the list. + foreach(FILE ${SIMD_FILES}) + list(APPEND WEBP_SIMD_FILES_NOT_TO_INCLUDE ${FILE}) + endforeach() + # Explicitly disable SIMD. + if(SIMD_DISABLE_FLAGS) + list(GET SIMD_DISABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) + include(CheckCCompilerFlag) + check_c_compiler_flag(${SIMD_COMPILE_FLAG} HAS_COMPILE_FLAG) + if(HAS_COMPILE_FLAG) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SIMD_COMPILE_FLAG}") + endif() + endif() + endif() +endforeach()