소스 검색

Improve ffmpeg to support for android on windows (#3312)

* add msys2 dep for ffmpeg

* run configure as shell

* add android ci on windows

* fix os

* fix os again

* improve ci

* fix if else

* dump dirs

* fix ndk path

* modify path type

* translate path

* add verbose info

* fix cross prefix

* restore ci

* limit jobs

* add verbose info

* add verbose info

* improve msys2 deps

* fix msys2

* do some test

* improve msys2 deps

* enable verbose

* use mingw64 msystem

* improve gcc deps

* improve mingw64
ruki 1 년 전
부모
커밋
b88904dbee
3개의 변경된 파일132개의 추가작업 그리고 37개의 파일을 삭제
  1. 58 0
      .github/workflows/android_windows.yml
  2. 42 34
      packages/f/ffmpeg/xmake.lua
  3. 32 3
      packages/m/msys2/xmake.lua

+ 58 - 0
.github/workflows/android_windows.yml

@@ -0,0 +1,58 @@
+name: Android (Windows)
+
+on:
+  pull_request:
+    branches:
+      - dev
+
+jobs:
+  build:
+    runs-on: windows-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        arch: [armeabi-v7a, arm64-v8a]
+        ndk: ["r22", "r26c"]
+        ndk_sdkver: ["29"]
+
+    concurrency:
+        group: ${{ github.ref }}-${{ github.base_ref }}-${{ github.head_ref }}-Android-Windows-${{ matrix.arch }}-${{ matrix.ndk }}-${{ matrix.ndk_sdkver }}
+        cancel-in-progress: true
+    steps:
+      - uses: actions/checkout@v1
+      - uses: xmake-io/github-action-setup-xmake@v1
+        with:
+          xmake-version: branch@master
+
+      - name: Configure Pagefile
+        uses: al-cheb/[email protected]
+        with:
+          minimum-size: 8GB
+          maximum-size: 32GB
+          disk-root: "D:"
+
+      - name: Prepare
+        run: |
+          if ("${{ matrix.ndk }}" -eq "r26c") {
+            curl -fsSL "https://dl.google.com/android/repository/android-ndk-r26c-windows.zip" -o android-ndk-r26c-windows.zip
+            Expand-Archive ./android-ndk-r26c-windows.zip -DestinationPath ./ndk
+          } else {
+            curl -fsSL "https://dl.google.com/android/repository/android-ndk-r22-windows-x86_64.zip" -o android-ndk-r22-windows-x86_64.zip
+            Expand-Archive ./android-ndk-r22-windows-x86_64.zip -DestinationPath ./ndk
+          }
+
+      - name: Tests
+        run: |
+          git clone https://github.com/xmake-io/xmake.git --recurse-submodules -b master xmakesrc
+          cd xmakesrc/core
+          xmake
+          cd ../..
+          Copy-Item ./xmakesrc/core/build/xmake.exe ./xmakesrc/xmake
+          Copy-Item ./xmakesrc/scripts/xrepo.bat ./xmakesrc/xmake
+          Copy-Item ./xmakesrc/scripts/xrepo.ps1 ./xmakesrc/xmake
+          $Env:XMAKE_MAIN_REPO = "https://github.com/xmake-io/xmake-repo.git"
+          $Env:XMAKE_PROGRAM_DIR = $(Resolve-Path ./xmakesrc/xmake)
+          Set-Item -Path Env:Path -Value ($Env:XMAKE_PROGRAM_DIR + ";" + $Env:Path)
+          xmake --version
+          xmake l ./scripts/test.lua -D -p android --ndk=D:/a/xmake-repo/xmake-repo/ndk/android-ndk-${{ matrix.ndk }} --ndk_sdkver=${{ matrix.ndk_sdkver }} -a ${{ matrix.arch }}
+

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

@@ -61,32 +61,30 @@ package("ffmpeg")
         add_deps("yasm")
     end
 
-    if on_fetch then
-        on_fetch("mingw", "linux", "macosx", function (package, opt)
-            import("lib.detect.find_tool")
-            if opt.system then
-                local result
-                for _, name in ipairs({"libavcodec", "libavdevice", "libavfilter", "libavformat", "libavutil", "libpostproc", "libswresample", "libswscale"}) do
-                    local pkginfo = package:find_package("pkgconfig::" .. name, opt)
-                    if pkginfo then
-                        pkginfo.version = nil
-                        if not result then
-                            result = pkginfo
-                        else
-                            result = result .. pkginfo
-                        end
+    on_fetch("mingw", "linux", "macosx", function (package, opt)
+        import("lib.detect.find_tool")
+        if opt.system then
+            local result
+            for _, name in ipairs({"libavcodec", "libavdevice", "libavfilter", "libavformat", "libavutil", "libpostproc", "libswresample", "libswscale"}) do
+                local pkginfo = package:find_package("pkgconfig::" .. name, opt)
+                if pkginfo then
+                    pkginfo.version = nil
+                    if not result then
+                        result = pkginfo
                     else
-                        return
+                        result = result .. pkginfo
                     end
+                else
+                    return
                 end
-                local ffmpeg = find_tool("ffmpeg", {check = "-help", version = true, command = "-version", parse = "%d+%.?%d+%.?%d+", force = true})
-                if ffmpeg then
-                    result.version = ffmpeg.version
-                end
-                return result
             end
-        end)
-    end
+            local ffmpeg = find_tool("ffmpeg", {check = "-help", version = true, command = "-version", parse = "%d+%.?%d+%.?%d+", force = true})
+            if ffmpeg then
+                result.version = ffmpeg.version
+            end
+            return result
+        end
+    end)
 
     on_load("linux", "macosx", "android", function (package)
         local configdeps = {zlib    = "zlib",
@@ -108,6 +106,9 @@ package("ffmpeg")
         if not package:config("gpl") then
             package:set("license", "LGPL-3.0")
         end
+        if is_subhost("windows") and os.arch() == "x64" then
+            package:add("deps", "msys2", {configs = {msystem = "MINGW64", mingw64_gcc = true, base_devel = true}})
+        end
     end)
 
     on_install("windows|x64", "mingw|x86_64", function (package)
@@ -122,7 +123,7 @@ package("ffmpeg")
         package:addenv("PATH", "bin")
     end)
 
-    on_install("linux", "macosx", "android@linux,macosx", function (package)
+    on_install("linux", "macosx", "android", function (package)
         local configs = {"--enable-version3",
                          "--disable-doc"}
         if package:config("gpl") then
@@ -182,6 +183,12 @@ package("ffmpeg")
             else
                 raise("unknown arch(%s) for android!", package:arch())
             end
+            local function _translate_path(p)
+                if p and is_host("windows") then
+                    return p:gsub("\\", "/")
+                end
+                return p
+            end
             local sysroot  = path.join(path.directory(bin), "sysroot")
             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"))
@@ -201,19 +208,20 @@ package("ffmpeg")
             table.insert(configs, "--disable-avdevice")
             table.insert(configs, "--arch=" .. arch)
             table.insert(configs, "--cpu=" .. cpu)
-            table.insert(configs, "--cc=" .. path.join(bin, triple .. ndk_sdkver .. "-clang"))
-            table.insert(configs, "--cxx=" .. path.join(bin, triple .. ndk_sdkver .. "-clang++"))
-            table.insert(configs, "--ar=" .. path.join(bin, "llvm-ar"))
-            table.insert(configs, "--ranlib=" .. path.join(bin, "llvm-ranlib"))
-            table.insert(configs, "--strip=" .. path.join(bin, "llvm-strip"))
+            table.insert(configs, "--cc=" .. _translate_path(path.join(bin, triple .. ndk_sdkver .. "-clang")))
+            table.insert(configs, "--cxx=" .. _translate_path(path.join(bin, triple .. ndk_sdkver .. "-clang++")))
+            table.insert(configs, "--ar=" .. _translate_path(path.join(bin, "llvm-ar")))
+            table.insert(configs, "--ranlib=" .. _translate_path(path.join(bin, "llvm-ranlib")))
+            table.insert(configs, "--strip=" .. _translate_path(path.join(bin, "llvm-strip")))
             table.insert(configs, "--extra-cflags=" .. table.concat(cflags, ' '))
             table.insert(configs, "--extra-cxxflags=" .. table.concat(cxxflags, ' '))
-            table.insert(configs, "--sysroot=" .. sysroot)
-            table.insert(configs, "--cross-prefix=" .. cross_prefix)
-            table.insert(configs, "--prefix=" .. package:installdir())
-            os.vrunv("./configure", configs)
-            local argv = {"-j4"}
-            if option.get("verbose") then
+            table.insert(configs, "--sysroot=" .. _translate_path(sysroot))
+            table.insert(configs, "--cross-prefix=" .. _translate_path(cross_prefix))
+            table.insert(configs, "--prefix=" .. _translate_path(package:installdir()))
+            os.vrunv("./configure", configs, {shell = true})
+            local njob = option.get("jobs") or tostring(os.default_njob())
+            local argv = {"-j" .. njob}
+            if option.get("verbose") or is_host("windows") then -- we always need enable it on windows, otherwise it will fail.
                 table.insert(argv, "V=1")
             end
             os.vrunv("make", argv)

+ 32 - 3
packages/m/msys2/xmake.lua

@@ -6,23 +6,52 @@ package("msys2")
     add_deps("msys2-base")
 
     add_configs("msystem", {description = "Set msys2 system.", type = "string", values = {"MSYS", "MINGW32", "MINGW64", "UCRT64", "CLANG32", "CLANG64", "CLANGARM64"}})
+    add_configs("pathtype", {description = "Set path type.", default = "inherit", type = "string", values = {"inherit"}})
+
+    add_configs("make", {description = "Install gnumake.", default = false, type = "boolean"})
+    add_configs("gcc", {description = "Install gcc.", default = false, type = "boolean"})
+    add_configs("diffutils", {description = "Install diffutils.", default = false, type = "boolean"})
+    add_configs("base_devel", {description = "Install base-devel.", default = false, type = "boolean"})
+    add_configs("mingw64_gcc", {description = "Install mingw64 gcc.", default = false, type = "boolean"})
+    add_configs("mingw64_toolchain", {description = "Install mingw64 toolchain.", default = false, type = "boolean"})
+    add_configs("mingw32_gcc", {description = "Install mingw32 gcc.", default = false, type = "boolean"})
+    add_configs("mingw32_toolchain", {description = "Install mingw32 toolchain.", default = false, type = "boolean"})
 
     set_policy("package.precompiled", false)
 
     on_install("@windows|x64", function (package)
         local msys2_base = package:dep("msys2-base")
+        local bash = path.join(msys2_base:installdir("usr/bin"), "bash.exe")
         local msystem = package:config("msystem")
         if msystem then
             package:addenv("MSYSTEM", msystem)
-            local bash = path.join(msys2_base:installdir("usr/bin"), "bash.exe")
             if msystem == "MINGW64" then
-                os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * mingw-w64-x86_64-toolchain"})
                 package:addenv("PATH", msys2_base:installdir("mingw64/bin"))
             elseif msystem == "MINGW32" then
-                os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * mingw-w64-i686-toolchain"})
                 package:addenv("PATH", msys2_base:installdir("mingw32/bin"))
             end
         end
+        local pathtype = package:config("pathtype")
+        if pathtype then
+            package:addenv("MSYS2_PATH_TYPE", pathtype)
+        end
+        package:addenv("CHERE_INVOKING", "1")
+
+        -- install additional packages
+        local packages = {
+            "gcc", "make", "diffutils",
+            base_devel = "base-devel",
+            mingw32_gcc = "mingw-w64-i686-gcc",
+            mingw32_toolchain = "mingw-w64-i686-toolchain",
+            mingw64_gcc = "mingw-w64-x86_64-gcc",
+            mingw64_toolchain = "mingw-w64-x86_64-toolchain"}
+        for k, v in pairs(packages) do
+            local configname = type(k) == "number" and v or k
+            local packagename = v
+            if package:config(configname) then
+                os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * " .. packagename})
+            end
+        end
     end)
 
     on_test(function (package)