Przeglądaj źródła

fix openblas for linux-clang (#2786)

* add metapackage gfortran

* improve openblas/clang
Hoildkv 1 rok temu
rodzic
commit
fadf2bd884

+ 1 - 1
.github/workflows/ubuntu_clang.yml

@@ -28,7 +28,7 @@ jobs:
         run: |
           # TODO we will remove it later
           sudo apt-get update
-          sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev clang libc++-dev p7zip
+          sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev clang libomp-dev libc++-dev p7zip
 
       - name: Tests
         run: |

+ 46 - 0
packages/g/gfortran/xmake.lua

@@ -0,0 +1,46 @@
+package("gfortran")
+
+    set_homepage("https://gcc.gnu.org/fortran/")
+    set_description("The GNU Fortran compiler")
+
+    on_fetch(function (package, opt)
+        import("lib.detect.find_library")
+
+        if opt.system then
+            local fortran = package:find_tool("gfortran", opt)
+            if not fortran then return end
+
+            if package:is_binary() then
+                return true
+            else
+                local installdir = path.directory(path.directory(fortran.program))
+                local target
+                local out, version = os.iorunv(fortran.program, {"-v", "-E"})
+                if version then
+                    target = version:match("Target: (.-)\n")
+                    version = version:match("version (%d+%.%d+%.%d+)")
+                    vmajor = version:split("%.")[1]
+
+                    local paths = {
+                        "/usr/lib",
+                        "/usr/lib64",
+                        "/usr/local/lib",
+                        path.join(installdir, "lib"),
+                    }
+                    if target then
+                        table.insert(paths, path.join("/usr/lib", target))
+                        table.insert(paths, path.join("/usr/lib/gcc", target, vmajor))
+                        table.insert(paths, path.join(installdir, "lib", target, vmajor))
+                    end
+                    local linkinfo = find_library("gfortran", paths)
+                    if linkinfo then
+                        return {
+                            version = version,
+                            links = "gfortran",
+                            linkdirs = {linkinfo.linkdir},
+                        }
+                    end
+                end
+            end
+        end
+    end)

+ 1 - 1
packages/l/libomp/xmake.lua

@@ -12,7 +12,7 @@ package("libomp")
 
     on_fetch("macosx", "linux", function (package, opt)
         if opt.system then
-            return package:find_package("system::omp", {includes = "omp.h"})
+            return package:find_package("system::omp", {includes = "omp.h"}) or package:find_package("system::omp5", {includes = "omp.h"})
         end
     end)
 

+ 20 - 10
packages/o/openblas/xmake.lua

@@ -54,7 +54,7 @@ package("openblas")
     end
     on_load("macosx", "linux", "mingw@windows,msys", function (package)
         if package:config("fortran") then
-            package:add("syslinks", "gfortran")
+            package:add("deps", "gfortran", {system = true})
         end
         if package:config("openmp") then
             package:add("deps", "openmp")
@@ -72,6 +72,9 @@ package("openblas")
         import("lib.detect.find_tool")
         import("package.tools.make")
         local configs = {}
+        if package:is_plat("linux") then
+            table.insert(configs, "CC=" .. package:build_getenv("cc"))
+        end
         if package:debug() then table.insert(configs, "DEBUG=1") end
         if package:config("openmp") then table.insert(configs, "USE_OPENMP=1") end
         if not package:config("shared") then
@@ -83,8 +86,6 @@ package("openblas")
             local fortran = find_tool("gfortran")
             if fortran then
                 table.insert(configs, "FC=" .. fortran.program)
-            else
-                raise("gfortran not found!")
             end
         else
             table.insert(configs, "NO_FORTRAN=1")
@@ -97,11 +98,12 @@ package("openblas")
                 package:addenv("PATH", "bin")
             end
         else
+            local cflags
+            local ldflags
             if package:config("openmp") then
                 local openmp = package:dep("openmp"):fetch()
                 if openmp then
-                    local ldflags
-                    local cflags = openmp.cflags
+                    cflags = openmp.cflags
                     local libomp = package:dep("libomp")
                     if libomp then
                         local fetchinfo = libomp:fetch()
@@ -118,14 +120,22 @@ package("openblas")
                             end
                         end
                     end
-                    if cflags then
-                        io.replace("Makefile.system", "-fopenmp", cflags, {plain = true})
-                    end
-                    if ldflags then
-                        table.insert(configs, "LDFLAGS=" .. ldflags)
+                end
+            end
+            if package:config("fortran") then
+                local gfortran = package:dep("gfortran"):fetch()
+                if gfortran then
+                    for _, linkdir in ipairs(gfortran.linkdirs) do
+                        ldflags = (ldflags or "") .. " -Wl,-L" .. linkdir
                     end
                 end
             end
+            if cflags then
+                io.replace("Makefile.system", "-fopenmp", cflags, {plain = true})
+            end
+            if ldflags then
+                table.insert(configs, "LDFLAGS=" .. ldflags)
+            end
         end
         make.build(package, configs)
         make.make(package, table.join("install", "PREFIX=" .. package:installdir():gsub("\\", "/"), configs))