790 lines
30 KiB
CMake
790 lines
30 KiB
CMake
# vim: syntax=cmake
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
# default to Release build for GCC builds
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING
|
|
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
|
|
FORCE)
|
|
endif()
|
|
message(STATUS "cmake version ${CMAKE_VERSION}")
|
|
if(POLICY CMP0025)
|
|
cmake_policy(SET CMP0025 OLD) # report Apple's Clang as just Clang
|
|
endif()
|
|
if(POLICY CMP0042)
|
|
cmake_policy(SET CMP0042 NEW) # MACOSX_RPATH
|
|
endif()
|
|
if(POLICY CMP0054)
|
|
cmake_policy(SET CMP0054 OLD) # Only interpret if() arguments as variables or keywords when unquoted
|
|
endif()
|
|
|
|
project (x265)
|
|
cmake_minimum_required (VERSION 2.8.8) # OBJECT libraries require 2.8.8
|
|
include(CheckIncludeFiles)
|
|
include(CheckFunctionExists)
|
|
include(CheckSymbolExists)
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
option(FPROFILE_GENERATE "Compile executable to generate usage data" OFF)
|
|
option(FPROFILE_USE "Compile executable using generated usage data" OFF)
|
|
option(NATIVE_BUILD "Target the build CPU" OFF)
|
|
option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
|
|
mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
|
|
# X265_BUILD must be incremented each time the public API is changed
|
|
set(X265_BUILD 192)
|
|
configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
|
|
"${PROJECT_BINARY_DIR}/x265.def")
|
|
configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
|
|
"${PROJECT_BINARY_DIR}/x265_config.h")
|
|
|
|
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")
|
|
|
|
# System architecture detection
|
|
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
|
|
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
|
|
set(ARM_ALIASES armv6l armv7 armv7s aarch64)
|
|
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
|
|
list(FIND ARM_ALIASES "${SYSPROC}" ARMMATCH)
|
|
set(POWER_ALIASES ppc64 ppc64le)
|
|
list(FIND POWER_ALIASES "${SYSPROC}" POWERMATCH)
|
|
if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
|
|
set(X86 1)
|
|
add_definitions(-DX265_ARCH_X86=1)
|
|
if(CMAKE_CXX_FLAGS STREQUAL "-m32")
|
|
message(STATUS "Detected x86 target processor")
|
|
elseif("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
|
|
set(X64 1)
|
|
add_definitions(-DX86_64=1)
|
|
message(STATUS "Detected x86_64 target processor")
|
|
endif()
|
|
elseif(POWERMATCH GREATER "-1")
|
|
message(STATUS "Detected POWER target processor")
|
|
set(POWER 1)
|
|
add_definitions(-DX265_ARCH_POWER=1)
|
|
if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
|
|
set(PPC64 1)
|
|
add_definitions(-DPPC64=1)
|
|
message(STATUS "Detected POWER PPC64 target processor")
|
|
endif()
|
|
elseif(ARMMATCH GREATER "-1")
|
|
if(CROSS_COMPILE_ARM)
|
|
message(STATUS "Cross compiling for ARM arch")
|
|
else()
|
|
set(CROSS_COMPILE_ARM 0)
|
|
endif()
|
|
set(ARM 1)
|
|
if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
|
|
message(STATUS "Detected ARM64 target processor")
|
|
set(ARM64 1)
|
|
add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=1 -DHAVE_ARMV6=0)
|
|
else()
|
|
message(STATUS "Detected ARM target processor")
|
|
add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=0)
|
|
endif()
|
|
else()
|
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
|
|
message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
|
|
endif()
|
|
|
|
if(UNIX)
|
|
list(APPEND PLATFORM_LIBS pthread)
|
|
find_library(LIBRT rt)
|
|
if(LIBRT)
|
|
list(APPEND PLATFORM_LIBS rt)
|
|
endif()
|
|
mark_as_advanced(LIBRT)
|
|
find_library(LIBDL dl)
|
|
if(LIBDL)
|
|
list(APPEND PLATFORM_LIBS dl)
|
|
endif()
|
|
option(ENABLE_LIBNUMA "Enable libnuma usage (Linux only)" ON)
|
|
if(ENABLE_LIBNUMA)
|
|
find_package(Numa)
|
|
if(NUMA_FOUND)
|
|
link_directories(${NUMA_LIBRARY_DIR})
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES numa)
|
|
list(APPEND CMAKE_REQUIRED_INCLUDES ${NUMA_INCLUDE_DIR})
|
|
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-L${NUMA_LIBRARY_DIR}")
|
|
check_symbol_exists(numa_node_of_cpu numa.h NUMA_V2)
|
|
if(NUMA_V2)
|
|
add_definitions(-DHAVE_LIBNUMA)
|
|
message(STATUS "libnuma found, building with support for NUMA nodes")
|
|
list(APPEND PLATFORM_LIBS numa)
|
|
include_directories(${NUMA_INCLUDE_DIR})
|
|
endif()
|
|
endif()
|
|
mark_as_advanced(NUMA_FOUND)
|
|
endif(ENABLE_LIBNUMA)
|
|
option(NO_ATOMICS "Use a slow mutex to replace atomics" OFF)
|
|
if(NO_ATOMICS)
|
|
add_definitions(-DNO_ATOMICS=1)
|
|
endif(NO_ATOMICS)
|
|
find_library(VMAF vmaf)
|
|
option(ENABLE_LIBVMAF "Enable VMAF" OFF)
|
|
if(ENABLE_LIBVMAF)
|
|
add_definitions(-DENABLE_LIBVMAF)
|
|
endif()
|
|
endif(UNIX)
|
|
|
|
if(X64 AND NOT WIN32)
|
|
option(ENABLE_PIC "Enable Position Independent Code" ON)
|
|
else()
|
|
option(ENABLE_PIC "Enable Position Independent Code" OFF)
|
|
endif(X64 AND NOT WIN32)
|
|
|
|
# Compiler detection
|
|
if(CMAKE_GENERATOR STREQUAL "Xcode")
|
|
set(XCODE 1)
|
|
endif()
|
|
if(APPLE)
|
|
add_definitions(-DMACOS=1)
|
|
endif()
|
|
|
|
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
|
|
set(CLANG 1)
|
|
endif()
|
|
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel")
|
|
set(INTEL_CXX 1)
|
|
endif()
|
|
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
|
|
set(GCC 1)
|
|
endif()
|
|
|
|
if(INTEL_CXX AND WIN32)
|
|
# treat icl roughly like MSVC
|
|
set(MSVC 1)
|
|
endif()
|
|
if(MSVC)
|
|
if(STATIC_LINK_CRT)
|
|
set(CompilerFlags CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE)
|
|
foreach(CompilerFlag ${CompilerFlags})
|
|
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
|
|
endforeach()
|
|
endif(STATIC_LINK_CRT)
|
|
add_definitions(/W4) # Full warnings
|
|
add_definitions(/Ob2) # always inline
|
|
add_definitions(/MP) # multithreaded build
|
|
|
|
# disable Microsofts suggestions for proprietary secure APIs
|
|
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
|
|
|
|
check_include_files(stdint.h HAVE_STDINT_H)
|
|
if(NOT HAVE_STDINT_H)
|
|
include_directories(compat/msvc)
|
|
endif()
|
|
endif(MSVC)
|
|
|
|
check_include_files(inttypes.h HAVE_INT_TYPES_H)
|
|
if(HAVE_INT_TYPES_H)
|
|
add_definitions(-DHAVE_INT_TYPES_H=1)
|
|
endif()
|
|
|
|
if(INTEL_CXX AND UNIX)
|
|
set(GCC 1) # treat icpc roughly like gcc
|
|
elseif(CLANG)
|
|
set(GCC 1) # treat clang roughly like gcc
|
|
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(GCC 1)
|
|
endif()
|
|
|
|
if(CC STREQUAL "xlc")
|
|
message(STATUS "Use XLC compiler")
|
|
set(XLC 1)
|
|
set(GCC 0)
|
|
#set(CMAKE_C_COMPILER "/usr/bin/xlc")
|
|
#set(CMAKE_CXX_COMPILER "/usr/bin/xlc++")
|
|
add_definitions(-D__XLC__=1)
|
|
add_definitions(-O3 -qstrict -qhot -qaltivec)
|
|
add_definitions(-qinline=level=10 -qpath=IL:/data/video_files/latest.tpo/)
|
|
endif()
|
|
# this option is to enable the inclusion of dynamic HDR10 library to the libx265 compilation
|
|
option(ENABLE_HDR10_PLUS "Enable dynamic HDR10 compilation" OFF)
|
|
if(MSVC AND (MSVC_VERSION LESS 1800) AND ENABLE_HDR10_PLUS)
|
|
message(FATAL_ERROR "MSVC version 12.0 or above required to support hdr10plus")
|
|
endif()
|
|
if(WIN32 AND (MSVC_VERSION GREATER 1800))
|
|
if(CMAKE_VERSION VERSION_LESS 3.7)
|
|
message(FATAL_ERROR "cmake version not compatible for VS 2017. Update the cmake to versions 3.7 or above")
|
|
endif()
|
|
endif()
|
|
if(GCC)
|
|
add_definitions(-Wall -Wextra -Wshadow)
|
|
add_definitions(-D__STDC_LIMIT_MACROS=1)
|
|
if(NOT INTEL_CXX AND NOT CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0)
|
|
add_definitions(-Wno-class-memaccess)
|
|
endif()
|
|
if(ENABLE_HDR10_PLUS)
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8")
|
|
message(FATAL_ERROR "gcc version above 4.8 required to support hdr10plus")
|
|
endif()
|
|
add_definitions(-std=gnu++11)
|
|
else()
|
|
add_definitions(-std=gnu++98)
|
|
endif()
|
|
if(ENABLE_PIC)
|
|
add_definitions(-fPIC)
|
|
endif(ENABLE_PIC)
|
|
if(NATIVE_BUILD)
|
|
if(INTEL_CXX)
|
|
add_definitions(-xhost)
|
|
else()
|
|
add_definitions(-march=native)
|
|
endif()
|
|
elseif(X86 AND NOT X64)
|
|
string(FIND "${CMAKE_CXX_FLAGS}" "-march" marchPos)
|
|
if(marchPos LESS "0")
|
|
add_definitions(-march=i686)
|
|
if(WIN32 AND NOT INTEL_CXX AND NOT CLANG AND
|
|
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)
|
|
add_definitions(-mpreferred-stack-boundary=2)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
if(ARM AND CROSS_COMPILE_ARM)
|
|
message(STATUS "cross compile arm")
|
|
separate_arguments(AS_ARGUMENTS WINDOWS_COMMAND $ENV{AS_ARGUMENTS})
|
|
separate_arguments(ARM_ARGS WINDOWS_COMMAND $ENV{ASM_FLAGS})
|
|
# ALL IOS ARM CPUS HAVE NEON
|
|
add_definitions(-DHAVE_NEON)
|
|
elseif(ARM)
|
|
if(ARM64)
|
|
set(ARM_ARGS -fPIC)
|
|
add_definitions(-DHAVE_NEON)
|
|
else()
|
|
find_package(Neon)
|
|
if(CPU_HAS_NEON)
|
|
set(ARM_ARGS -mcpu=native -mfloat-abi=hard -mfpu=neon -marm -fPIC)
|
|
add_definitions(-DHAVE_NEON)
|
|
else()
|
|
set(ARM_ARGS -mcpu=native -mfloat-abi=hard -mfpu=vfp -marm)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
add_definitions(${ARM_ARGS})
|
|
if(FPROFILE_GENERATE)
|
|
if(INTEL_CXX)
|
|
add_definitions(-prof-gen -prof-dir="${CMAKE_CURRENT_BINARY_DIR}")
|
|
list(APPEND LINKER_OPTIONS "-prof-gen")
|
|
else()
|
|
check_cxx_compiler_flag(-fprofile-generate CC_HAS_PROFILE_GENERATE)
|
|
if(CC_HAS_PROFILE_GENERATE)
|
|
add_definitions(-fprofile-generate)
|
|
list(APPEND LINKER_OPTIONS "-fprofile-generate")
|
|
endif(CC_HAS_PROFILE_GENERATE)
|
|
endif(INTEL_CXX)
|
|
endif(FPROFILE_GENERATE)
|
|
if(FPROFILE_USE)
|
|
if(INTEL_CXX)
|
|
add_definitions(-prof-use -prof-dir="${CMAKE_CURRENT_BINARY_DIR}")
|
|
list(APPEND LINKER_OPTIONS "-prof-use")
|
|
else()
|
|
check_cxx_compiler_flag(-fprofile-use CC_HAS_PROFILE_USE)
|
|
check_cxx_compiler_flag(-fprofile-correction CC_HAS_PROFILE_CORRECTION)
|
|
check_cxx_compiler_flag(-Wno-error=coverage-mismatch CC_HAS_COVMISMATCH)
|
|
if(CC_HAS_PROFILE_USE)
|
|
add_definitions(-fprofile-use)
|
|
list(APPEND LINKER_OPTIONS "-fprofile-use")
|
|
endif(CC_HAS_PROFILE_USE)
|
|
if(CC_HAS_PROFILE_CORRECTION)
|
|
# auto-correct corrupted counters (happens a lot with x265)
|
|
add_definitions(-fprofile-correction)
|
|
endif(CC_HAS_PROFILE_CORRECTION)
|
|
if(CC_HAS_COVMISMATCH)
|
|
# ignore coverage mismatches (also happens a lot)
|
|
add_definitions(-Wno-error=coverage-mismatch)
|
|
endif(CC_HAS_COVMISMATCH)
|
|
endif(INTEL_CXX)
|
|
endif(FPROFILE_USE)
|
|
if(STATIC_LINK_CRT)
|
|
add_definitions(-static)
|
|
list(APPEND LINKER_OPTIONS "-static-libgcc")
|
|
endif(STATIC_LINK_CRT)
|
|
check_cxx_compiler_flag(-Wno-strict-overflow CC_HAS_NO_STRICT_OVERFLOW)
|
|
check_cxx_compiler_flag(-Wno-narrowing CC_HAS_NO_NARROWING)
|
|
check_cxx_compiler_flag(-Wno-array-bounds CC_HAS_NO_ARRAY_BOUNDS)
|
|
if (CC_HAS_NO_ARRAY_BOUNDS)
|
|
add_definitions(-Wno-array-bounds) # these are unhelpful
|
|
endif()
|
|
check_cxx_compiler_flag(-ffast-math CC_HAS_FAST_MATH)
|
|
if (CC_HAS_FAST_MATH)
|
|
add_definitions(-ffast-math)
|
|
endif()
|
|
check_cxx_compiler_flag(-mstackrealign CC_HAS_STACK_REALIGN)
|
|
if (CC_HAS_STACK_REALIGN)
|
|
add_definitions(-mstackrealign)
|
|
endif()
|
|
# Disable exceptions. Reduce executable size, increase compability.
|
|
check_cxx_compiler_flag(-fno-exceptions CC_HAS_FNO_EXCEPTIONS_FLAG)
|
|
if(CC_HAS_FNO_EXCEPTIONS_FLAG)
|
|
add_definitions(-fno-exceptions)
|
|
endif()
|
|
set(FSANITIZE "" CACHE STRING "-fsanitize options for GCC/clang")
|
|
if(FSANITIZE)
|
|
add_definitions(-fsanitize=${FSANITIZE})
|
|
# clang and gcc need the sanitize options to be passed at link
|
|
# time so the appropriate ASAN/TSAN runtime libraries can be
|
|
# linked.
|
|
list(APPEND LINKER_OPTIONS "-fsanitize=${FSANITIZE}")
|
|
endif()
|
|
option(ENABLE_AGGRESSIVE_CHECKS "Enable stack protection and -ftrapv" OFF)
|
|
if(ENABLE_AGGRESSIVE_CHECKS)
|
|
# use with care, -ftrapv can cause testbench SIGILL exceptions
|
|
# since it is testing corner cases of signed integer math
|
|
add_definitions(-DUSING_FTRAPV=1)
|
|
check_cxx_compiler_flag(-fsanitize=undefined-trap CC_HAS_CATCH_UNDEFINED) # clang
|
|
check_cxx_compiler_flag(-ftrapv CC_HAS_FTRAPV) # gcc
|
|
check_cxx_compiler_flag(-fstack-protector-all CC_HAS_STACK_PROTECT) # gcc
|
|
if(CC_HAS_FTRAPV)
|
|
add_definitions(-ftrapv)
|
|
endif()
|
|
if(CC_HAS_CATCH_UNDEFINED)
|
|
add_definitions(-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error)
|
|
endif()
|
|
if(CC_HAS_STACK_PROTECT)
|
|
add_definitions(-fstack-protector-all)
|
|
if(MINGW)
|
|
list(APPEND PLATFORM_LIBS ssp)
|
|
endif()
|
|
endif()
|
|
endif(ENABLE_AGGRESSIVE_CHECKS)
|
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION)
|
|
endif(GCC)
|
|
|
|
find_package(Nasm)
|
|
if(ARM OR CROSS_COMPILE_ARM)
|
|
option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" ON)
|
|
elseif(NASM_FOUND AND X86)
|
|
if (NASM_VERSION_STRING VERSION_LESS "2.13.0")
|
|
message(STATUS "Nasm version ${NASM_VERSION_STRING} is too old. 2.13.0 or later required")
|
|
option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" OFF)
|
|
else()
|
|
message(STATUS "Found Nasm ${NASM_VERSION_STRING} to build assembly primitives")
|
|
option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" ON)
|
|
endif()
|
|
else()
|
|
option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" OFF)
|
|
endif()
|
|
|
|
option(CHECKED_BUILD "Enable run-time sanity checks (debugging)" OFF)
|
|
if(CHECKED_BUILD)
|
|
add_definitions(-DCHECKED_BUILD=1)
|
|
endif()
|
|
|
|
# Build options
|
|
set(LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries")
|
|
set(BIN_INSTALL_DIR bin CACHE STRING "Install location of executables")
|
|
set(EXTRA_LIB "" CACHE STRING "Extra libraries to link against")
|
|
set(EXTRA_LINK_FLAGS "" CACHE STRING "Extra link flags")
|
|
if(EXTRA_LINK_FLAGS)
|
|
list(APPEND LINKER_OPTIONS ${EXTRA_LINK_FLAGS})
|
|
endif()
|
|
if(EXTRA_LIB)
|
|
option(LINKED_8BIT "8bit libx265 is being linked with this library" OFF)
|
|
option(LINKED_10BIT "10bit libx265 is being linked with this library" OFF)
|
|
option(LINKED_12BIT "12bit libx265 is being linked with this library" OFF)
|
|
endif(EXTRA_LIB)
|
|
mark_as_advanced(EXTRA_LIB EXTRA_LINK_FLAGS)
|
|
|
|
if(X64)
|
|
# NOTE: We only officially support high-bit-depth compiles of x265
|
|
# on 64bit architectures. Main10 plus large resolution plus slow
|
|
# preset plus 32bit address space usually means malloc failure. You
|
|
# can disable this if(X64) check if you desparately need a 32bit
|
|
# build with 10bit/12bit support, but this violates the "shrink wrap
|
|
# license" so to speak. If it breaks you get to keep both halves.
|
|
# You will need to disable assembly manually.
|
|
option(HIGH_BIT_DEPTH "Store pixel samples as 16bit values (Main10/Main12)" OFF)
|
|
endif(X64)
|
|
if(HIGH_BIT_DEPTH)
|
|
option(MAIN12 "Support Main12 instead of Main10" OFF)
|
|
if(MAIN12)
|
|
add_definitions(-DHIGH_BIT_DEPTH=1 -DX265_DEPTH=12)
|
|
else()
|
|
add_definitions(-DHIGH_BIT_DEPTH=1 -DX265_DEPTH=10)
|
|
endif()
|
|
else(HIGH_BIT_DEPTH)
|
|
add_definitions(-DHIGH_BIT_DEPTH=0 -DX265_DEPTH=8)
|
|
endif(HIGH_BIT_DEPTH)
|
|
|
|
if (ENABLE_HDR10_PLUS)
|
|
include_directories(. dynamicHDR10 "${PROJECT_BINARY_DIR}")
|
|
add_subdirectory(dynamicHDR10)
|
|
add_definitions(-DENABLE_HDR10_PLUS)
|
|
endif(ENABLE_HDR10_PLUS)
|
|
|
|
option(ENABLE_SVT_HEVC "Enable SVT HEVC Encoder" OFF)
|
|
if(ENABLE_SVT_HEVC)
|
|
find_package(svthevc)
|
|
if(SVTHEVC_FOUND)
|
|
add_definitions(-DSVT_HEVC)
|
|
include_directories(${SVT_HEVC_INCLUDE_DIR})
|
|
endif(SVTHEVC_FOUND)
|
|
endif(ENABLE_SVT_HEVC)
|
|
|
|
# this option can only be used when linking multiple libx265 libraries
|
|
# together, and some alternate API access method is implemented.
|
|
option(EXPORT_C_API "Implement public C programming interface" ON)
|
|
mark_as_advanced(EXPORT_C_API)
|
|
if(EXPORT_C_API)
|
|
set(X265_NS x265)
|
|
add_definitions(-DEXPORT_C_API=1)
|
|
elseif(HIGH_BIT_DEPTH)
|
|
if(MAIN12)
|
|
set(X265_NS x265_12bit)
|
|
else()
|
|
set(X265_NS x265_10bit)
|
|
endif()
|
|
add_definitions(-DEXPORT_C_API=0)
|
|
else()
|
|
set(X265_NS x265_8bit)
|
|
add_definitions(-DEXPORT_C_API=0)
|
|
endif()
|
|
add_definitions(-DX265_NS=${X265_NS})
|
|
|
|
option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF)
|
|
if(WARNINGS_AS_ERRORS)
|
|
if(GCC)
|
|
add_definitions(-Werror)
|
|
elseif(MSVC)
|
|
add_definitions(/WX)
|
|
endif()
|
|
endif(WARNINGS_AS_ERRORS)
|
|
|
|
if(WIN32)
|
|
# Visual leak detector
|
|
find_package(VLD QUIET)
|
|
if(VLD_FOUND)
|
|
add_definitions(-DHAVE_VLD)
|
|
include_directories(${VLD_INCLUDE_DIRS})
|
|
list(APPEND PLATFORM_LIBS ${VLD_LIBRARIES})
|
|
link_directories(${VLD_LIBRARY_DIRS})
|
|
endif()
|
|
option(WINXP_SUPPORT "Make binaries compatible with Windows XP and Vista" OFF)
|
|
if(WINXP_SUPPORT)
|
|
# force use of workarounds for CONDITION_VARIABLE and atomic
|
|
# intrinsics introduced after XP
|
|
add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_WINXP -D_WIN32_WINNT_WIN7=0x0601)
|
|
else(WINXP_SUPPORT)
|
|
# default to targeting Windows 7 for the NUMA APIs
|
|
add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_WIN7)
|
|
endif(WINXP_SUPPORT)
|
|
endif()
|
|
|
|
if(POWER)
|
|
# IBM Power8
|
|
option(ENABLE_ALTIVEC "Enable ALTIVEC profiling instrumentation" ON)
|
|
if(ENABLE_ALTIVEC)
|
|
add_definitions(-DHAVE_ALTIVEC=1 -maltivec -mabi=altivec)
|
|
add_definitions(-flax-vector-conversions -fpermissive)
|
|
else()
|
|
add_definitions(-DHAVE_ALTIVEC=0)
|
|
endif()
|
|
|
|
option(CPU_POWER8 "Enable CPU POWER8 profiling instrumentation" ON)
|
|
if(CPU_POWER8)
|
|
add_definitions(-mcpu=power8 -DX265_ARCH_POWER8=1)
|
|
endif()
|
|
endif()
|
|
|
|
include(version) # determine X265_VERSION and X265_LATEST_TAG
|
|
include_directories(. common encoder "${PROJECT_BINARY_DIR}")
|
|
|
|
option(ENABLE_PPA "Enable PPA profiling instrumentation" OFF)
|
|
if(ENABLE_PPA)
|
|
add_definitions(-DENABLE_PPA)
|
|
list(APPEND PLATFORM_LIBS PPA)
|
|
if(UNIX)
|
|
list(APPEND PLATFORM_LIBS dl)
|
|
endif(UNIX)
|
|
add_subdirectory(profile/PPA)
|
|
endif(ENABLE_PPA)
|
|
|
|
option(ENABLE_VTUNE "Enable Vtune profiling instrumentation" OFF)
|
|
if(ENABLE_VTUNE)
|
|
find_package(Vtune)
|
|
if(VTUNE_FOUND)
|
|
add_definitions(-DENABLE_VTUNE)
|
|
include_directories(${VTUNE_INCLUDE_DIR})
|
|
list(APPEND PLATFORM_LIBS vtune)
|
|
link_directories(${VTUNE_LIBRARY_DIR})
|
|
if(WIN32)
|
|
list(APPEND PLATFORM_LIBS libittnotify.lib)
|
|
else()
|
|
list(APPEND PLATFORM_LIBS libittnotify.a dl)
|
|
endif()
|
|
add_subdirectory(profile/vtune)
|
|
endif(VTUNE_FOUND)
|
|
endif(ENABLE_VTUNE)
|
|
|
|
option(DETAILED_CU_STATS "Enable internal profiling of encoder work" OFF)
|
|
if(DETAILED_CU_STATS)
|
|
add_definitions(-DDETAILED_CU_STATS)
|
|
endif(DETAILED_CU_STATS)
|
|
|
|
add_subdirectory(encoder)
|
|
add_subdirectory(common)
|
|
|
|
if((MSVC_IDE OR XCODE OR GCC) AND ENABLE_ASSEMBLY)
|
|
# this is required because of this cmake bug
|
|
# http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170
|
|
if(WIN32)
|
|
set(SUFFIX obj)
|
|
else()
|
|
set(SUFFIX o)
|
|
endif()
|
|
|
|
if(ARM OR CROSS_COMPILE_ARM)
|
|
# compile ARM arch asm files here
|
|
enable_language(ASM)
|
|
foreach(ASM ${ARM_ASMS})
|
|
if(ARM64)
|
|
set(ASM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/common/aarch64/${ASM})
|
|
else()
|
|
set(ASM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/common/arm/${ASM})
|
|
endif()
|
|
list(APPEND ASM_SRCS ${ASM_SRC})
|
|
list(APPEND ASM_OBJS ${ASM}.${SUFFIX})
|
|
add_custom_command(
|
|
OUTPUT ${ASM}.${SUFFIX}
|
|
COMMAND ${CMAKE_AS} ${AS_ARGUMENTS} -- ${CMAKE_C_COMPILER} ${ARM_ARGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}
|
|
DEPENDS ${ASM_SRC})
|
|
endforeach()
|
|
elseif(X86)
|
|
# compile X86 arch asm files here
|
|
foreach(ASM ${MSVC_ASMS})
|
|
set(ASM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/common/x86/${ASM})
|
|
list(APPEND ASM_SRCS ${ASM_SRC})
|
|
list(APPEND ASM_OBJS ${ASM}.${SUFFIX})
|
|
add_custom_command(
|
|
OUTPUT ${ASM}.${SUFFIX}
|
|
COMMAND ${NASM_EXECUTABLE} ARGS ${NASM_FLAGS} ${ASM_SRC} -o ${ASM}.${SUFFIX}
|
|
DEPENDS ${ASM_SRC})
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
source_group(ASM FILES ${ASM_SRCS})
|
|
if(ENABLE_HDR10_PLUS)
|
|
add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS})
|
|
add_library(hdr10plus-static STATIC $<TARGET_OBJECTS:dynamicHDR10>)
|
|
set_target_properties(hdr10plus-static PROPERTIES OUTPUT_NAME hdr10plus)
|
|
else()
|
|
add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS})
|
|
endif()
|
|
if(NOT MSVC)
|
|
set_target_properties(x265-static PROPERTIES OUTPUT_NAME x265)
|
|
endif()
|
|
if(EXTRA_LIB)
|
|
target_link_libraries(x265-static ${EXTRA_LIB})
|
|
endif()
|
|
if(ENABLE_LIBVMAF)
|
|
target_link_libraries(x265-static ${VMAF})
|
|
endif()
|
|
if(SVTHEVC_FOUND)
|
|
target_link_libraries(x265-static ${SVT_HEVC_LIBRARY})
|
|
endif()
|
|
install(TARGETS x265-static
|
|
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
|
|
ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
|
|
|
|
if(ENABLE_HDR10_PLUS)
|
|
install(TARGETS hdr10plus-static
|
|
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
|
|
ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
|
|
endif()
|
|
|
|
if(SVTHEVC_FOUND)
|
|
install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION include)
|
|
install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION include)
|
|
install(FILES "${SVT_HEVC_LIBRARY}" DESTINATION ${LIB_INSTALL_DIR})
|
|
endif()
|
|
|
|
install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)
|
|
if((WIN32 AND ENABLE_CLI) OR (WIN32 AND ENABLE_SHARED))
|
|
if(MSVC_IDE)
|
|
install(FILES "${PROJECT_BINARY_DIR}/Debug/x265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS Debug)
|
|
install(FILES "${PROJECT_BINARY_DIR}/RelWithDebInfo/x265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS RelWithDebInfo)
|
|
install(FILES "${PROJECT_BINARY_DIR}/Debug/libx265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS Debug OPTIONAL NAMELINK_ONLY)
|
|
install(FILES "${PROJECT_BINARY_DIR}/RelWithDebInfo/libx265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS RelWithDebInfo OPTIONAL NAMELINK_ONLY)
|
|
else()
|
|
install(FILES "${PROJECT_BINARY_DIR}/x265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS Debug)
|
|
install(FILES "${PROJECT_BINARY_DIR}/x265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS RelWithDebInfo)
|
|
install(FILES "${PROJECT_BINARY_DIR}/libx265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS Debug OPTIONAL NAMELINK_ONLY)
|
|
install(FILES "${PROJECT_BINARY_DIR}/libx265.pdb" DESTINATION ${BIN_INSTALL_DIR} CONFIGURATIONS RelWithDebInfo OPTIONAL NAMELINK_ONLY)
|
|
endif()
|
|
endif()
|
|
if(CMAKE_RC_COMPILER)
|
|
# The resource compiler does not need CFLAGS or macro defines. It
|
|
# often breaks them
|
|
string(REPLACE "<FLAGS>" "" CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILE_OBJECT}")
|
|
string(REPLACE "<DEFINES>" "" CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILE_OBJECT}")
|
|
# convert X265_LATEST_TAG (ex: 0.7) and X265_TAG_DISTANCE (ex: 103) to
|
|
# @X265_VERSION_MAJOR@,@X265_VERSION_MINOR@,@X265_BRANCH_ID@,@X265_TAG_DISTANCE@
|
|
string(REGEX MATCHALL "([0-9]+)" VERSION_LIST "${X265_LATEST_TAG}")
|
|
list(GET VERSION_LIST 0 X265_VERSION_MAJOR)
|
|
list(GET VERSION_LIST 1 X265_VERSION_MINOR)
|
|
set(X265_BRANCH_ID 0) # TODO: 0 - stable, 1 - default or other
|
|
set(X265_RC_FILE "${CMAKE_CURRENT_BINARY_DIR}/x265.rc")
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/x265.rc.in" "${X265_RC_FILE}" @ONLY)
|
|
endif()
|
|
|
|
if(NOT (MSVC_IDE OR XCODE))
|
|
add_custom_target(clean-generated COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/clean-generated.cmake)
|
|
endif()
|
|
option(ENABLE_SHARED "Build shared library" ON)
|
|
if(ENABLE_SHARED)
|
|
if(ENABLE_HDR10_PLUS)
|
|
add_library(x265-shared SHARED "${PROJECT_BINARY_DIR}/x265.def" ${ASM_OBJS}
|
|
${X265_RC_FILE} $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10>)
|
|
add_library(hdr10plus-shared SHARED $<TARGET_OBJECTS:dynamicHDR10>)
|
|
|
|
if(MSVC)
|
|
set_target_properties(hdr10plus-shared PROPERTIES OUTPUT_NAME libhdr10plus)
|
|
else()
|
|
set_target_properties(hdr10plus-shared PROPERTIES OUTPUT_NAME hdr10plus)
|
|
endif()
|
|
else()
|
|
add_library(x265-shared SHARED "${PROJECT_BINARY_DIR}/x265.def" ${ASM_OBJS}
|
|
${X265_RC_FILE} $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common>)
|
|
endif()
|
|
if(EXTRA_LIB)
|
|
target_link_libraries(x265-shared ${EXTRA_LIB})
|
|
endif()
|
|
target_link_libraries(x265-shared ${PLATFORM_LIBS})
|
|
if(SVTHEVC_FOUND)
|
|
target_link_libraries(x265-shared ${SVT_HEVC_LIBRARY})
|
|
endif(SVTHEVC_FOUND)
|
|
if(MSVC)
|
|
set_target_properties(x265-shared PROPERTIES OUTPUT_NAME libx265)
|
|
else()
|
|
set_target_properties(x265-shared PROPERTIES OUTPUT_NAME x265)
|
|
endif()
|
|
if(UNIX)
|
|
set_target_properties(x265-shared PROPERTIES VERSION ${X265_BUILD})
|
|
if(APPLE)
|
|
set_target_properties(x265-shared PROPERTIES MACOSX_RPATH 1)
|
|
elseif(CYGWIN)
|
|
# Cygwin is not officially supported or tested. MinGW with msys is recommended.
|
|
else()
|
|
list(APPEND LINKER_OPTIONS "-Wl,-Bsymbolic,-znoexecstack")
|
|
endif()
|
|
endif()
|
|
set_target_properties(x265-shared PROPERTIES SOVERSION ${X265_BUILD})
|
|
if(X265_LATEST_TAG)
|
|
if(WINDOWS)
|
|
set_target_properties(x265-shared PROPERTIES VERSION ${X265_LATEST_TAG})
|
|
endif()
|
|
# shared library is not installed if a tag is not found
|
|
install(TARGETS x265-shared
|
|
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
|
|
ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
|
|
RUNTIME DESTINATION ${BIN_INSTALL_DIR})
|
|
endif()
|
|
if(ENABLE_HDR10_PLUS)
|
|
install(TARGETS hdr10plus-shared
|
|
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
|
|
ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
|
|
endif()
|
|
if(LINKER_OPTIONS)
|
|
# set_target_properties can't do list expansion
|
|
string(REPLACE ";" " " LINKER_OPTION_STR "${LINKER_OPTIONS}")
|
|
set_target_properties(x265-shared PROPERTIES LINK_FLAGS "${LINKER_OPTION_STR}")
|
|
endif()
|
|
endif()
|
|
|
|
if(X265_LATEST_TAG)
|
|
# convert lists of link libraries into -lstdc++ -lm etc..
|
|
foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
|
|
if(IS_ABSOLUTE ${LIB} AND EXISTS ${LIB})
|
|
list(APPEND PLIBLIST "${LIB}")
|
|
else()
|
|
list(APPEND PLIBLIST "-l${LIB}")
|
|
endif()
|
|
endforeach()
|
|
if(PLIBLIST)
|
|
# blacklist of libraries that should not be in Libs.private
|
|
list(REMOVE_ITEM PLIBLIST "-lc" "-lpthread" "-lmingwex" "-lmingwthrd"
|
|
"-lmingw32" "-lmoldname" "-lmsvcrt" "-ladvapi32" "-lshell32"
|
|
"-luser32" "-lkernel32")
|
|
string(REPLACE ";" " " PRIVATE_LIBS "${PLIBLIST}")
|
|
else()
|
|
set(PRIVATE_LIBS "")
|
|
endif(PLIBLIST)
|
|
|
|
# Produce a pkg-config file
|
|
configure_file("x265.pc.in" "x265.pc" @ONLY)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/x265.pc"
|
|
DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
|
|
endif()
|
|
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
|
|
IMMEDIATE @ONLY)
|
|
add_custom_target(uninstall
|
|
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
|
|
|
|
# Main CLI application
|
|
set(ENABLE_CLI ON CACHE BOOL "Build standalone CLI application")
|
|
if(ENABLE_CLI)
|
|
file(GLOB InputFiles input/input.cpp input/yuv.cpp input/y4m.cpp input/*.h)
|
|
file(GLOB OutputFiles output/output.cpp output/reconplay.cpp output/*.h
|
|
output/yuv.cpp output/y4m.cpp # recon
|
|
output/raw.cpp) # muxers
|
|
source_group(input FILES ${InputFiles})
|
|
source_group(output FILES ${OutputFiles})
|
|
|
|
check_include_files(getopt.h HAVE_GETOPT_H)
|
|
if(NOT HAVE_GETOPT_H)
|
|
if(MSVC)
|
|
set_source_files_properties(compat/getopt/getopt.c PROPERTIES COMPILE_FLAGS "/wd4100 /wd4131 -DHAVE_STRING_H=1")
|
|
endif(MSVC)
|
|
include_directories(compat/getopt)
|
|
set(GETOPT compat/getopt/getopt.c compat/getopt/getopt.h)
|
|
endif(NOT HAVE_GETOPT_H)
|
|
if(WIN32)
|
|
set(ExportDefs "${PROJECT_BINARY_DIR}/x265.def")
|
|
endif(WIN32)
|
|
if(XCODE)
|
|
# Xcode seems unable to link the CLI with libs, so link as one targget
|
|
if(ENABLE_HDR10_PLUS)
|
|
add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT}
|
|
x265.cpp x265.h x265cli.cpp x265cli.h abrEncApp.cpp abrEncApp.h
|
|
$<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS})
|
|
else()
|
|
add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT}
|
|
x265.cpp x265.h x265cli.cpp x265cli.h abrEncApp.cpp abrEncApp.h
|
|
$<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS})
|
|
endif()
|
|
else()
|
|
add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT} ${X265_RC_FILE}
|
|
${ExportDefs} x265.cpp x265.h x265cli.cpp x265cli.h abrEncApp.cpp abrEncApp.h)
|
|
if(WIN32 OR NOT ENABLE_SHARED OR INTEL_CXX)
|
|
# The CLI cannot link to the shared library on Windows, it
|
|
# requires internal APIs not exported from the DLL
|
|
target_link_libraries(cli x265-static ${PLATFORM_LIBS})
|
|
else()
|
|
target_link_libraries(cli x265-shared ${PLATFORM_LIBS})
|
|
endif()
|
|
endif()
|
|
set_target_properties(cli PROPERTIES OUTPUT_NAME x265)
|
|
if(LINKER_OPTIONS)
|
|
# set_target_properties can't do list expansion
|
|
string(REPLACE ";" " " LINKER_OPTION_STR "${LINKER_OPTIONS}")
|
|
set_target_properties(cli PROPERTIES LINK_FLAGS "${LINKER_OPTION_STR}")
|
|
endif()
|
|
|
|
install(TARGETS cli DESTINATION ${BIN_INSTALL_DIR})
|
|
endif(ENABLE_CLI)
|
|
|
|
if(ENABLE_ASSEMBLY AND NOT XCODE)
|
|
option(ENABLE_TESTS "Enable Unit Tests" OFF)
|
|
if(ENABLE_TESTS)
|
|
add_subdirectory(test)
|
|
endif()
|
|
endif()
|
|
|
|
get_directory_property(hasParent PARENT_DIRECTORY)
|
|
if(hasParent)
|
|
if(PLATFORM_LIBS)
|
|
LIST(REMOVE_DUPLICATES PLATFORM_LIBS)
|
|
set(PLATFORM_LIBS ${PLATFORM_LIBS} PARENT_SCOPE)
|
|
endif(PLATFORM_LIBS)
|
|
endif(hasParent)
|