[x265] [PATCH] cmake: use cmake 2.8 OBJECT target type to manage static and share libs
Steve Borho
steve at borho.org
Tue Oct 8 09:54:38 CEST 2013
On Tue, Oct 8, 2013 at 2:50 AM, Steve Borho <steve at borho.org> wrote:
> # HG changeset patch
> # User Steve Borho <steve at borho.org>
> # Date 1381194546 18000
> # Mon Oct 07 20:09:06 2013 -0500
> # Node ID 6b457a8c52376af24ddcad014ad1793209574e74
> # Parent 9b3a427a1009d1853bbdc30abe1fd891864e6b38
> cmake: use cmake 2.8 OBJECT target type to manage static and share libs
>
This seems like the correct approach to deal with needing to create a
static lib and shared lib from the same source base that spans several
directories; and it works perfectly with MinGW/GCC and MSVC.
However on Linux x64 I get this inexplicable error about -fPIC when clearly
everything is getting built with -fPIC (gcc) or -DPIC (yasm):
>
> With the OBJECT target type, the common and encoder folders are compiled to
> object files but not linked until main static or shared library is built.
> This
> removes the need for mergestatic.cmake and cleans up a lot of messy
> problems -
> at the cost of requiring a somewhat recent cmake.
>
> For MSVC (and presumably Xcode) we must keep the assembly as a static lib
> since
> it uses custom build commands which do not work with OBJECT target types.
> This
> static lib is then linked with the main x265.lib or x265.dll
>
> The X265_EXPORT macro is no longer necessary since we are generating both
> the
> static library and shared library from one compile we are forced to use an
> x265.def file to define DLL exports. x265.exe must link with the static
> library
> because on Windows the static lib will be empty if no EXE links with it.
>
> x265_mdate() was moved into the CLI x265.cpp so the CLI could link with the
> shared library if necessary (x265_mdate is not exported)
>
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/CMakeLists.txt
> --- a/source/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/CMakeLists.txt Mon Oct 07 20:09:06 2013 -0500
> @@ -6,7 +6,7 @@
> endif()
>
> project (x265)
> -cmake_minimum_required (VERSION 2.6)
> +cmake_minimum_required (VERSION 2.8)
>
> SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake"
> "${CMAKE_MODULE_PATH}")
>
> @@ -140,31 +140,18 @@
> endif(WINXP_SUPPORT)
> endif()
>
> -option(ENABLE_SHARED "Build shared x265 library (.dll/.so)" OFF)
> -if(ENABLE_SHARED)
> - add_definitions(-Dx265_EXPORTS)
> -endif()
> -
> include_directories(. Lib common encoder)
> add_subdirectory(common)
> add_subdirectory(encoder)
>
> -if(ENABLE_PRIMITIVES_VEC)
> - set(LIBS ${LIBS} PrimitivesVec)
> -endif(ENABLE_PRIMITIVES_VEC)
> -
> -if(ENABLE_PRIMITIVES_ASM)
> - set(LIBS ${LIBS} PrimitivesASM)
> -endif(ENABLE_PRIMITIVES_ASM)
> -set(LIBS ${LIBS} encoder common)
> -
> -if(ENABLE_SHARED)
> - add_library(x265 SHARED dllmain.cpp)
> - target_link_libraries(x265 ${LIBS})
> -elseif(NOT XCODE)
> - include(mergestaticlibs)
> - merge_static_libs(x265 ${LIBS})
> +add_library(x265-shared SHARED dllmain.cpp x265.def
> $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common>)
> +add_library(x265-static STATIC $<TARGET_OBJECTS:encoder>
> $<TARGET_OBJECTS:common>)
> +if(MSVC OR XCODE)
> + target_link_libraries(x265-shared assembly)
> + target_link_libraries(x265-static assembly)
> endif()
> +set_target_properties(x265-static PROPERTIES OUTPUT_NAME x265)
> +set_target_properties(x265-shared PROPERTIES OUTPUT_NAME x265)
>
> # Main CLI application
> option(ENABLE_CLI "Build standalone CLI application" ON)
> @@ -184,13 +171,8 @@
> add_executable(cli ../COPYING ${InputFiles} ${OutputFiles}
> x265.cpp x265opts.h x265.h
> compat/msvc/getopt.c compat/msvc/getopt.h)
> - if(XCODE OR MSVC)
> - target_link_libraries(cli ${LIBS})
> - else()
> - target_link_libraries(cli x265)
> - endif()
> - target_link_libraries(cli ${PLATFORM_LIBS})
> - SET_TARGET_PROPERTIES(cli PROPERTIES OUTPUT_NAME x265)
> + target_link_libraries(cli x265-static ${PLATFORM_LIBS})
> + set_target_properties(cli PROPERTIES OUTPUT_NAME x265)
> endif(ENABLE_CLI)
>
> # Test applications
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/cmake/mergestaticlibs.cmake
> --- a/source/cmake/mergestaticlibs.cmake Tue Oct 08 11:12:12 2013
> +0530
> +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
> @@ -1,124 +0,0 @@
> -# Copyright (C) 2012 Modelon AB
> -
> -# This program is free software: you can redistribute it and/or modify
> -# it under the terms of the BSD style license.
> -
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -# FMILIB_License.txt file for more details.
> -
> -# You should have received a copy of the FMILIB_License.txt file
> -# along with this program. If not, contact Modelon AB <
> http://www.modelon.com>.
> -
> -# Merge_static_libs(outlib lib1 lib2 ... libn) merges a number of static
> -# libs into a single static library
> -function(merge_static_libs outlib )
> - set(libs ${ARGV})
> - list(REMOVE_AT libs 0)
> - # Create a dummy file that the target will depend on
> - set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/${outlib}_dummy.c)
> - file(WRITE ${dummyfile} "const char * dummy = \"${dummyfile}\";")
> -
> - add_library(${outlib} STATIC ${dummyfile})
> -
> - if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
> - set(multiconfig FALSE)
> - else()
> - set(multiconfig TRUE)
> - endif()
> -
> - # First get the file names of the libraries to be merged
> - foreach(lib ${libs})
> - get_target_property(libtype ${lib} TYPE)
> - if(NOT libtype STREQUAL "STATIC_LIBRARY")
> - message(FATAL_ERROR "Merge_static_libs can only process
> static libraries")
> - endif()
> - if(multiconfig)
> - foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
> - get_target_property("libfile_${CONFIG_TYPE}" ${lib}
> "LOCATION_${CONFIG_TYPE}")
> - list(APPEND libfiles_${CONFIG_TYPE}
> ${libfile_${CONFIG_TYPE}})
> - endforeach()
> - else()
> - get_target_property(libfile ${lib} LOCATION)
> - list(APPEND libfiles "${libfile}")
> - endif(multiconfig)
> - endforeach()
> - message(STATUS "will be merging ${libfiles}")
> - # Just to be sure: cleanup from duplicates
> - if(multiconfig)
> - foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
> - list(REMOVE_DUPLICATES libfiles_${CONFIG_TYPE})
> - set(libfiles ${libfiles} ${libfiles_${CONFIG_TYPE}})
> - endforeach()
> - endif()
> - list(REMOVE_DUPLICATES libfiles)
> -
> - # Now the easy part for MSVC and for MAC
> - if(MSVC)
> - # lib.exe does the merging of libraries just need to conver the
> list into string
> - foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
> - set(flags "")
> - foreach(lib ${libfiles_${CONFIG_TYPE}})
> - set(flags "${flags} ${lib}")
> - endforeach()
> - string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
> - set_target_properties(${outlib} PROPERTIES ${PROPNAME}
> "${flags}")
> - endforeach()
> -
> - elseif(APPLE)
> - # Use OSX's libtool to merge archives
> - if(multiconfig)
> - message(FATAL_ERROR "Multiple configurations are not
> supported")
> - endif()
> - get_target_property(outfile ${outlib} LOCATION)
> - add_custom_command(TARGET ${outlib} POST_BUILD
> - COMMAND rm ${outfile}
> - COMMAND /usr/bin/libtool -static -o ${outfile}
> - ${libfiles})
> - else()
> - # general UNIX - need to "ar -x" and then "ar -ru"
> - if(multiconfig)
> - message(FATAL_ERROR "Multiple configurations are not
> supported")
> - endif()
> - get_target_property(outfile ${outlib} LOCATION)
> - message(STATUS "outfile location is ${outfile}")
> - foreach(lib ${libfiles})
> - # objlistfile will contain the list of object files for the
> library
> - set(objlistfile ${lib}.objlist)
> - set(objdir ${lib}.objdir)
> - set(objlistcmake ${objlistfile}.cmake)
> - # we only need to extract files once
> - if(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake.check_cache
> IS_NEWER_THAN ${objlistcmake})
> - file(WRITE ${objlistcmake}
> -"# Extract object files from the library
> -message(STATUS \"Extracting object files from ${lib}\")
> -
> - execute_process(COMMAND ${CMAKE_AR} -x ${lib}
> - WORKING_DIRECTORY ${objdir})
> - # save the list of object files
> - execute_process(COMMAND ls .
> - OUTPUT_FILE ${objlistfile}
> - WORKING_DIRECTORY ${objdir})")
> - file(MAKE_DIRECTORY ${objdir})
> - add_custom_command(
> - OUTPUT ${objlistfile}
> - COMMAND ${CMAKE_COMMAND} -P ${objlistcmake}
> - DEPENDS ${lib})
> - endif()
> - list(APPEND extrafiles "${objlistfile}")
> - add_custom_command(TARGET ${outlib} POST_BUILD
> - COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_AR} ru
> ${outfile} \\$$\\(cat ${objlistfile}\\)"
> - COMMAND ${CMAKE_AR} ru "${outfile}" $$\(cat
> "${objlistfile}"\)
> - WORKING_DIRECTORY ${objdir})
> - endforeach()
> - add_custom_command(TARGET ${outlib} POST_BUILD
> - COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_RANLIB}
> ${outfile}"
> - COMMAND ${CMAKE_RANLIB} ${outfile})
> - endif()
> - file(WRITE ${dummyfile}.base "const char*
> ${outlib}_sublibs=\"${libs}\";")
> - add_custom_command(
> - OUTPUT ${dummyfile}
> - COMMAND ${CMAKE_COMMAND} -E copy ${dummyfile}.base ${dummyfile}
> - DEPENDS ${libs} ${extrafiles})
> -endfunction()
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/CMakeLists.txt
> --- a/source/common/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/common/CMakeLists.txt Mon Oct 07 20:09:06 2013 -0500
> @@ -81,8 +81,141 @@
> endif()
> endif(MSVC)
>
> -add_library(common STATIC ../../COPYING
> +if(ENABLE_PRIMITIVES_VEC)
> + if (MSVC)
> + add_definitions(/wd4127) # conditional expression is constant
> + add_definitions(/wd4244) # 'argument' : conversion from 'int' to
> 'char', possible loss of data
> + if ("$ENV{CXX}" STREQUAL "icl")
> + add_definitions(/Qwd111) # statement is unreachable
> + add_definitions(/Qwd128) # loop is unreachable
> + add_definitions(/Qwd177) # declared function is unused
> + add_definitions(/Qwd185) # dynamic initialization in
> unreachable code
> + add_definitions(/Qwd280) # conditional expression is
> constant
> + add_definitions(/Qwd13200) # function using MMX does not
> call EMMS
> + endif()
> + set(PRIMITIVES vec/blockcopy-sse3.cpp
> + vec/pixel-sse3.cpp vec/pixel-ssse3.cpp vec/pixel-sse41.cpp
> + vec/dct-sse3.cpp vec/dct-ssse3.cpp vec/dct-sse41.cpp
> + vec/ipfilter-ssse3.cpp vec/ipfilter-sse41.cpp
> + vec/intra-sse3.cpp vec/intra-sse41.cpp)
> + if (NOT X64)
> + # x64 implies SSE4, so this flag would have no effect (and it
> issues a warning)
> + set_source_files_properties(vec/blockcopy-sse3.cpp
> + vec/pixel-sse3.cpp vec/pixel-ssse3.cpp vec/pixel-sse41.cpp
> + vec/dct-sse3.cpp vec/dct-ssse3.cpp vec/dct-sse41.cpp
> + vec/ipfilter-ssse3.cpp vec/ipfilter-sse41.cpp
> + vec/intra-sse3.cpp vec/intra-sse41.cpp
> + PROPERTIES COMPILE_FLAGS /arch:SSE2)
> + endif()
> + if (MSVC_VERSION EQUAL 1700 OR "$ENV{CXX}" STREQUAL "icl")
> + set(PRIMITIVES ${PRIMITIVES} vec/blockcopy-avx2.cpp
> vec/pixel-avx2.cpp)
> + set_source_files_properties(vec/blockcopy-avx2.cpp
> vec/pixel-avx2.cpp
> + PROPERTIES COMPILE_FLAGS /arch:AVX)
> + endif()
> + endif()
> + if(GCC)
> + if ("$ENV{CXX}" STREQUAL "icpc")
> + add_definitions(-wd13200) # function using MMX does not call
> EMMS
> + endif()
> + if("$ENV{CXX}" STREQUAL "icpc" OR NOT GCC_VERSION VERSION_LESS
> 4.3)
> + set(PRIMITIVES vec/blockcopy-sse3.cpp
> + vec/pixel-sse3.cpp vec/pixel-ssse3.cpp vec/pixel-sse41.cpp
> + vec/ipfilter-ssse3.cpp vec/ipfilter-sse41.cpp
> + vec/dct-sse3.cpp vec/dct-ssse3.cpp vec/dct-sse41.cpp
> + vec/intra-sse3.cpp vec/intra-sse41.cpp)
> + set_source_files_properties(
> + vec/blockcopy-sse3.cpp vec/pixel-sse3.cpp
> vec/dct-sse3.cpp vec/intra-sse3.cpp
> + PROPERTIES COMPILE_FLAGS "-msse3")
> + set_source_files_properties(
> + vec/ipfilter-ssse3.cpp vec/pixel-ssse3.cpp
> vec/dct-ssse3.cpp
> + PROPERTIES COMPILE_FLAGS "-mssse3")
> + set_source_files_properties(
> + vec/pixel-sse41.cpp vec/ipfilter-sse41.cpp
> vec/dct-sse41.cpp vec/intra-sse41.cpp
> + PROPERTIES COMPILE_FLAGS "-msse4.1")
> + endif()
> + if("$ENV{CXX}" STREQUAL "icpc" OR NOT GCC_VERSION VERSION_LESS
> 4.7)
> + set(PRIMITIVES ${PRIMITIVES}
> + vec/blockcopy-avx2.cpp vec/pixel-avx2.cpp)
> + set_source_files_properties(
> + vec/blockcopy-avx2.cpp vec/pixel-avx2.cpp
> + PROPERTIES COMPILE_FLAGS "-march=core-avx2")
> + endif()
> + endif(GCC)
> +
> + set(VEC_PRIMITIVES vec/vec-primitives.cpp ${PRIMITIVES})
> + source_group(Intrinsics FILES ${VEC_PRIMITIVES})
> +endif(ENABLE_PRIMITIVES_VEC)
> +
> +if(ENABLE_PRIMITIVES_ASM)
> + if (GCC)
> + add_definitions(-DHAVE_ALIGNED_STACK=1)
> + add_definitions(-Wno-error=unused-parameter)
> + else()
> + add_definitions(-DHAVE_ALIGNED_STACK=0)
> + endif()
> +
> + set(ASMS pixel-a.asm const-a.asm cpu-a.asm sad-a.asm mc-a.asm
> mc-a2.asm ipfilter8.asm)
> + if (X64)
> + add_definitions(-DARCH_X86_64=1)
> + else()
> + add_definitions(-DARCH_X86_64=0)
> + set(ASMS ${ASMS} pixel-32.asm)
> + endif()
> + foreach(ASM ${ASMS})
> + set(FULLPATHASM ${FULLPATHASM} x86/${ASM})
> + endforeach()
> +
> + if(XCODE)
> + if (X64)
> + set(FLAGS -f macho64 -m amd64 -DPREFIX -DPIC -DARCH_X86_64=1
> -DHAVE_ALIGNED_STACK=1)
> + else()
> + set(FLAGS -f macho -DPREFIX -DPIC -DARCH_X86_64=0
> -DHAVE_ALIGNED_STACK=1)
> + endif()
> + if (HIGH_BIT_DEPTH)
> + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10)
> + else()
> + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8)
> + endif()
> + foreach(ASM ${ASMS})
> + set(OBJS ${OBJS} ${ASM}.o)
> + add_custom_command(
> + OUTPUT ${ASM}.o
> + COMMAND ${YASM_EXECUTABLE} ARGS ${FLAGS}
> ${CMAKE_CURRENT_SOURCE_DIR}/x86/${ASM} -o ${ASM}.o
> + DEPENDS ${ASM})
> + endforeach()
> + add_library(assembly STATIC x86/asm-primitives.cpp x86/pixel.h
> ${OBJS})
> + elseif(MSVC)
> + # this is horrible. ugly, and hacky, and it reproduces logic found
> + # in the yasm CMake modules, but this is required because of this
> cmake bug
> + # http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170
> + if (X64)
> + set(FLAGS -f win64 -m amd64 -DARCH_X86_64=1
> -DHAVE_ALIGNED_STACK=0)
> + else()
> + set(FLAGS -f win32 -DARCH_X86_64=0 -DHAVE_ALIGNED_STACK=0
> -DPREFIX)
> + endif()
> + if (HIGH_BIT_DEPTH)
> + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10)
> + else()
> + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8)
> + endif()
> + foreach(ASM ${ASMS})
> + set(OBJS ${OBJS} ${ASM}.obj)
> + add_custom_command(
> + OUTPUT ${ASM}.obj
> + COMMAND ${YASM_EXECUTABLE} ARGS ${FLAGS}
> ${CMAKE_CURRENT_SOURCE_DIR}/x86/${ASM} -o ${ASM}.obj
> + DEPENDS ${ASM})
> + endforeach()
> + add_library(assembly STATIC x86/asm-primitives.cpp x86/pixel.h
> ${FULLPATHASM} ${OBJS})
> + else()
> + enable_language(ASM_YASM)
> + set(ASM_PRIMITIVES x86/asm-primitives.cpp x86/pixel.h
> ${FULLPATHASM})
> + endif()
> +endif(ENABLE_PRIMITIVES_ASM)
> +
> +enable_language(ASM_YASM)
> +add_library(common OBJECT
> ${LIBCOMMON_SRC} ${LIBCOMMON_HDR}
> + ${ASM_PRIMITIVES} ${VEC_PRIMITIVES}
> primitives.cpp primitives.h
> pixel.cpp dct.cpp ipfilter.cpp intrapred.cpp
> ../VectorClass/instrset_detect.cpp
> @@ -94,10 +227,3 @@
> reference.cpp reference.h
> common.cpp common.h
> lowres.cpp lowres.h)
> -
> -if(ENABLE_PRIMITIVES_VEC)
> - add_subdirectory(vec)
> -endif(ENABLE_PRIMITIVES_VEC)
> -if(ENABLE_PRIMITIVES_ASM)
> - add_subdirectory(x86)
> -endif(ENABLE_PRIMITIVES_ASM)
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/common.cpp
> --- a/source/common/common.cpp Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/common/common.cpp Mon Oct 07 20:09:06 2013 -0500
> @@ -32,14 +32,6 @@
> #include <string.h>
> #include <stdarg.h>
>
> -#if _WIN32
> -#include <sys/types.h>
> -#include <sys/timeb.h>
> -#else
> -#include <sys/time.h>
> -#endif
> -#include <time.h>
> -
> using namespace x265;
>
> #if HIGH_BIT_DEPTH
> @@ -117,7 +109,7 @@
> }
>
> extern "C"
> -X265_EXPORT void x265_param_default(x265_param_t *param)
> +void x265_param_default(x265_param_t *param)
> {
> memset(param, 0, sizeof(x265_param_t));
>
> @@ -184,14 +176,14 @@
> }
>
> extern "C"
> -X265_EXPORT void x265_picture_init(x265_param_t *param, x265_picture_t
> *pic)
> +void x265_picture_init(x265_param_t *param, x265_picture_t *pic)
> {
> memset(pic, 0, sizeof(x265_picture_t));
> pic->bitDepth = param->internalBitDepth;
> }
>
> extern "C"
> -X265_EXPORT int x265_param_apply_profile(x265_param_t *param, const char
> *profile)
> +int x265_param_apply_profile(x265_param_t *param, const char *profile)
> {
> if (!profile)
> return 0;
> @@ -429,16 +421,3 @@
> fprintf(stderr, "\n");
> fflush(stderr);
> }
> -
> -int64_t x265_mdate(void)
> -{
> -#if _WIN32
> - struct timeb tb;
> - ftime(&tb);
> - return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
> -#else
> - struct timeval tv_date;
> - gettimeofday(&tv_date, NULL);
> - return (int64_t)tv_date.tv_sec * 1000000 + (int64_t)tv_date.tv_usec;
> -#endif
> -}
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/common.h
> --- a/source/common/common.h Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/common/common.h Mon Oct 07 20:09:06 2013 -0500
> @@ -139,9 +139,5 @@
> int x265_check_params(x265_param_t *param);
> void x265_print_params(x265_param_t *param);
> int x265_set_globals(x265_param_t *param);
> -int64_t x265_mdate(void);
> -
> -/* defined in primitives.cpp */
> -void x265_setup_primitives(x265_param_t *param, int cpuid = 0);
>
> #endif // ifndef X265_COMMON_H
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/primitives.cpp
> --- a/source/common/primitives.cpp Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/common/primitives.cpp Mon Oct 07 20:09:06 2013 -0500
> @@ -90,7 +90,7 @@
> * cpuid > 0 - force CPU type
> * cpuid < 0 - auto-detect if uninitialized */
> extern "C"
> -X265_EXPORT void x265_setup_primitives(x265_param_t *param, int cpuid)
> +void x265_setup_primitives(x265_param_t *param, int cpuid)
> {
> // initialize global variables
> initROM();
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/vec/CMakeLists.txt
> --- a/source/common/vec/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
> @@ -1,67 +0,0 @@
> -if (MSVC)
> - add_definitions(/wd4127) # conditional expression is constant
> - add_definitions(/wd4244) # 'argument' : conversion from 'int' to
> 'char', possible loss of data
> - if ("$ENV{CXX}" STREQUAL "icl")
> - add_definitions(/Qwd111) # statement is unreachable
> - add_definitions(/Qwd128) # loop is unreachable
> - add_definitions(/Qwd177) # declared function is unused
> - add_definitions(/Qwd185) # dynamic initialization in
> unreachable code
> - add_definitions(/Qwd280) # conditional expression is constant
> - add_definitions(/Qwd13200) # function using MMX does not call
> EMMS
> - endif()
> - set(PRIMITIVES blockcopy-sse3.cpp
> - pixel-sse3.cpp pixel-ssse3.cpp pixel-sse41.cpp
> - dct-sse3.cpp dct-ssse3.cpp dct-sse41.cpp
> - ipfilter-ssse3.cpp ipfilter-sse41.cpp
> - intra-sse3.cpp intra-sse41.cpp)
> - if (NOT X64)
> - # x64 implies SSE4, so this flag would have no effect (and it
> issues a warning)
> - set_source_files_properties(blockcopy-sse3.cpp
> - pixel-sse3.cpp pixel-ssse3.cpp pixel-sse41.cpp
> - dct-sse3.cpp dct-ssse3.cpp dct-sse41.cpp
> - ipfilter-ssse3.cpp ipfilter-sse41.cpp
> - intra-sse3.cpp intra-sse41.cpp
> - PROPERTIES COMPILE_FLAGS /arch:SSE2)
> - endif()
> - if (MSVC_VERSION EQUAL 1700 OR "$ENV{CXX}" STREQUAL "icl")
> - set(PRIMITIVES ${PRIMITIVES} blockcopy-avx2.cpp pixel-avx2.cpp)
> - set_source_files_properties( blockcopy-avx2.cpp pixel-avx2.cpp
> - PROPERTIES COMPILE_FLAGS /arch:AVX)
> - endif()
> -endif()
> -if(GCC)
> - if ("$ENV{CXX}" STREQUAL "icpc")
> - add_definitions(-wd13200) # function using MMX does not call EMMS
> - endif()
> - if("$ENV{CXX}" STREQUAL "icpc" OR NOT GCC_VERSION VERSION_LESS 4.3)
> - set(PRIMITIVES blockcopy-sse3.cpp
> - pixel-sse3.cpp pixel-ssse3.cpp pixel-sse41.cpp
> - ipfilter-ssse3.cpp ipfilter-sse41.cpp
> - dct-sse3.cpp dct-ssse3.cpp dct-sse41.cpp
> - intra-sse3.cpp intra-sse41.cpp)
> - set_source_files_properties(
> - blockcopy-sse3.cpp pixel-sse3.cpp dct-sse3.cpp intra-sse3.cpp
> - PROPERTIES COMPILE_FLAGS "-msse3")
> - set_source_files_properties(
> - ipfilter-ssse3.cpp pixel-ssse3.cpp dct-ssse3.cpp
> - PROPERTIES COMPILE_FLAGS "-mssse3")
> - set_source_files_properties(
> - pixel-sse41.cpp ipfilter-sse41.cpp dct-sse41.cpp
> intra-sse41.cpp
> - PROPERTIES COMPILE_FLAGS "-msse4.1")
> - endif()
> - if("$ENV{CXX}" STREQUAL "icpc" OR NOT GCC_VERSION VERSION_LESS 4.7)
> - set(PRIMITIVES ${PRIMITIVES}
> - blockcopy-avx2.cpp pixel-avx2.cpp)
> - set_source_files_properties(
> - blockcopy-avx2.cpp pixel-avx2.cpp
> - PROPERTIES COMPILE_FLAGS "-march=core-avx2")
> - endif()
> -endif(GCC)
> -
> -file(GLOB VECTORCLASS ../../VectorClass/*.h ../../VectorClass/special/*.h)
> -source_group(VectorClass FILES ${VECTORCLASS})
> -
> -add_library(PrimitivesVec STATIC vec-primitives.cpp ${PRIMITIVES}
> ${VECTORCLASS}
> - # *.inc files listed here show up in Visual Studio, but are
> not built
> - # it is simply a convenience to make them easy to edit
> - pixel.inc pixel8.inc pixel16.inc sse.inc)
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/common/x86/CMakeLists.txt
> --- a/source/common/x86/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
> @@ -1,60 +0,0 @@
> -if (GCC)
> - add_definitions(-DHAVE_ALIGNED_STACK=1)
> - add_definitions(-Wno-error=unused-parameter)
> -else()
> - add_definitions(-DHAVE_ALIGNED_STACK=0)
> -endif()
> -
> -set(ASMS pixel-a.asm const-a.asm cpu-a.asm sad-a.asm mc-a.asm mc-a2.asm
> ipfilter8.asm)
> -if (X64)
> - add_definitions(-DARCH_X86_64=1)
> -else()
> - add_definitions(-DARCH_X86_64=0)
> - set(ASMS ${ASMS} pixel-32.asm)
> -endif()
> -
> -if(XCODE)
> - if (X64)
> - set(FLAGS -f macho64 -m amd64 -DPREFIX -DPIC -DARCH_X86_64=1
> -DHAVE_ALIGNED_STACK=1)
> - else()
> - set(FLAGS -f macho -DPREFIX -DPIC -DARCH_X86_64=0
> -DHAVE_ALIGNED_STACK=1)
> - endif()
> - if (HIGH_BIT_DEPTH)
> - set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10)
> - else()
> - set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8)
> - endif()
> - foreach(ASM ${ASMS})
> - set(OBJS ${OBJS} ${ASM}.o)
> - add_custom_command(
> - OUTPUT ${ASM}.o
> - COMMAND ${YASM_EXECUTABLE} ARGS ${FLAGS}
> ${CMAKE_CURRENT_SOURCE_DIR}/${ASM} -o ${ASM}.o
> - DEPENDS ${ASM})
> - endforeach()
> - add_library(PrimitivesASM asm-primitives.cpp pixel.h ${OBJS})
> -elseif(MSVC)
> - # this is horrible. ugly, and hacky, and it reproduces logic found
> - # in the yasm CMake modules, but this is required because of this
> cmake bug
> - # http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170
> - if (X64)
> - set(FLAGS -f win64 -m amd64 -DARCH_X86_64=1
> -DHAVE_ALIGNED_STACK=0)
> - else()
> - set(FLAGS -f win32 -DARCH_X86_64=0 -DHAVE_ALIGNED_STACK=0
> -DPREFIX)
> - endif()
> - if (HIGH_BIT_DEPTH)
> - set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10)
> - else()
> - set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8)
> - endif()
> - foreach(ASM ${ASMS})
> - set(OBJS ${OBJS} ${ASM}.obj)
> - add_custom_command(
> - OUTPUT ${ASM}.obj
> - COMMAND ${YASM_EXECUTABLE} ARGS ${FLAGS}
> ${CMAKE_CURRENT_SOURCE_DIR}/${ASM} -o ${ASM}.obj
> - DEPENDS ${ASM})
> - endforeach()
> - add_library(PrimitivesASM STATIC asm-primitives.cpp pixel.h ${ASMS}
> ${OBJS})
> -else()
> - enable_language(ASM_YASM)
> - add_library(PrimitivesASM STATIC asm-primitives.cpp pixel.h ${ASMS})
> -endif()
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/encoder/CMakeLists.txt
> --- a/source/encoder/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/encoder/CMakeLists.txt Mon Oct 07 20:09:06 2013 -0500
> @@ -60,7 +60,7 @@
> "/wd4244 /wd4512 /wd4127 /wd4389 /wd4018 /wd4800")
> endif(MSVC)
>
> -add_library(encoder STATIC ../../COPYING ../x265.h
> +add_library(encoder OBJECT ../x265.h
> ${LIBENCODER_SRC} ${LIBENCODER_HDR}
> bitcost.cpp bitcost.h
> motion.cpp motion.h
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/encoder/encoder.cpp Mon Oct 07 20:09:06 2013 -0500
> @@ -340,7 +340,7 @@
> }
>
> extern "C"
> -X265_EXPORT x265_t *x265_encoder_open(x265_param_t *param)
> +x265_t *x265_encoder_open(x265_param_t *param)
> {
> x265_setup_primitives(param, -1); // -1 means auto-detect if
> uninitialized
>
> @@ -369,7 +369,7 @@
> }
>
> extern "C"
> -X265_EXPORT int x265_encoder_headers(x265_t *encoder, x265_nal_t
> **pp_nal, int *pi_nal)
> +int x265_encoder_headers(x265_t *encoder, x265_nal_t **pp_nal, int
> *pi_nal)
> {
> if (!pp_nal)
> return 0;
> @@ -401,7 +401,7 @@
> }
>
> extern "C"
> -X265_EXPORT int x265_encoder_encode(x265_t *encoder, x265_nal_t **pp_nal,
> int *pi_nal, x265_picture_t *pic_in, x265_picture_t *pic_out)
> +int x265_encoder_encode(x265_t *encoder, x265_nal_t **pp_nal, int
> *pi_nal, x265_picture_t *pic_in, x265_picture_t *pic_out)
> {
> NALUnitEBSP *nalunits[MAX_NAL_UNITS] = {0, 0, 0, 0, 0};
> int numEncoded = encoder->encode(!pic_in, pic_in, pic_out, nalunits);
> @@ -429,13 +429,13 @@
> EXTERN_CYCLE_COUNTER(ME);
>
> extern "C"
> -X265_EXPORT void x265_encoder_get_stats(x265_t *encoder, x265_stats_t
> *outputStats)
> +void x265_encoder_get_stats(x265_t *encoder, x265_stats_t *outputStats)
> {
> encoder->fetchStats(outputStats);
> }
>
> extern "C"
> -X265_EXPORT void x265_encoder_close(x265_t *encoder, double *outPsnr)
> +void x265_encoder_close(x265_t *encoder, double *outPsnr)
> {
> double globalPsnr = encoder->printSummary();
>
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/test/CMakeLists.txt
> --- a/source/test/CMakeLists.txt Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/test/CMakeLists.txt Mon Oct 07 20:09:06 2013 -0500
> @@ -4,7 +4,7 @@
> mbdstharness.cpp mbdstharness.h
> ipfilterharness.cpp ipfilterharness.h
> intrapredharness.cpp intrapredharness.h)
> -target_link_libraries(TestBench x265 ${PLATFORM_LIBS})
> +target_link_libraries(TestBench x265-static ${PLATFORM_LIBS})
>
> add_executable(PoolTest testpool.cpp)
> -target_link_libraries(PoolTest x265 ${PLATFORM_LIBS})
> +target_link_libraries(PoolTest x265-static ${PLATFORM_LIBS})
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/x265.cpp
> --- a/source/x265.cpp Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/x265.cpp Mon Oct 07 20:09:06 2013 -0500
> @@ -36,6 +36,14 @@
> #endif
> #include "PPA/ppa.h"
>
> +#if _WIN32
> +#include <sys/types.h>
> +#include <sys/timeb.h>
> +#else
> +#include <sys/time.h>
> +#endif
> +#include <time.h>
> +
> #include <signal.h>
> #include <errno.h>
> #include <fcntl.h>
> @@ -45,7 +53,6 @@
> #include <string.h>
> #include <stdio.h>
> #include <string>
> -#include <time.h>
> #include <list>
> #include <ostream>
> #include <fstream>
> @@ -57,6 +64,19 @@
> #define SetConsoleTitle(t)
> #endif
>
> +static int64_t x265_mdate(void)
> +{
> +#if _WIN32
> + struct timeb tb;
> + ftime(&tb);
> + return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
> +#else
> + struct timeval tv_date;
> + gettimeofday(&tv_date, NULL);
> + return (int64_t)tv_date.tv_sec * 1000000 + (int64_t)tv_date.tv_usec;
> +#endif
> +}
> +
> using namespace x265;
> using namespace std;
>
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/x265.def
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/source/x265.def Mon Oct 07 20:09:06 2013 -0500
> @@ -0,0 +1,12 @@
> +EXPORTS
> +x265_setup_primitives
> +x265_param_default
> +x265_picture_init
> +x265_param_apply_profile
> +x265_max_bit_depth
> +x265_encoder_open
> +x265_encoder_headers
> +x265_encoder_encode
> +x265_encoder_get_stats
> +x265_encoder_close
> +x265_cleanup
> diff -r 9b3a427a1009 -r 6b457a8c5237 source/x265.h
> --- a/source/x265.h Tue Oct 08 11:12:12 2013 +0530
> +++ b/source/x265.h Mon Oct 07 20:09:06 2013 -0500
> @@ -30,12 +30,6 @@
> extern "C" {
> #endif
>
> -#if defined(WIN32) && defined(x265_EXPORTS)
> -#define X265_EXPORT __declspec(dllexport)
> -#else
> -#define X265_EXPORT
> -#endif
> -
> /* x265_t:
> * opaque handler for encoder */
> typedef struct x265_t x265_t;
> @@ -315,17 +309,17 @@
> /***
> * If not called, first encoder allocated will auto-detect the CPU and
> * initialize performance primitives, which are process global */
> -X265_EXPORT void x265_setup_primitives(x265_param_t *param, int cpulevel);
> +void x265_setup_primitives(x265_param_t *param, int cpulevel);
>
> /***
> * Initialize an x265_param_t structure to default values
> */
> -X265_EXPORT void x265_param_default(x265_param_t *param);
> +void x265_param_default(x265_param_t *param);
>
> /***
> * Initialize an x265_picture_t structure to default values
> */
> -X265_EXPORT void x265_picture_init(x265_param_t *param, x265_picture_t
> *pic);
> +void x265_picture_init(x265_param_t *param, x265_picture_t *pic);
>
> /* x265_param_apply_profile:
> * Applies the restrictions of the given profile. (one of below) */
> @@ -333,7 +327,7 @@
>
> /* (can be NULL, in which case the function will do nothing)
> * returns 0 on success, negative on failure (e.g. invalid profile
> name). */
> -X265_EXPORT int x265_param_apply_profile(x265_param_t *, const char
> *profile);
> +int x265_param_apply_profile(x265_param_t *, const char *profile);
>
> /* x265_max_bit_depth:
> * Specifies the maximum number of bits per pixel that x265 can
> input. This
> @@ -342,38 +336,38 @@
> * x265_max_bit_depth is 12, the internal and input bit depths can be
> * either 8, 10, or 12. Note that the internal bit depth must be the
> same
> * for all encoders allocated in the same process. */
> -X265_EXPORT extern const int x265_max_bit_depth;
> +extern const int x265_max_bit_depth;
>
> /* x265_encoder_open:
> * create a new encoder handler, all parameters from x265_param_t
> are copied */
> -X265_EXPORT x265_t* x265_encoder_open(x265_param_t *);
> +x265_t* x265_encoder_open(x265_param_t *);
>
> /* x265_encoder_headers:
> * return the SPS and PPS that will be used for the whole stream.
> * *pi_nal is the number of NAL units outputted in pp_nal.
> * returns negative on error.
> * the payloads of all output NALs are guaranteed to be sequential
> in memory. */
> -X265_EXPORT int x265_encoder_headers(x265_t *, x265_nal_t **pp_nal, int
> *pi_nal);
> +int x265_encoder_headers(x265_t *, x265_nal_t **pp_nal, int *pi_nal);
>
> /* x265_encoder_encode:
> * encode one picture.
> * *pi_nal is the number of NAL units outputted in pp_nal.
> * returns negative on error, zero if no NAL units returned.
> * the payloads of all output NALs are guaranteed to be sequential
> in memory. */
> -X265_EXPORT int x265_encoder_encode(x265_t *encoder, x265_nal_t **pp_nal,
> int *pi_nal, x265_picture_t *pic_in, x265_picture_t *pic_out);
> +int x265_encoder_encode(x265_t *encoder, x265_nal_t **pp_nal, int
> *pi_nal, x265_picture_t *pic_in, x265_picture_t *pic_out);
>
> /* x265_encoder_stats:
> * returns output stats from the encoder */
> -X265_EXPORT void x265_encoder_get_stats(x265_t *encoder, x265_stats_t *);
> +void x265_encoder_get_stats(x265_t *encoder, x265_stats_t *);
>
> /* x265_encoder_close:
> * close an encoder handler. Optionally return the global PSNR
> value (6 * psnrY + psnrU + psnrV) / 8 */
> -X265_EXPORT void x265_encoder_close(x265_t *, double *globalPsnr);
> +void x265_encoder_close(x265_t *, double *globalPsnr);
>
> /***
> * Release library static allocations
> */
> -X265_EXPORT void x265_cleanup(void);
> +void x265_cleanup(void);
>
> #ifdef __cplusplus
> }
>
--
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20131008/0ff2e534/attachment-0001.html>
More information about the x265-devel
mailing list