瀏覽代碼

ffmpeg: Fix build on msys2 (#6104)

* ffmpeg: Fix build on msys2

* Fix cross-compilation with windows plat

* remove clang flag for android r27

* Fix windows cross-compilation

* Improve AR

* Improve runtimes
star9029 9 月之前
父節點
當前提交
60c609e53b
共有 1 個文件被更改,包括 42 次插入8 次删除
  1. 42 8
      packages/f/ffmpeg/xmake.lua

+ 42 - 8
packages/f/ffmpeg/xmake.lua

@@ -117,11 +117,20 @@ package("ffmpeg")
             package:add("syslinks", "Bcrypt", "Mfplat", "mfuuid", "Ole32", "Secur32", "Strmiids", "User32", "ws2_32")
         end
         if is_subhost("windows") and os.arch() == "x64" then
-            if package:is_plat("windows", "mingw") then
-                package:add("deps", "msys2", {configs = {msystem = "MINGW64", base_devel = true}})
-            else
-                package:add("deps", "msys2", {configs = {msystem = "MINGW64", mingw64_gcc = true, base_devel = true}})
+            local configs = {
+                msystem = "MINGW64",
+                base_devel = true,
+            }
+            -- @see https://stackoverflow.com/questions/65438878/ffmpeg-build-on-windows-using-msvc-make-fails
+            configs.make = true
+            if not package:is_plat("windows", "mingw") then
+                configs.mingw64_gcc = true
             end
+            package:add("deps", "msys2", {configs = configs})
+        end
+
+        if not package:is_cross() then
+            package:addenv("PATH", "bin")
         end
     end)
 
@@ -158,6 +167,7 @@ package("ffmpeg")
             table.insert(configs, "--enable-dxva2")
             table.insert(configs, "--enable-mediafoundation")
             table.insert(configs, "--toolchain=msvc")
+            table.insert(configs, "--extra-cflags=-" .. package:runtimes())
         elseif package:is_plat("mingw") then
             if package:is_arch("x86", "i386", "i686") then
                 table.insert(configs, "--target-os=mingw32")
@@ -206,6 +216,16 @@ package("ffmpeg")
             if path.cygwin then -- xmake 2.8.9
                 import("package.tools.autoconf")
                 local envs = autoconf.buildenvs(package, {packagedeps = "libiconv"})
+                if not envs.PATH then -- Fix in xmake 2.9.8
+                    local msvc = package:toolchain("msvc") or toolchain.load("msvc", {plat = package:plat(), arch = package:arch()})
+                    envs.PATH = os.getenv("PATH") -- we need to reserve PATH on msys2
+                    envs = os.joinenvs(envs, msvc:runenvs())
+                end
+                if package:config("shared") and package:is_cross() then
+                    -- The makedef script always assumes that the AR environment variable is gnu ar
+                    -- @see https://github.com/microsoft/vcpkg/issues/42365#issuecomment-2567009409
+                    envs.AR = nil
+                end
                 -- add gas-preprocessor to PATH
                 if package:is_arch("arm", "arm64") then
                     envs.PATH = path.join(os.programdir(), "scripts") .. path.envsep() .. envs.PATH
@@ -299,9 +319,14 @@ package("ffmpeg")
             local cflags   = table.join(table.wrap(package:config("cxflags")), table.wrap(package:config("cflags")), table.wrap(get_config("cxflags")), get_config("cflags"))
             local cxxflags = table.join(table.wrap(package:config("cxflags")), table.wrap(package:config("cxxflags")), table.wrap(get_config("cxflags")), get_config("cxxflags"))
             assert(os.isdir(sysroot), "we do not support old version ndk!")
+
+            local ndkver = tonumber(ndk:config("ndkver"))
             if package:is_arch("arm64-v8a") then
-                table.insert(cflags, "-mfpu=neon")
-                table.insert(cflags, "-mfloat-abi=hard")
+                -- https://github.com/llvm/llvm-project/issues/74361
+                if ndkver < 27 then
+                    table.insert(cflags, "-mfpu=neon")
+                    table.insert(cflags, "-mfloat-abi=hard")
+                end
             else
                 table.insert(cflags, "-mfpu=neon")
                 table.insert(cflags, "-mfloat-abi=soft")
@@ -336,9 +361,18 @@ package("ffmpeg")
             end
             import("package.tools.autoconf").install(package, configs, opt)
         end
-        package:addenv("PATH", "bin")
     end)
 
     on_test(function (package)
-        assert(package:has_cfuncs("avformat_open_input", {includes = "libavformat/avformat.h"}))
+        if not package:is_cross() then
+            for _, tool in ipairs({"ffprobe", "ffmpeg", "ffplay"}) do
+                if package:config(tool) then
+                    os.vrunv(tool, {"-version"})
+                end
+            end
+        end
+
+        if package:is_library() then
+            assert(package:has_cfuncs("avformat_open_input", {includes = "libavformat/avformat.h"}))
+        end
     end)