2 if(NOT CMAKE_BUILD_TYPE)
3 # default to Release build for GCC builds
4 set(CMAKE_BUILD_TYPE Release CACHE STRING
5 "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
8 message(STATUS "cmake version ${CMAKE_VERSION}")
10 cmake_policy(SET CMP0025 OLD) # report Apple's Clang as just Clang
13 cmake_policy(SET CMP0042 NEW) # MACOSX_RPATH
17 cmake_minimum_required (VERSION 2.8.8) # OBJECT libraries require 2.8.8
18 include(CheckIncludeFiles)
19 include(CheckFunctionExists)
20 include(CheckSymbolExists)
21 include(CheckCXXCompilerFlag)
23 # X265_BUILD must be incremented each time the public API is changed
25 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
26 "${PROJECT_BINARY_DIR}/x265.def")
27 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
28 "${PROJECT_BINARY_DIR}/x265_config.h")
30 SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")
32 option(CHECKED_BUILD "Enable run-time sanity checks (debugging)" OFF)
34 add_definitions(-DCHECKED_BUILD=1)
37 # System architecture detection
38 string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
39 set(X86_ALIASES x86 i386 i686 x86_64 amd64)
40 list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
41 if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
42 message(STATUS "Detected x86 target processor")
44 add_definitions(-DX265_ARCH_X86=1)
45 if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
47 add_definitions(-DX86_64=1)
49 elseif(${SYSPROC} STREQUAL "armv6l")
50 message(STATUS "Detected ARM target processor")
52 add_definitions(-DX265_ARCH_ARM=1 -DHAVE_ARMV6=1)
54 message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
55 message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
59 SET(PLATFORM_LIBS pthread)
60 find_library(LIBRT rt)
62 set(PLATFORM_LIBS ${PLATFORM_LIBS} rt)
67 if(CMAKE_GENERATOR STREQUAL "Xcode")
71 add_definitions(-DMACOS)
74 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
77 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
80 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
84 if(INTEL_CXX AND WIN32)
85 # treat icl roughly like MSVC
89 option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
91 set(CompilerFlags CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_RELEASE)
92 foreach(CompilerFlag ${CompilerFlags})
93 string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
95 endif (STATIC_LINK_CRT)
96 add_definitions(/W4) # Full warnings
97 add_definitions(/Ob2) # always inline
98 add_definitions(/MP) # multithreaded build
100 # disable Microsofts suggestions for proprietary secure APIs
101 add_definitions(/D_CRT_SECURE_NO_WARNINGS)
103 check_include_files(stdint.h HAVE_STDINT_H)
104 if(NOT HAVE_STDINT_H)
105 include_directories(compat/msvc)
109 check_include_files(inttypes.h HAVE_INT_TYPES_H)
111 add_definitions(-DHAVE_INT_TYPES_H=1)
114 if(INTEL_CXX AND UNIX)
115 set(GCC 1) # treat icpc roughly like gcc
117 set(GCC 1) # treat clang roughly like gcc
118 elseif(CMAKE_COMPILER_IS_GNUCXX)
122 add_definitions(-Wall -Wextra -Wshadow)
123 add_definitions(-D__STDC_LIMIT_MACROS=1)
124 if(X64 AND NOT WIN32)
125 add_definitions(-fPIC)
126 endif(X64 AND NOT WIN32)
128 add_definitions(-march=i686)
131 add_definitions(-march=armv6 -mfloat-abi=hard -mfpu=vfp)
133 check_cxx_compiler_flag(-Wno-narrowing CC_HAS_NO_NARROWING)
134 check_cxx_compiler_flag(-Wno-array-bounds CC_HAS_NO_ARRAY_BOUNDS)
135 if (CC_HAS_NO_ARRAY_BOUNDS)
136 add_definitions(-Wno-array-bounds) # these are unhelpful
138 check_cxx_compiler_flag(-ffast-math CC_HAS_FAST_MATH)
139 if (CC_HAS_FAST_MATH)
140 add_definitions(-ffast-math)
142 check_cxx_compiler_flag(-mstackrealign CC_HAS_STACK_REALIGN)
143 if (CC_HAS_STACK_REALIGN)
144 add_definitions(-mstackrealign)
146 # Disable exceptions. Reduce executable size, increase compability.
147 check_cxx_compiler_flag(-fno-exceptions CC_HAS_FNO_EXCEPTIONS_FLAG)
148 if(CC_HAS_FNO_EXCEPTIONS_FLAG)
149 add_definitions(-fno-exceptions)
151 execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION)
155 if(YASM_FOUND AND X86)
156 if (YASM_VERSION_STRING VERSION_LESS "1.2.0")
157 message(STATUS "Yasm version ${YASM_VERSION_STRING} is too old. 1.2.0 or later required")
158 option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" OFF)
160 message(STATUS "Found Yasm ${YASM_VERSION_STRING} to build assembly primitives")
161 option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" ON)
166 set(LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries")
167 set(BIN_INSTALL_DIR bin CACHE STRING "Install location of executables")
170 # NOTE: We only officially support 16bit-per-pixel compiles of x265
171 # on 64bit architectures. 16bpp plus large resolution plus slow
172 # preset plus 32bit address space usually means malloc failure. You
173 # can disable this if(X64) check if you desparately need a 32bit
174 # build with 10bit/12bit support, but this violates the "shrink wrap
175 # license" so to speak. If it breaks you get to keep both halves.
176 option(HIGH_BIT_DEPTH "Store pixels as 16bit values" OFF)
179 add_definitions(-DHIGH_BIT_DEPTH=1)
181 add_definitions(-DHIGH_BIT_DEPTH=0)
182 endif(HIGH_BIT_DEPTH)
184 option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF)
185 if(WARNINGS_AS_ERRORS)
187 add_definitions(-Werror)
191 endif(WARNINGS_AS_ERRORS)
194 option(ENABLE_PPA "Enable PPA profiling instrumentation" OFF)
196 add_definitions(-DENABLE_PPA)
197 add_subdirectory(PPA)
198 SET(PLATFORM_LIBS ${PLATFORM_LIBS} PPA)
200 SET(PLATFORM_LIBS ${PLATFORM_LIBS} dl)
205 # Visual leak detector
206 find_package(VLD QUIET)
208 add_definitions(-DHAVE_VLD)
209 include_directories(${VLD_INCLUDE_DIRS})
210 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${VLD_LIBRARIES})
211 link_directories(${VLD_LIBRARY_DIRS})
213 option(WINXP_SUPPORT "Make binaries compatible with Windows XP" OFF)
215 # force use of workarounds for CONDITION_VARIABLE and atomic
216 # intrinsics introduced after XP
217 add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_WINXP)
221 include(version) # determine X265_VERSION and X265_LATEST_TAG
222 include_directories(. common encoder "${PROJECT_BINARY_DIR}")
223 add_subdirectory(encoder)
224 add_subdirectory(common)
226 if((MSVC_IDE OR XCODE) AND ENABLE_ASSEMBLY)
227 # this is required because of this cmake bug
228 # http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170
234 foreach(ASM ${MSVC_ASMS})
235 set(YASM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/common/x86/${ASM})
236 list(APPEND YASM_SRCS ${YASM_SRC})
237 list(APPEND YASM_OBJS ${ASM}.${SUFFIX})
239 OUTPUT ${ASM}.${SUFFIX}
240 COMMAND ${YASM_EXECUTABLE} ARGS ${YASM_FLAGS} ${YASM_SRC} -o ${ASM}.${SUFFIX}
245 source_group(ASM FILES ${YASM_SRCS})
246 add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${YASM_OBJS} ${YASM_SRCS})
248 set_target_properties(x265-static PROPERTIES OUTPUT_NAME x265)
250 install(TARGETS x265-static
251 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
252 ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
253 install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)
255 if(CMAKE_RC_COMPILER)
256 # The resource compiler does not need CFLAGS or macro defines. It
258 string(REPLACE "<FLAGS>" "" CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILE_OBJECT}")
259 string(REPLACE "<DEFINES>" "" CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILE_OBJECT}")
261 # convert X265_LATEST_TAG (ex: 0.7) and X265_TAG_DISTANCE (ex: 103) to
262 # @X265_VERSION_MAJOR@,@X265_VERSION_MINOR@,@X265_BRANCH_ID@,@X265_TAG_DISTANCE@
263 string(REPLACE "." ";" VERSION_LIST "${X265_LATEST_TAG}")
264 list(GET VERSION_LIST 0 X265_VERSION_MAJOR)
265 list(GET VERSION_LIST 1 X265_VERSION_MINOR)
266 set(X265_BRANCH_ID 0) # TODO: 0 - stable, 1 - default or other
267 set(X265_RC_FILE "${CMAKE_CURRENT_BINARY_DIR}/x265.rc")
268 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/x265.rc.in" "${X265_RC_FILE}" @ONLY)
271 if(NOT (MSVC_IDE OR XCODE))
272 add_custom_target(clean-generated COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/clean-generated.cmake)
275 option(ENABLE_SHARED "Build shared library" ON)
277 add_library(x265-shared SHARED "${PROJECT_BINARY_DIR}/x265.def" ${YASM_OBJS}
278 ${X265_RC_FILE} $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common>)
279 target_link_libraries(x265-shared ${PLATFORM_LIBS})
281 set_target_properties(x265-shared PROPERTIES OUTPUT_NAME libx265)
283 set_target_properties(x265-shared PROPERTIES OUTPUT_NAME x265)
286 set_target_properties(x265-shared PROPERTIES VERSION ${X265_BUILD})
288 set_target_properties(x265-shared PROPERTIES MACOSX_RPATH 1)
290 set_target_properties(x265-shared PROPERTIES LINK_FLAGS "-Wl,-Bsymbolic,-znoexecstack")
293 set_target_properties(x265-shared PROPERTIES SOVERSION ${X265_BUILD})
296 set_target_properties(x265-shared PROPERTIES VERSION ${X265_LATEST_TAG})
298 # shared library is not installed if a tag is not found
299 install(TARGETS x265-shared
300 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
301 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
302 RUNTIME DESTINATION ${BIN_INSTALL_DIR})
307 # convert lists of link libraries into -lstdc++ -lm etc..
308 foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
309 if(IS_ABSOLUTE ${LIB} AND EXISTS ${LIB})
310 list(APPEND PLIBLIST "${LIB}")
312 list(APPEND PLIBLIST "-l${LIB}")
316 # blacklist of libraries that should not be in Libs.private
317 list(REMOVE_ITEM PLIBLIST "-lc" "-lpthread")
318 string(REPLACE ";" " " PRIVATE_LIBS "${PLIBLIST}")
323 # Produce a pkg-config file
324 configure_file("x265.pc.in" "x265.pc" @ONLY)
325 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/x265.pc"
326 DESTINATION "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/pkgconfig")
330 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
331 "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
333 add_custom_target(uninstall
334 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake")
337 # Main CLI application
338 option(ENABLE_CLI "Build standalone CLI application" ON)
340 file(GLOB InputFiles input/*.cpp input/*.h)
341 file(GLOB OutputFiles output/*.cpp output/*.h)
342 file(GLOB FilterFiles filters/*.cpp filters/*.h)
343 source_group(input FILES ${InputFiles})
344 source_group(output FILES ${OutputFiles})
345 source_group(filters FILES ${FilterFiles})
347 check_include_files(getopt.h HAVE_GETOPT_H)
348 if(NOT HAVE_GETOPT_H)
350 set_source_files_properties(compat/getopt/getopt.c PROPERTIES COMPILE_FLAGS "/wd4100 /wd4131 -DHAVE_STRING_H=1")
352 include_directories(compat/getopt)
353 set(GETOPT compat/getopt/getopt.c compat/getopt/getopt.h)
354 endif(NOT HAVE_GETOPT_H)
357 # Xcode seems unable to link the CLI with libs, so link as one targget
358 add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${FilterFiles} ${GETOPT} x265.cpp x265.h
359 $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${YASM_OBJS} ${YASM_SRCS})
361 add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${FilterFiles} ${GETOPT} ${X265_RC_FILE} x265.cpp x265.h)
362 if(WIN32 OR NOT ENABLE_SHARED OR INTEL_CXX)
363 # The CLI cannot link to the shared library on Windows, it
364 # requires internal APIs not exported from the DLL
365 target_link_libraries(cli x265-static ${PLATFORM_LIBS})
367 target_link_libraries(cli x265-shared ${PLATFORM_LIBS})
370 set_target_properties(cli PROPERTIES OUTPUT_NAME x265)
372 install(TARGETS cli DESTINATION ${BIN_INSTALL_DIR})
375 if(ENABLE_ASSEMBLY AND NOT XCODE)
376 option(ENABLE_TESTS "Enable Unit Tests" OFF)
378 add_subdirectory(test)