# 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 $ $ $ ${ASM_OBJS}) add_library(hdr10plus-static STATIC $) set_target_properties(hdr10plus-static PROPERTIES OUTPUT_NAME hdr10plus) else() add_library(x265-static STATIC $ $ ${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 "" "" CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILE_OBJECT}") string(REPLACE "" "" 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} $ $ $) add_library(hdr10plus-shared SHARED $) 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} $ $) 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 $ $ $ ${ASM_OBJS}) else() add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT} x265.cpp x265.h x265cli.cpp x265cli.h abrEncApp.cpp abrEncApp.h $ $ ${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)