diff options
| author | ruki <[email protected]> | 2021-12-09 09:50:44 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-12-09 09:50:44 +0800 |
| commit | 3291cacfdbc8667c4a4a32ef83ea79b79dc01e1c (patch) | |
| tree | bb4ca2392be6194d33faef89969cc8b4c13e8305 | |
| parent | 10a3e5bc3ac87081d20b978a0a5eada4a6db17fe (diff) | |
| parent | 74e0376c16f033d1a72a280808f83c9e4aeb4874 (diff) | |
Merge pull request #1898 from xmake-io/ifort
improve ifort
| -rw-r--r-- | xmake/modules/detect/sdks/find_iccenv.lua | 21 | ||||
| -rw-r--r-- | xmake/modules/detect/sdks/find_ifortenv.lua | 22 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_ifort.lua | 14 | ||||
| -rw-r--r-- | xmake/toolchains/icc/check.lua | 32 | ||||
| -rw-r--r-- | xmake/toolchains/icc/load.lua | 9 | ||||
| -rw-r--r-- | xmake/toolchains/ifort/check.lua | 32 | ||||
| -rw-r--r-- | xmake/toolchains/ifort/load.lua | 9 |
7 files changed, 98 insertions, 41 deletions
diff --git a/xmake/modules/detect/sdks/find_iccenv.lua b/xmake/modules/detect/sdks/find_iccenv.lua index 0e432a99c..2eb2c353c 100644 --- a/xmake/modules/detect/sdks/find_iccenv.lua +++ b/xmake/modules/detect/sdks/find_iccenv.lua @@ -102,6 +102,11 @@ function _find_intel_on_windows(opt) -- find iclvars_bat.bat local paths = {"$(env ICPP_COMPILER20)"} local iclvars_bat = find_file("bin/iclvars.bat", paths) + -- look for setvars.bat which is new in 2021 + if not iclvars_bat then + paths = {"$(env ICPP_COMPILER21)"} + iclvars_bat = find_file("../../../setvars.bat", paths) + end if iclvars_bat then -- load iclvars_bat @@ -123,6 +128,22 @@ function _find_intel_on_linux(opt) local sdkdir = path.directory(path.directory(icc)) return {sdkdir = sdkdir, bindir = path.directory(icc), path.join(sdkdir, "include"), libdir = path.join(sdkdir, "lib")} end + + -- find it from oneapi sdk directory + local oneapi_rootdirs = {"~/intel/oneapi/compiler", "/opt/intel/oneapi/compiler"} + local arch = os.arch() == "x86_64" and "intel64" or "ia32" + paths = {} + for _, rootdir in ipairs(oneapi_rootdirs) do + table.insert(paths, path.join(rootdir, "*", is_host("macosx") and "mac" or "linux", "bin", arch)) + end + if #paths > 0 then + local icc = find_file("icc", paths) + if icc then + local bindir = path.directory(icc) + local sdkdir = path.directory(bindir) + return {sdkdir = sdkdir, bindir = bindir, libdir = path.join(sdkdir, "compiler", "lib", arch)} + end + end end -- find intel c/c++ environment diff --git a/xmake/modules/detect/sdks/find_ifortenv.lua b/xmake/modules/detect/sdks/find_ifortenv.lua index 42f29c6a0..131c4b930 100644 --- a/xmake/modules/detect/sdks/find_ifortenv.lua +++ b/xmake/modules/detect/sdks/find_ifortenv.lua @@ -122,12 +122,28 @@ end -- find intel fortran envirnoment on linux function _find_intel_on_linux(opt) - -- attempt to find the sdk directory local paths = {"/opt/intel/bin", "/usr/local/bin", "/usr/bin"} local ifort = find_file("ifort", paths) if ifort then - local sdkdir = path.directory(path.directory(ifort)) - return {sdkdir = sdkdir, bindir = path.directory(ifort), path.join(sdkdir, "include"), libdir = path.join(sdkdir, "lib")} + local bindir = path.directory(ifort) + local sdkdir = path.directory(bindir) + return {sdkdir = sdkdir, bindir = bindir, libdir = path.join(sdkdir, "lib")} + end + + -- find it from oneapi sdk directory + local oneapi_rootdirs = {"~/intel/oneapi/compiler", "/opt/intel/oneapi/compiler"} + local arch = os.arch() == "x86_64" and "intel64" or "ia32" + paths = {} + for _, rootdir in ipairs(oneapi_rootdirs) do + table.insert(paths, path.join(rootdir, "*", is_host("macosx") and "mac" or "linux", "bin", arch)) + end + if #paths > 0 then + local ifort = find_file("ifort", paths) + if ifort then + local bindir = path.directory(ifort) + local sdkdir = path.directory(bindir) + return {sdkdir = sdkdir, bindir = bindir, libdir = path.join(sdkdir, "compiler", "lib", arch)} + end end end diff --git a/xmake/modules/detect/tools/find_ifort.lua b/xmake/modules/detect/tools/find_ifort.lua index dfa8f254c..31f158996 100644 --- a/xmake/modules/detect/tools/find_ifort.lua +++ b/xmake/modules/detect/tools/find_ifort.lua @@ -52,20 +52,6 @@ function main(opt) return program, version else -- find program - if is_host("linux") then - local arch = os.arch() == "x86_64" and "intel64" or "ia32" - local dirs = {"~/intel/oneapi/compiler/latest/linux"} - opt.envs = opt.envs or {} - opt.paths = opt.paths or {} - local LD_LIBRARY_PATH = {} - for _, dir in ipairs(dirs) do - if os.isdir(dir) then - table.insert(LD_LIBRARY_PATH, path.join(dir, "compiler/lib", arch)) - table.insert(opt.paths, path.join(dir, "bin", arch)) - end - end - opt.envs.LD_LIBRARY_PATH = path.joinenv(LD_LIBRARY_PATH) - end local program = find_program(opt.program or "ifort", opt) -- find program version diff --git a/xmake/toolchains/icc/check.lua b/xmake/toolchains/icc/check.lua index 3b9c7b953..9dde538f0 100644 --- a/xmake/toolchains/icc/check.lua +++ b/xmake/toolchains/icc/check.lua @@ -28,7 +28,8 @@ import("lib.detect.find_tool") function _check_intel_on_windows(toolchain) -- have been checked? - if config.get("__iclvarsall") then + local varsall = toolchain:config("varsall") + if varsall then return true end @@ -38,18 +39,11 @@ function _check_intel_on_windows(toolchain) local iclvarsall = iccenv.iclvars local iclenv = iclvarsall[toolchain:arch()] if iclenv and iclenv.PATH and iclenv.INCLUDE and iclenv.LIB then - - -- save iclvars - config.set("__iclvarsall", iclvarsall) - - -- check compiler - local program = nil local tool = find_tool("icl.exe", {force = true, envs = iclenv, version = true}) if tool then - program = tool.program - end - if program then cprint("checking for Intel C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) + toolchain:config_set("varsall", iclvarsall) + toolchain:configs_save() return true end end @@ -58,7 +52,23 @@ end -- check intel on linux function _check_intel_on_linux(toolchain) - return find_tool("icc") + local iccenv = toolchain:config("iccenv") + if iccenv then + return true + end + iccenv = find_iccenv() + if iccenv then + local ldname = is_host("macosx") and "DYLD_LIBRARY_PATH" or "LD_LIBRARY_PATH" + local tool = find_tool("icc", {force = true, envs = {[ldname] = iccenv.libdir}, paths = iccenv.bindir}) + if tool then + cprint("checking for Intel C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) + toolchain:config_set("iccenv", iccenv) + toolchain:config_set("bindir", iccenv.bindir) + toolchain:configs_save() + return true + end + return true + end end -- main entry diff --git a/xmake/toolchains/icc/load.lua b/xmake/toolchains/icc/load.lua index 5784fc5c8..e1ceba260 100644 --- a/xmake/toolchains/icc/load.lua +++ b/xmake/toolchains/icc/load.lua @@ -26,7 +26,7 @@ import("core.project.config") function _add_iclenv(toolchain, name) -- get iclvarsall - local iclvarsall = config.get("__iclvarsall") + local iclvarsall = toolchain:config("varsall") if not iclvarsall then return end @@ -100,6 +100,13 @@ function _load_intel_on_linux(toolchain) toolchain:add("ldflags", march) toolchain:add("shflags", march) end + + -- get icc environments + local iccenv = toolchain:config("iccenv") + if iccenv then + local ldname = is_host("macosx") and "DYLD_LIBRARY_PATH" or "LD_LIBRARY_PATH" + toolchain:add("runenvs", ldname, iccenv.libdir) + end end -- main entry diff --git a/xmake/toolchains/ifort/check.lua b/xmake/toolchains/ifort/check.lua index 67d4e3931..285f5c86c 100644 --- a/xmake/toolchains/ifort/check.lua +++ b/xmake/toolchains/ifort/check.lua @@ -28,7 +28,8 @@ import("lib.detect.find_tool") function _check_intel_on_windows(toolchain) -- have been checked? - if config.get("__ifortvarsall") then + local varsall = toolchain:config("varsall") + if varsall then return true end @@ -38,18 +39,11 @@ function _check_intel_on_windows(toolchain) local ifortvarsall = ifortenv.ifortvars local ifortenv = ifortvarsall[toolchain:arch()] if ifortenv and ifortenv.PATH and ifortenv.INCLUDE and ifortenv.LIB then - - -- save ifortvars - config.set("__ifortvarsall", ifortvarsall) - - -- check compiler - local program = nil local tool = find_tool("ifort.exe", {force = true, envs = ifortenv, version = true}) if tool then - program = tool.program - end - if program then cprint("checking for Intel Fortran Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) + toolchain:config_set("varsall", ifortvarsall) + toolchain:configs_save() return true end end @@ -58,7 +52,23 @@ end -- check intel on linux function _check_intel_on_linux(toolchain) - return find_tool("ifort") + local ifortenv = toolchain:config("ifortenv") + if ifortenv then + return true + end + ifortenv = find_ifortenv() + if ifortenv then + local ldname = is_host("macosx") and "DYLD_LIBRARY_PATH" or "LD_LIBRARY_PATH" + local tool = find_tool("ifort", {force = true, envs = {[ldname] = ifortenv.libdir}, paths = ifortenv.bindir}) + if tool then + cprint("checking for Intel Fortran Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) + toolchain:config_set("ifortenv", ifortenv) + toolchain:config_set("bindir", ifortenv.bindir) + toolchain:configs_save() + return true + end + return true + end end -- main entry diff --git a/xmake/toolchains/ifort/load.lua b/xmake/toolchains/ifort/load.lua index 804f3a914..2cb212a57 100644 --- a/xmake/toolchains/ifort/load.lua +++ b/xmake/toolchains/ifort/load.lua @@ -26,7 +26,7 @@ import("core.project.config") function _add_ifortenv(toolchain, name) -- get ifortvarsall - local ifortvarsall = config.get("__ifortvarsall") + local ifortvarsall = toolchain:config("varsall") if not ifortvarsall then return end @@ -85,6 +85,13 @@ function _load_intel_on_linux(toolchain) toolchain:add("fcldflags", march) toolchain:add("fcshflags", march) end + + -- get ifort environments + local ifortenv = toolchain:config("ifortenv") + if ifortenv then + local ldname = is_host("macosx") and "DYLD_LIBRARY_PATH" or "LD_LIBRARY_PATH" + toolchain:add("runenvs", ldname, ifortenv.libdir) + end end -- main entry |
