portfile.cmake 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. vcpkg_from_github(
  2. OUT_SOURCE_PATH SOURCE_PATH
  3. REPO ffmpeg/ffmpeg
  4. REF "n${VERSION}"
  5. SHA512 3b273769ef1a1b63aed0691eef317a760f8c83b1d0e1c232b67bbee26db60b4864aafbc88df0e86d6bebf07185bbd057f33e2d5258fde6d97763b9994cd48b6f
  6. HEAD_REF master
  7. PATCHES
  8. 0001-create-lib-libraries.patch
  9. 0002-fix-msvc-link.patch
  10. 0003-fix-windowsinclude.patch
  11. 0004-dependencies.patch
  12. 0005-fix-nasm.patch
  13. 0007-fix-lib-naming.patch
  14. 0013-define-WINVER.patch
  15. 0020-fix-aarch64-libswscale.patch
  16. 0024-fix-osx-host-c11.patch
  17. 0040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch # Do not remove this patch. It is required by chromium
  18. 0041-add-const-for-opengl-definition.patch
  19. 0043-fix-miss-head.patch
  20. patch/0001-avcodec-amfenc-add-query_timeout-option-for-h264-hev.patch
  21. patch/0002-libavcodec-amfenc-reconfig-when-bitrate-change.patch
  22. patch/0004-videotoolbox-changing-bitrate.patch
  23. patch/0005-mediacodec-changing-bitrate.patch
  24. patch/0006-dlopen-libva.patch
  25. patch/0007-fix-linux-configure.patch
  26. patch/0008-remove-amf-loop-query.patch
  27. patch/0009-fix-nvenc-reconfigure-blur.patch
  28. patch/0010.disable-loading-DLLs-from-app-dir.patch
  29. )
  30. if(SOURCE_PATH MATCHES " ")
  31. message(FATAL_ERROR "Error: ffmpeg will not build with spaces in the path. Please use a directory with no spaces")
  32. endif()
  33. if(NOT VCPKG_TARGET_ARCHITECTURE STREQUAL "wasm32")
  34. vcpkg_find_acquire_program(NASM)
  35. get_filename_component(NASM_EXE_PATH "${NASM}" DIRECTORY)
  36. vcpkg_add_to_path("${NASM_EXE_PATH}")
  37. endif()
  38. set(OPTIONS "\
  39. --disable-shared \
  40. --enable-static \
  41. --enable-pic \
  42. --disable-everything \
  43. --disable-programs \
  44. --disable-doc \
  45. --disable-htmlpages \
  46. --disable-manpages \
  47. --disable-podpages \
  48. --disable-txtpages \
  49. --disable-network \
  50. --disable-appkit \
  51. --disable-coreimage \
  52. --disable-metal \
  53. --disable-sdl2 \
  54. --disable-securetransport \
  55. --disable-vulkan \
  56. --disable-audiotoolbox \
  57. --disable-v4l2-m2m \
  58. --disable-debug \
  59. --disable-valgrind-backtrace \
  60. --disable-large-tests \
  61. --disable-bzlib \
  62. --disable-avdevice \
  63. --enable-avcodec \
  64. --enable-avformat \
  65. --disable-avfilter \
  66. --disable-swresample \
  67. --disable-swscale \
  68. --disable-postproc \
  69. --enable-decoder=h264 \
  70. --enable-decoder=hevc \
  71. --enable-parser=h264 \
  72. --enable-parser=hevc \
  73. --enable-bsf=h264_mp4toannexb \
  74. --enable-bsf=hevc_mp4toannexb \
  75. --enable-bsf=h264_metadata \
  76. --enable-bsf=hevc_metadata \
  77. --enable-muxer=mp4 \
  78. --enable-protocol=file \
  79. ")
  80. if(VCPKG_HOST_IS_WINDOWS)
  81. vcpkg_acquire_msys(MSYS_ROOT PACKAGES automake1.16)
  82. set(SHELL "${MSYS_ROOT}/usr/bin/bash.exe")
  83. vcpkg_add_to_path("${MSYS_ROOT}/usr/share/automake-1.16")
  84. string(APPEND OPTIONS " --pkg-config=${CURRENT_HOST_INSTALLED_DIR}/tools/pkgconf/pkgconf${VCPKG_HOST_EXECUTABLE_SUFFIX}")
  85. else()
  86. find_program(SHELL bash)
  87. endif()
  88. if(VCPKG_TARGET_IS_LINUX)
  89. string(APPEND OPTIONS "\
  90. --target-os=linux \
  91. --enable-pthreads \
  92. --disable-vdpau \
  93. ")
  94. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
  95. else()
  96. string(APPEND OPTIONS "\
  97. --enable-cuda \
  98. --enable-ffnvcodec \
  99. --enable-encoder=h264_nvenc \
  100. --enable-encoder=hevc_nvenc \
  101. --enable-hwaccel=h264_nvdec \
  102. --enable-hwaccel=hevc_nvdec \
  103. --enable-amf \
  104. --enable-encoder=h264_amf \
  105. --enable-encoder=hevc_amf \
  106. --enable-hwaccel=h264_vaapi \
  107. --enable-hwaccel=hevc_vaapi \
  108. --enable-encoder=h264_vaapi \
  109. --enable-encoder=hevc_vaapi \
  110. ")
  111. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
  112. string(APPEND OPTIONS "\
  113. --enable-cuda_llvm \
  114. ")
  115. endif()
  116. endif()
  117. elseif(VCPKG_TARGET_IS_WINDOWS)
  118. string(APPEND OPTIONS "\
  119. --target-os=win32 \
  120. --toolchain=msvc \
  121. --cc=cl \
  122. --enable-gpl \
  123. --enable-d3d11va \
  124. --enable-cuda \
  125. --enable-ffnvcodec \
  126. --enable-hwaccel=h264_nvdec \
  127. --enable-hwaccel=hevc_nvdec \
  128. --enable-hwaccel=h264_d3d11va \
  129. --enable-hwaccel=hevc_d3d11va \
  130. --enable-hwaccel=h264_d3d11va2 \
  131. --enable-hwaccel=hevc_d3d11va2 \
  132. --enable-amf \
  133. --enable-encoder=h264_amf \
  134. --enable-encoder=hevc_amf \
  135. --enable-encoder=h264_nvenc \
  136. --enable-encoder=hevc_nvenc \
  137. --enable-libmfx \
  138. --enable-encoder=h264_qsv \
  139. --enable-encoder=hevc_qsv \
  140. ")
  141. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
  142. set(LIB_MACHINE_ARG /machine:x86)
  143. string(APPEND OPTIONS " --arch=i686 --enable-cross-compile")
  144. elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
  145. set(LIB_MACHINE_ARG /machine:x64)
  146. string(APPEND OPTIONS " --arch=x86_64")
  147. else()
  148. message(FATAL_ERROR "Unsupported target architecture")
  149. endif()
  150. elseif(VCPKG_TARGET_IS_OSX)
  151. string(APPEND OPTIONS "\
  152. --disable-autodetect \
  153. --enable-videotoolbox \
  154. --enable-encoder=h264_videotoolbox,hevc_videotoolbox \
  155. --enable-hwaccel=h264_videotoolbox,hevc_videotoolbox \
  156. ")
  157. elseif(VCPKG_TARGET_IS_IOS)
  158. string(APPEND OPTIONS "\
  159. --arch=arm64 \
  160. --disable-autodetect \
  161. --disable-hwaccels \
  162. --disable-encoders \
  163. --disable-videotoolbox \
  164. --extra-cflags=\"-arch arm64 -mios-version-min=8.0 -fembed-bitcode\" \
  165. --extra-ldflags=\"-arch arm64 -mios-version-min=8.0 -fembed-bitcode\" \
  166. ")
  167. elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android")
  168. string(APPEND OPTIONS "\
  169. --target-os=android \
  170. --disable-asm \
  171. --enable-jni \
  172. --enable-mediacodec \
  173. --disable-hwaccels \
  174. --enable-encoder=h264_mediacodec \
  175. --enable-encoder=hevc_mediacodec \
  176. --enable-decoder=h264_mediacodec \
  177. --enable-decoder=hevc_mediacodec \
  178. ")
  179. endif()
  180. if(VCPKG_TARGET_IS_OSX)
  181. list(JOIN VCPKG_OSX_ARCHITECTURES " " OSX_ARCHS)
  182. list(LENGTH VCPKG_OSX_ARCHITECTURES OSX_ARCH_COUNT)
  183. endif()
  184. vcpkg_cmake_get_vars(cmake_vars_file)
  185. include("${cmake_vars_file}")
  186. if(VCPKG_DETECTED_MSVC)
  187. string(APPEND OPTIONS " --disable-inline-asm") # clang-cl has inline assembly but this leads to undefined symbols.
  188. set(OPTIONS "--toolchain=msvc ${OPTIONS}")
  189. # This is required because ffmpeg depends upon optimizations to link correctly
  190. string(APPEND VCPKG_COMBINED_C_FLAGS_DEBUG " -O2")
  191. string(REGEX REPLACE "(^| )-RTC1( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}")
  192. string(REGEX REPLACE "(^| )-Od( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}")
  193. string(REGEX REPLACE "(^| )-Ob0( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}")
  194. endif()
  195. string(APPEND VCPKG_COMBINED_C_FLAGS_DEBUG " -I \"${CURRENT_INSTALLED_DIR}/include\"")
  196. string(APPEND VCPKG_COMBINED_C_FLAGS_RELEASE " -I \"${CURRENT_INSTALLED_DIR}/include\"")
  197. if(VCPKG_TARGET_IS_WINDOWS)
  198. string(APPEND VCPKG_COMBINED_C_FLAGS_DEBUG " -I \"${CURRENT_INSTALLED_DIR}/include/mfx\"")
  199. string(APPEND VCPKG_COMBINED_C_FLAGS_RELEASE " -I \"${CURRENT_INSTALLED_DIR}/include/mfx\"")
  200. endif()
  201. # # Setup vcpkg toolchain
  202. set(prog_env "")
  203. if(VCPKG_DETECTED_CMAKE_C_COMPILER)
  204. get_filename_component(CC_path "${VCPKG_DETECTED_CMAKE_C_COMPILER}" DIRECTORY)
  205. get_filename_component(CC_filename "${VCPKG_DETECTED_CMAKE_C_COMPILER}" NAME)
  206. set(ENV{CC} "${CC_filename}")
  207. string(APPEND OPTIONS " --cc=${CC_filename}")
  208. if(VCPKG_HOST_IS_WINDOWS)
  209. string(APPEND OPTIONS " --host_cc=${CC_filename}")
  210. endif()
  211. list(APPEND prog_env "${CC_path}")
  212. endif()
  213. if(VCPKG_DETECTED_CMAKE_CXX_COMPILER)
  214. get_filename_component(CXX_path "${VCPKG_DETECTED_CMAKE_CXX_COMPILER}" DIRECTORY)
  215. get_filename_component(CXX_filename "${VCPKG_DETECTED_CMAKE_CXX_COMPILER}" NAME)
  216. set(ENV{CXX} "${CXX_filename}")
  217. string(APPEND OPTIONS " --cxx=${CXX_filename}")
  218. # string(APPEND OPTIONS " --host_cxx=${CC_filename}")
  219. list(APPEND prog_env "${CXX_path}")
  220. endif()
  221. if(VCPKG_DETECTED_CMAKE_RC_COMPILER)
  222. get_filename_component(RC_path "${VCPKG_DETECTED_CMAKE_RC_COMPILER}" DIRECTORY)
  223. get_filename_component(RC_filename "${VCPKG_DETECTED_CMAKE_RC_COMPILER}" NAME)
  224. set(ENV{WINDRES} "${RC_filename}")
  225. string(APPEND OPTIONS " --windres=${RC_filename}")
  226. list(APPEND prog_env "${RC_path}")
  227. endif()
  228. if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
  229. get_filename_component(LD_path "${VCPKG_DETECTED_CMAKE_LINKER}" DIRECTORY)
  230. get_filename_component(LD_filename "${VCPKG_DETECTED_CMAKE_LINKER}" NAME)
  231. set(ENV{LD} "${LD_filename}")
  232. string(APPEND OPTIONS " --ld=${LD_filename}")
  233. # string(APPEND OPTIONS " --host_ld=${LD_filename}")
  234. list(APPEND prog_env "${LD_path}")
  235. endif()
  236. if(VCPKG_DETECTED_CMAKE_NM)
  237. get_filename_component(NM_path "${VCPKG_DETECTED_CMAKE_NM}" DIRECTORY)
  238. get_filename_component(NM_filename "${VCPKG_DETECTED_CMAKE_NM}" NAME)
  239. set(ENV{NM} "${NM_filename}")
  240. string(APPEND OPTIONS " --nm=${NM_filename}")
  241. list(APPEND prog_env "${NM_path}")
  242. endif()
  243. if(VCPKG_DETECTED_CMAKE_AR)
  244. get_filename_component(AR_path "${VCPKG_DETECTED_CMAKE_AR}" DIRECTORY)
  245. get_filename_component(AR_filename "${VCPKG_DETECTED_CMAKE_AR}" NAME)
  246. if(AR_filename MATCHES [[^(llvm-)?lib\.exe$]])
  247. set(ENV{AR} "ar-lib ${AR_filename}")
  248. string(APPEND OPTIONS " --ar='ar-lib ${AR_filename}'")
  249. else()
  250. set(ENV{AR} "${AR_filename}")
  251. string(APPEND OPTIONS " --ar='${AR_filename}'")
  252. endif()
  253. list(APPEND prog_env "${AR_path}")
  254. endif()
  255. if(VCPKG_DETECTED_CMAKE_RANLIB)
  256. get_filename_component(RANLIB_path "${VCPKG_DETECTED_CMAKE_RANLIB}" DIRECTORY)
  257. get_filename_component(RANLIB_filename "${VCPKG_DETECTED_CMAKE_RANLIB}" NAME)
  258. set(ENV{RANLIB} "${RANLIB_filename}")
  259. string(APPEND OPTIONS " --ranlib=${RANLIB_filename}")
  260. list(APPEND prog_env "${RANLIB_path}")
  261. endif()
  262. if(VCPKG_DETECTED_CMAKE_STRIP)
  263. get_filename_component(STRIP_path "${VCPKG_DETECTED_CMAKE_STRIP}" DIRECTORY)
  264. get_filename_component(STRIP_filename "${VCPKG_DETECTED_CMAKE_STRIP}" NAME)
  265. set(ENV{STRIP} "${STRIP_filename}")
  266. string(APPEND OPTIONS " --strip=${STRIP_filename}")
  267. list(APPEND prog_env "${STRIP_path}")
  268. endif()
  269. if(VCPKG_HOST_IS_WINDOWS)
  270. vcpkg_acquire_msys(MSYS_ROOT PACKAGES automake1.16)
  271. set(SHELL "${MSYS_ROOT}/usr/bin/bash.exe")
  272. list(APPEND prog_env "${MSYS_ROOT}/usr/bin" "${MSYS_ROOT}/usr/share/automake-1.16")
  273. else()
  274. # find_program(SHELL bash)
  275. endif()
  276. list(REMOVE_DUPLICATES prog_env)
  277. vcpkg_add_to_path(PREPEND ${prog_env})
  278. # More? OBJCC BIN2C
  279. file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg" "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
  280. set(FFMPEG_PKGCONFIG_MODULES libavutil)
  281. set(OPTIONS_CROSS "--enable-cross-compile")
  282. # ffmpeg needs --cross-prefix option to use appropriate tools for cross-compiling.
  283. if(VCPKG_DETECTED_CMAKE_C_COMPILER MATCHES "([^\/]*-)gcc$")
  284. string(APPEND OPTIONS_CROSS " --cross-prefix=${CMAKE_MATCH_1}")
  285. endif()
  286. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
  287. set(BUILD_ARCH "x86_64")
  288. else()
  289. set(BUILD_ARCH ${VCPKG_TARGET_ARCHITECTURE})
  290. endif()
  291. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" OR VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
  292. if(VCPKG_TARGET_IS_WINDOWS)
  293. vcpkg_find_acquire_program(GASPREPROCESSOR)
  294. foreach(GAS_PATH ${GASPREPROCESSOR})
  295. get_filename_component(GAS_ITEM_PATH ${GAS_PATH} DIRECTORY)
  296. vcpkg_add_to_path("${GAS_ITEM_PATH}")
  297. endforeach(GAS_PATH)
  298. endif()
  299. endif()
  300. set(OPTIONS_DEBUG "--disable-optimizations")
  301. set(OPTIONS_RELEASE "--enable-optimizations")
  302. set(OPTIONS "${OPTIONS} ${OPTIONS_CROSS}")
  303. if(VCPKG_TARGET_IS_MINGW)
  304. set(OPTIONS "${OPTIONS} --extra_cflags=-D_WIN32_WINNT=0x0601")
  305. elseif(VCPKG_TARGET_IS_WINDOWS)
  306. set(OPTIONS "${OPTIONS} --extra-cflags=-DHAVE_UNISTD_H=0")
  307. endif()
  308. vcpkg_find_acquire_program(PKGCONFIG)
  309. set(OPTIONS "${OPTIONS} --pkg-config=${PKGCONFIG}")
  310. if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
  311. set(OPTIONS "${OPTIONS} --pkg-config-flags=--static")
  312. endif()
  313. message(STATUS "Building Options: ${OPTIONS}")
  314. # Release build
  315. if(NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
  316. if(VCPKG_DETECTED_MSVC)
  317. set(OPTIONS_RELEASE "${OPTIONS_RELEASE} --extra-ldflags=-libpath:\"${CURRENT_INSTALLED_DIR}/lib\"")
  318. else()
  319. set(OPTIONS_RELEASE "${OPTIONS_RELEASE} --extra-ldflags=-L\"${CURRENT_INSTALLED_DIR}/lib\"")
  320. endif()
  321. message(STATUS "Building Release Options: ${OPTIONS_RELEASE}")
  322. set(ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/lib/pkgconfig")
  323. message(STATUS "Building ${PORT} for Release")
  324. file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
  325. # We use response files here as the only known way to handle spaces in paths
  326. set(crsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/cflags.rsp")
  327. string(REGEX REPLACE "-arch [A-Za-z0-9_]+" "" VCPKG_COMBINED_C_FLAGS_RELEASE_SANITIZED "${VCPKG_COMBINED_C_FLAGS_RELEASE}")
  328. file(WRITE "${crsp}" "${VCPKG_COMBINED_C_FLAGS_RELEASE_SANITIZED}")
  329. set(ldrsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/ldflags.rsp")
  330. string(REGEX REPLACE "-arch [A-Za-z0-9_]+" "" VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE_SANITIZED "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE}")
  331. file(WRITE "${ldrsp}" "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE_SANITIZED}")
  332. set(ENV{CFLAGS} "@${crsp}")
  333. # All tools except the msvc arm{,64} assembler accept @... as response file syntax.
  334. # For that assembler, there is no known way to pass in flags. We must hope that not passing flags will work acceptably.
  335. if(NOT VCPKG_DETECTED_MSVC OR NOT VCPKG_TARGET_ARCHITECTURE MATCHES "^arm")
  336. set(ENV{ASFLAGS} "@${crsp}")
  337. endif()
  338. set(ENV{LDFLAGS} "@${ldrsp}")
  339. set(ENV{ARFLAGS} "${VCPKG_COMBINED_STATIC_LINKER_FLAGS_RELEASE}")
  340. set(BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
  341. set(CONFIGURE_OPTIONS "${OPTIONS} ${OPTIONS_RELEASE}")
  342. set(INST_PREFIX "${CURRENT_PACKAGES_DIR}")
  343. configure_file("${CMAKE_CURRENT_LIST_DIR}/build.sh.in" "${BUILD_DIR}/build.sh" @ONLY)
  344. z_vcpkg_setup_pkgconfig_path(CONFIG RELEASE)
  345. vcpkg_execute_required_process(
  346. COMMAND "${SHELL}" ./build.sh
  347. WORKING_DIRECTORY "${BUILD_DIR}"
  348. LOGNAME "build-${TARGET_TRIPLET}-rel"
  349. SAVE_LOG_FILES ffbuild/config.log
  350. )
  351. z_vcpkg_restore_pkgconfig_path()
  352. endif()
  353. # Debug build
  354. if(NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
  355. if(VCPKG_DETECTED_MSVC)
  356. set(OPTIONS_DEBUG "${OPTIONS_DEBUG} --extra-ldflags=-libpath:\"${CURRENT_INSTALLED_DIR}/debug/lib\"")
  357. else()
  358. set(OPTIONS_DEBUG "${OPTIONS_DEBUG} --extra-ldflags=-L\"${CURRENT_INSTALLED_DIR}/debug/lib\"")
  359. endif()
  360. message(STATUS "Building Debug Options: ${OPTIONS_DEBUG}")
  361. set(ENV{LDFLAGS} "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG}")
  362. set(ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/debug/lib/pkgconfig")
  363. message(STATUS "Building ${PORT} for Debug")
  364. file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
  365. set(crsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/cflags.rsp")
  366. string(REGEX REPLACE "-arch [A-Za-z0-9_]+" "" VCPKG_COMBINED_C_FLAGS_DEBUG_SANITIZED "${VCPKG_COMBINED_C_FLAGS_DEBUG}")
  367. file(WRITE "${crsp}" "${VCPKG_COMBINED_C_FLAGS_DEBUG_SANITIZED}")
  368. set(ldrsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/ldflags.rsp")
  369. string(REGEX REPLACE "-arch [A-Za-z0-9_]+" "" VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG_SANITIZED "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG}")
  370. file(WRITE "${ldrsp}" "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG_SANITIZED}")
  371. set(ENV{CFLAGS} "@${crsp}")
  372. if(NOT VCPKG_DETECTED_MSVC OR NOT VCPKG_TARGET_ARCHITECTURE MATCHES "^arm")
  373. set(ENV{ASFLAGS} "@${crsp}")
  374. endif()
  375. set(ENV{LDFLAGS} "@${ldrsp}")
  376. set(ENV{ARFLAGS} "${VCPKG_COMBINED_STATIC_LINKER_FLAGS_DEBUG}")
  377. set(BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
  378. set(CONFIGURE_OPTIONS "${OPTIONS} ${OPTIONS_DEBUG}")
  379. set(INST_PREFIX "${CURRENT_PACKAGES_DIR}/debug")
  380. configure_file("${CMAKE_CURRENT_LIST_DIR}/build.sh.in" "${BUILD_DIR}/build.sh" @ONLY)
  381. z_vcpkg_setup_pkgconfig_path(CONFIG DEBUG)
  382. vcpkg_execute_required_process(
  383. COMMAND "${SHELL}" ./build.sh
  384. WORKING_DIRECTORY "${BUILD_DIR}"
  385. LOGNAME "build-${TARGET_TRIPLET}-dbg"
  386. SAVE_LOG_FILES ffbuild/config.log
  387. )
  388. z_vcpkg_restore_pkgconfig_path()
  389. endif()
  390. if(VCPKG_TARGET_IS_WINDOWS)
  391. file(GLOB DEF_FILES "${CURRENT_PACKAGES_DIR}/lib/*.def" "${CURRENT_PACKAGES_DIR}/debug/lib/*.def")
  392. if(NOT VCPKG_TARGET_IS_MINGW)
  393. if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
  394. set(LIB_MACHINE_ARG /machine:ARM)
  395. elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
  396. set(LIB_MACHINE_ARG /machine:ARM64)
  397. elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
  398. set(LIB_MACHINE_ARG /machine:x86)
  399. elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
  400. set(LIB_MACHINE_ARG /machine:x64)
  401. else()
  402. message(FATAL_ERROR "Unsupported target architecture")
  403. endif()
  404. foreach(DEF_FILE ${DEF_FILES})
  405. get_filename_component(DEF_FILE_DIR "${DEF_FILE}" DIRECTORY)
  406. get_filename_component(DEF_FILE_NAME "${DEF_FILE}" NAME)
  407. string(REGEX REPLACE "-[0-9]*\\.def" "${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}" OUT_FILE_NAME "${DEF_FILE_NAME}")
  408. file(TO_NATIVE_PATH "${DEF_FILE}" DEF_FILE_NATIVE)
  409. file(TO_NATIVE_PATH "${DEF_FILE_DIR}/${OUT_FILE_NAME}" OUT_FILE_NATIVE)
  410. message(STATUS "Generating ${OUT_FILE_NATIVE}")
  411. vcpkg_execute_required_process(
  412. COMMAND lib.exe "/def:${DEF_FILE_NATIVE}" "/out:${OUT_FILE_NATIVE}" ${LIB_MACHINE_ARG}
  413. WORKING_DIRECTORY "${CURRENT_PACKAGES_DIR}"
  414. LOGNAME "libconvert-${TARGET_TRIPLET}"
  415. )
  416. endforeach()
  417. endif()
  418. file(GLOB EXP_FILES "${CURRENT_PACKAGES_DIR}/lib/*.exp" "${CURRENT_PACKAGES_DIR}/debug/lib/*.exp")
  419. file(GLOB LIB_FILES "${CURRENT_PACKAGES_DIR}/bin/*${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}" "${CURRENT_PACKAGES_DIR}/debug/bin/*${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}")
  420. if(VCPKG_TARGET_IS_MINGW)
  421. file(GLOB LIB_FILES_2 "${CURRENT_PACKAGES_DIR}/bin/*.lib" "${CURRENT_PACKAGES_DIR}/debug/bin/*.lib")
  422. endif()
  423. set(files_to_remove ${EXP_FILES} ${LIB_FILES} ${LIB_FILES_2} ${DEF_FILES})
  424. if(files_to_remove)
  425. file(REMOVE ${files_to_remove})
  426. endif()
  427. endif()
  428. file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include" "${CURRENT_PACKAGES_DIR}/debug/share")
  429. if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
  430. file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin")
  431. endif()
  432. vcpkg_copy_pdbs()
  433. if(VCPKG_TARGET_IS_WINDOWS)
  434. set(_dirs "/")
  435. if(NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
  436. list(APPEND _dirs "/debug/")
  437. endif()
  438. foreach(_debug IN LISTS _dirs)
  439. foreach(PKGCONFIG_MODULE IN LISTS FFMPEG_PKGCONFIG_MODULES)
  440. set(PKGCONFIG_FILE "${CURRENT_PACKAGES_DIR}${_debug}lib/pkgconfig/${PKGCONFIG_MODULE}.pc")
  441. # remove redundant cygwin style -libpath entries
  442. execute_process(
  443. COMMAND "${MSYS_ROOT}/usr/bin/cygpath.exe" -u "${CURRENT_INSTALLED_DIR}"
  444. OUTPUT_VARIABLE CYG_INSTALLED_DIR
  445. OUTPUT_STRIP_TRAILING_WHITESPACE
  446. )
  447. vcpkg_replace_string("${PKGCONFIG_FILE}" "-libpath:${CYG_INSTALLED_DIR}${_debug}lib/pkgconfig/../../lib " "")
  448. # transform libdir, includedir, and prefix paths from cygwin style to windows style
  449. file(READ "${PKGCONFIG_FILE}" PKGCONFIG_CONTENT)
  450. foreach(PATH_NAME prefix libdir includedir)
  451. string(REGEX MATCH "${PATH_NAME}=[^\n]*" PATH_VALUE "${PKGCONFIG_CONTENT}")
  452. string(REPLACE "${PATH_NAME}=" "" PATH_VALUE "${PATH_VALUE}")
  453. if(NOT PATH_VALUE)
  454. message(FATAL_ERROR "failed to find pkgconfig variable ${PATH_NAME}")
  455. endif()
  456. execute_process(
  457. COMMAND "${MSYS_ROOT}/usr/bin/cygpath.exe" -w "${PATH_VALUE}"
  458. OUTPUT_VARIABLE FIXED_PATH
  459. OUTPUT_STRIP_TRAILING_WHITESPACE
  460. )
  461. file(TO_CMAKE_PATH "${FIXED_PATH}" FIXED_PATH)
  462. vcpkg_replace_string("${PKGCONFIG_FILE}" "${PATH_NAME}=${PATH_VALUE}" "${PATH_NAME}=${FIXED_PATH}")
  463. endforeach()
  464. # list libraries with -l flag (so pkgconf knows they are libraries and not just linker flags)
  465. foreach(LIBS_ENTRY Libs Libs.private)
  466. string(REGEX MATCH "${LIBS_ENTRY}: [^\n]*" LIBS_VALUE "${PKGCONFIG_CONTENT}")
  467. if(NOT LIBS_VALUE)
  468. message(FATAL_ERROR "failed to find pkgconfig entry ${LIBS_ENTRY}")
  469. endif()
  470. string(REPLACE "${LIBS_ENTRY}: " "" LIBS_VALUE "${LIBS_VALUE}")
  471. if(LIBS_VALUE)
  472. set(LIBS_VALUE_OLD "${LIBS_VALUE}")
  473. string(REGEX REPLACE "([^ ]+)[.]lib" "-l\\1" LIBS_VALUE "${LIBS_VALUE}")
  474. set(LIBS_VALUE_NEW "${LIBS_VALUE}")
  475. vcpkg_replace_string("${PKGCONFIG_FILE}" "${LIBS_ENTRY}: ${LIBS_VALUE_OLD}" "${LIBS_ENTRY}: ${LIBS_VALUE_NEW}")
  476. endif()
  477. endforeach()
  478. endforeach()
  479. endforeach()
  480. endif()
  481. vcpkg_fixup_pkgconfig()
  482. # Handle dependencies
  483. x_vcpkg_pkgconfig_get_modules(PREFIX FFMPEG_PKGCONFIG MODULES ${FFMPEG_PKGCONFIG_MODULES} LIBS)
  484. function(append_dependencies_from_libs out)
  485. cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "LIBS" "")
  486. string(REGEX REPLACE "[ ]+" ";" contents "${arg_LIBS}")
  487. list(FILTER contents EXCLUDE REGEX "^-F.+")
  488. list(FILTER contents EXCLUDE REGEX "^-framework$")
  489. list(FILTER contents EXCLUDE REGEX "^-L.+")
  490. list(FILTER contents EXCLUDE REGEX "^-libpath:.+")
  491. list(TRANSFORM contents REPLACE "^-Wl,-framework," "-l")
  492. list(FILTER contents EXCLUDE REGEX "^-Wl,.+")
  493. list(TRANSFORM contents REPLACE "^-l" "")
  494. list(FILTER contents EXCLUDE REGEX "^avutil$")
  495. list(FILTER contents EXCLUDE REGEX "^avcodec$")
  496. list(FILTER contents EXCLUDE REGEX "^avdevice$")
  497. list(FILTER contents EXCLUDE REGEX "^avfilter$")
  498. list(FILTER contents EXCLUDE REGEX "^avformat$")
  499. list(FILTER contents EXCLUDE REGEX "^postproc$")
  500. list(FILTER contents EXCLUDE REGEX "^swresample$")
  501. list(FILTER contents EXCLUDE REGEX "^swscale$")
  502. if(VCPKG_TARGET_IS_WINDOWS)
  503. list(TRANSFORM contents TOLOWER)
  504. endif()
  505. if(contents)
  506. list(APPEND "${out}" "${contents}")
  507. set("${out}" "${${out}}" PARENT_SCOPE)
  508. endif()
  509. endfunction()
  510. append_dependencies_from_libs(FFMPEG_DEPENDENCIES_RELEASE LIBS "${FFMPEG_PKGCONFIG_LIBS_RELEASE}")
  511. append_dependencies_from_libs(FFMPEG_DEPENDENCIES_DEBUG LIBS "${FFMPEG_PKGCONFIG_LIBS_DEBUG}")
  512. # must remove duplicates from the front to respect link order so reverse first
  513. list(REVERSE FFMPEG_DEPENDENCIES_RELEASE)
  514. list(REVERSE FFMPEG_DEPENDENCIES_DEBUG)
  515. list(REMOVE_DUPLICATES FFMPEG_DEPENDENCIES_RELEASE)
  516. list(REMOVE_DUPLICATES FFMPEG_DEPENDENCIES_DEBUG)
  517. list(REVERSE FFMPEG_DEPENDENCIES_RELEASE)
  518. list(REVERSE FFMPEG_DEPENDENCIES_DEBUG)
  519. message(STATUS "Dependencies (release): ${FFMPEG_DEPENDENCIES_RELEASE}")
  520. message(STATUS "Dependencies (debug): ${FFMPEG_DEPENDENCIES_DEBUG}")
  521. # Handle version strings
  522. function(extract_regex_from_file out)
  523. cmake_parse_arguments(PARSE_ARGV 1 "arg" "MAJOR" "FILE_WITHOUT_EXTENSION;REGEX" "")
  524. file(READ "${arg_FILE_WITHOUT_EXTENSION}.h" contents)
  525. if(contents MATCHES "${arg_REGEX}")
  526. if(NOT CMAKE_MATCH_COUNT EQUAL 1)
  527. message(FATAL_ERROR "Could not identify match group in regular expression \"${arg_REGEX}\"")
  528. endif()
  529. else()
  530. if(arg_MAJOR)
  531. file(READ "${arg_FILE_WITHOUT_EXTENSION}_major.h" contents)
  532. if(contents MATCHES "${arg_REGEX}")
  533. if(NOT CMAKE_MATCH_COUNT EQUAL 1)
  534. message(FATAL_ERROR "Could not identify match group in regular expression \"${arg_REGEX}\"")
  535. endif()
  536. else()
  537. message(WARNING "Could not find line matching \"${arg_REGEX}\" in file \"${arg_FILE_WITHOUT_EXTENSION}_major.h\"")
  538. endif()
  539. else()
  540. message(WARNING "Could not find line matching \"${arg_REGEX}\" in file \"${arg_FILE_WITHOUT_EXTENSION}.h\"")
  541. endif()
  542. endif()
  543. set("${out}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
  544. endfunction()
  545. function(extract_version_from_component out)
  546. cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "COMPONENT" "")
  547. string(TOLOWER "${arg_COMPONENT}" component_lower)
  548. string(TOUPPER "${arg_COMPONENT}" component_upper)
  549. extract_regex_from_file(major_version
  550. FILE_WITHOUT_EXTENSION "${SOURCE_PATH}/${component_lower}/version"
  551. MAJOR
  552. REGEX "#define ${component_upper}_VERSION_MAJOR[ ]+([0-9]+)"
  553. )
  554. extract_regex_from_file(minor_version
  555. FILE_WITHOUT_EXTENSION "${SOURCE_PATH}/${component_lower}/version"
  556. REGEX "#define ${component_upper}_VERSION_MINOR[ ]+([0-9]+)"
  557. )
  558. extract_regex_from_file(micro_version
  559. FILE_WITHOUT_EXTENSION "${SOURCE_PATH}/${component_lower}/version"
  560. REGEX "#define ${component_upper}_VERSION_MICRO[ ]+([0-9]+)"
  561. )
  562. set("${out}" "${major_version}.${minor_version}.${micro_version}" PARENT_SCOPE)
  563. endfunction()
  564. extract_regex_from_file(FFMPEG_VERSION
  565. FILE_WITHOUT_EXTENSION "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/libavutil/ffversion"
  566. REGEX "#define FFMPEG_VERSION[ ]+\"(.+)\""
  567. )
  568. extract_version_from_component(LIBAVUTIL_VERSION
  569. COMPONENT libavutil)
  570. extract_version_from_component(LIBAVCODEC_VERSION
  571. COMPONENT libavcodec)
  572. extract_version_from_component(LIBAVDEVICE_VERSION
  573. COMPONENT libavdevice)
  574. extract_version_from_component(LIBAVFILTER_VERSION
  575. COMPONENT libavfilter)
  576. extract_version_from_component(LIBAVFORMAT_VERSION
  577. COMPONENT libavformat)
  578. extract_version_from_component(LIBSWRESAMPLE_VERSION
  579. COMPONENT libswresample)
  580. extract_version_from_component(LIBSWSCALE_VERSION
  581. COMPONENT libswscale)
  582. # Handle copyright
  583. file(STRINGS "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-out.log" LICENSE_STRING REGEX "License: .*" LIMIT_COUNT 1)
  584. if(LICENSE_STRING STREQUAL "License: LGPL version 2.1 or later")
  585. set(LICENSE_FILE "COPYING.LGPLv2.1")
  586. elseif(LICENSE_STRING STREQUAL "License: LGPL version 3 or later")
  587. set(LICENSE_FILE "COPYING.LGPLv3")
  588. elseif(LICENSE_STRING STREQUAL "License: GPL version 2 or later")
  589. set(LICENSE_FILE "COPYING.GPLv2")
  590. elseif(LICENSE_STRING STREQUAL "License: GPL version 3 or later")
  591. set(LICENSE_FILE "COPYING.GPLv3")
  592. elseif(LICENSE_STRING STREQUAL "License: nonfree and unredistributable")
  593. set(LICENSE_FILE "COPYING.NONFREE")
  594. file(WRITE "${SOURCE_PATH}/${LICENSE_FILE}" "${LICENSE_STRING}")
  595. else()
  596. message(FATAL_ERROR "Failed to identify license (${LICENSE_STRING})")
  597. endif()
  598. configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" "${CURRENT_PACKAGES_DIR}/share/${PORT}/vcpkg-cmake-wrapper.cmake" @ONLY)
  599. vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/${LICENSE_FILE}")