diff --git a/modules/vstudio/_preload.lua b/modules/vstudio/_preload.lua index ff0367a57..4df39cc1c 100644 --- a/modules/vstudio/_preload.lua +++ b/modules/vstudio/_preload.lua @@ -638,7 +638,17 @@ "3.5", "3.6", "3.8", - "5.0", }) + "5.0", + }) + + p.api.deprecateField("toolchainversion", "Use `toolchain 'gcc-'` or `toolchain 'clang-'` instead.", + function(value) + if value == "4.6" or value == "4.8" or value == "4.9" then + toolset("gcc-" .. value) + elseif value == "3.4" or value == "3.5" or value == "3.6" or value == "3.8" or value == "5.0" then + toolset("clang-" .. value) + end + end) p.api.register { name = "floatabi", diff --git a/modules/vstudio/tests/_tests.lua b/modules/vstudio/tests/_tests.lua index e44022994..cec8c14be 100644 --- a/modules/vstudio/tests/_tests.lua +++ b/modules/vstudio/tests/_tests.lua @@ -119,9 +119,11 @@ return { "android/test_android_build_settings.lua", "android/test_android_files.lua", "android/test_android_project.lua", + "android/test_android_toolset.lua", -- Linux projects "linux/test_linux_files.lua", + "linux/test_linux_toolchains.lua", -- Visual Studio 2026+ Solutions "sln2026/test_configurations.lua", diff --git a/modules/vstudio/tests/android/test_android_toolset.lua b/modules/vstudio/tests/android/test_android_toolset.lua new file mode 100644 index 000000000..b7538a462 --- /dev/null +++ b/modules/vstudio/tests/android/test_android_toolset.lua @@ -0,0 +1,229 @@ +-- +-- tests/android/test_android_toolset.lua +-- Unit tests for Visual Studio Android toolset handling. +-- Author: Nick Clark +-- Copyright (c) 2026 Jess Perkins and the Premake project +-- + +local p = premake +local suite = test.declare("test_android_toolset") +local vc2010 = p.vstudio.vc2010 + + +-- +-- Setup +-- + + local wks, prj + + function suite.setup() + p.action.set("vs2015") + system "android" + architecture "ARM" + wks, prj = test.createWorkspace() + end + + local function prepareConfigProperties() + system "android" + local cfg = test.getconfig(prj, "Debug", platform) + vc2010.configurationProperties(cfg) + end + +-- +-- Test Android GCC 4.6 toolchain mapping. +-- + + function suite.androidGcc46Toolchain() + toolset "gcc-4.6" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_6 + ]] + end + + function suite.androidGcc46ToolsetVersion() + toolset "gcc" + toolchainversion "4.6" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_6 + ]] + end + +-- +-- Test Android GCC 4.8 toolchain mapping. +-- + + function suite.androidGcc48Toolchain() + toolset "gcc-4.8" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_8 + ]] + end + + function suite.androidGcc48ToolsetVersion() + toolset "gcc" + toolchainversion "4.8" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_8 + ]] + end + +-- +-- Test Android GCC 4.9 toolchain mapping. +-- + + function suite.androidGcc49Toolchain() + toolset "gcc-4.9" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_9 + ]] + end + + function suite.androidGcc49ToolsetVersion() + toolset "gcc" + toolchainversion "4.9" + prepareConfigProperties() + test.capture [[ + + Application + GCC_4_9 + ]] + end + +-- +-- Test Android Clang 3.4 toolchain mapping. +-- + function suite.androidClang34Toolchain() + toolset "clang-3.4" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_4 + ]] + end + + function suite.androidClang34ToolsetVersion() + toolset "clang" + toolchainversion "3.4" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_4 + ]] + end + +-- +-- Test Android Clang 3.5 toolchain mapping. +-- + + function suite.androidClang35Toolchain() + toolset "clang-3.5" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_5 + ]] + end + + function suite.androidClang35ToolsetVersion() + toolset "clang" + toolchainversion "3.5" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_5 + ]] + end + +-- +-- Test Android Clang 3.6 toolchain mapping. +-- + + function suite.androidClang36Toolchain() + toolset "clang-3.6" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_6 + ]] + end + + function suite.androidClang36ToolsetVersion() + toolset "clang" + toolchainversion "3.6" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_6 + ]] + end + +-- +-- Test Android Clang 3.8 toolchain mapping. +-- + + function suite.androidClang38Toolchain() + toolset "clang-3.8" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_8 + ]] + end + + function suite.androidClang38ToolsetVersion() + toolset "clang" + toolchainversion "3.8" + prepareConfigProperties() + test.capture [[ + + Application + Clang_3_8 + ]] + end + +-- +-- Test Android Clang 5.0 toolchain mapping. +-- + + function suite.androidClang50Toolchain() + toolset "clang-5.0" + prepareConfigProperties() + test.capture [[ + + Application + Clang_5_0 + ]] + end + + function suite.androidClang50ToolsetVersion() + toolset "clang" + toolchainversion "5.0" + prepareConfigProperties() + test.capture [[ + + Application + Clang_5_0 + ]] + end diff --git a/modules/vstudio/tests/linux/test_linux_files.lua b/modules/vstudio/tests/linux/test_linux_files.lua index 32deea373..43575e9e2 100644 --- a/modules/vstudio/tests/linux/test_linux_files.lua +++ b/modules/vstudio/tests/linux/test_linux_files.lua @@ -32,11 +32,12 @@ local vc2010 = p.vstudio.vc2010 function suite.linkTimeOptimization_On() linktimeoptimization('on') + toolset('gcc-remote') prepareConfigProperties() test.capture [[ Application - v142 + Remote_GCC_1_0 true ]] @@ -48,11 +49,12 @@ local vc2010 = p.vstudio.vc2010 function suite.linkTimeOptimization_Fast() linktimeoptimization('fast') + toolset('gcc-remote') prepareConfigProperties() test.capture [[ Application - v142 + Remote_GCC_1_0 true ]] diff --git a/modules/vstudio/tests/linux/test_linux_toolchains.lua b/modules/vstudio/tests/linux/test_linux_toolchains.lua new file mode 100644 index 000000000..4303194cf --- /dev/null +++ b/modules/vstudio/tests/linux/test_linux_toolchains.lua @@ -0,0 +1,184 @@ +-- +-- tests/vstudio/test_linux_toolchains.lua +-- Unit tests for Visual Studio Linux toolchain handling. +-- Author: Nick Clark +-- Copyright (c) 2026 Jess Perkins and the Premake project +-- + +local p = premake +local suite = test.declare("test_linux_toolchains") +local vc2010 = p.vstudio.vc2010 + + +-- +-- Setup +-- + + local wks, prj + + function suite.setup() + p.action.set("vs2019") + wks, prj = test.createWorkspace() + end + + local function prepareOutputProperties() + system "linux" + local cfg = test.getconfig(prj, "Debug") + vc2010.outputProperties(cfg) + end + + local function prepareConfigProperties() + system "linux" + local cfg = test.getconfig(prj, "Debug", platform) + vc2010.configurationProperties(cfg) + end + +-- +-- Test GCC toolchain remote mapping. +-- + + function suite.remoteGccToolchain() + toolset "gcc-remote" + prepareConfigProperties() + test.capture [[ + + Application + Remote_GCC_1_0 + ]] + end + + function suite.remoteGccToolsetVersion() + toolset "gcc" + toolchainversion "Remote" + prepareConfigProperties() + test.capture [[ + + Application + Remote_GCC_1_0 + ]] + end + +-- +-- Test WSL GCC toolchain mapping. +-- + + function suite.wslGccToolchain() + toolset "gcc-wsl" + prepareConfigProperties() + test.capture [[ + + Application + WSL_1_0 + ]] + end + + function suite.wslGccToolsetVersion() + toolset "gcc" + toolchainversion "WSL" + prepareConfigProperties() + test.capture [[ + + Application + WSL_1_0 + ]] + end + +-- +-- Test WSL2 GCC toolchain mapping. +-- + + function suite.wsl2GccToolchain() + toolset "gcc-wsl2" + prepareConfigProperties() + test.capture [[ + + Application + WSL2_1_0 + ]] + end + + function suite.wsl2GccToolsetVersion() + toolset "gcc" + toolchainversion "WSL2" + prepareConfigProperties() + test.capture [[ + + Application + WSL2_1_0 + ]] + end + +-- +-- Test Clang toolchain remote mapping. +-- + + function suite.remoteClangToolchain() + toolset "clang-remote" + prepareConfigProperties() + test.capture [[ + + Application + Remote_Clang_1_0 + ]] + end + + function suite.remoteClangToolsetVersion() + toolset "clang" + toolchainversion "Remote" + prepareConfigProperties() + test.capture [[ + + Application + Remote_Clang_1_0 + ]] + end + +-- +-- Test WSL Clang toolchain mapping. +-- + + function suite.wslClangToolchain() + toolset "clang-wsl" + prepareConfigProperties() + test.capture [[ + + Application + WSL_Clang_1_0 + ]] + end + + function suite.wslClangToolsetVersion() + toolset "clang" + toolchainversion "WSL" + prepareConfigProperties() + test.capture [[ + + Application + WSL_Clang_1_0 + ]] + end + +-- +-- Test WSL2 Clang toolchain mapping. +-- + + function suite.wsl2ClangToolchain() + toolset "clang-wsl2" + prepareConfigProperties() + test.capture [[ + + Application + WSL2_Clang_1_0 + ]] + end + + function suite.wsl2ClangToolsetVersion() + toolset "clang" + toolchainversion "WSL2" + prepareConfigProperties() + test.capture [[ + + Application + WSL2_Clang_1_0 + ]] + end diff --git a/modules/vstudio/vs2010_vcxproj.lua b/modules/vstudio/vs2010_vcxproj.lua index a2d3308f6..0a626c287 100644 --- a/modules/vstudio/vs2010_vcxproj.lua +++ b/modules/vstudio/vs2010_vcxproj.lua @@ -4004,12 +4004,9 @@ end function m.linuxPlatformToolset(cfg) - local tool, version = p.config.toolset(cfg) - - if not version then - local value = p.action.current().toolset - tool, version = p.tools.canonical(value) - end + local toolset = p.tools.normalize(cfg.toolset):explode("-", true, 1) + local tool = toolset[1] + local version = toolset[2] local gcc_map = { ["remote"] = "Remote_GCC_1_0", @@ -4023,17 +4020,34 @@ ["wsl2"] = "WSL2_Clang_1_0", } - if cfg.toolchainversion then + local toolset_map = { + gcc = gcc_map, + clang = clang_map, + } - local map = iif(cfg.toolset == "gcc", gcc_map, clang_map) - version = map[cfg.toolchainversion] + if version then + local map = toolset_map[tool] + if not map then + p.error('Invalid toolset (%s) for Linux platform.', tool) + end - end + local ts = map[version] + if not ts then + p.error('Invalid version (%s) for the selected toolset (%s).', version, cfg.toolset) + end - if version then - m.element("PlatformToolset", nil, version) + m.element("PlatformToolset", nil, ts) + elseif cfg.toolchainversion then + local map = iif(cfg.toolset == "gcc", gcc_map, clang_map) + local ts = map[cfg.toolchainversion] + + if ts then + m.element("PlatformToolset", nil, ts) + else + p.error('Invalid toolchainversion (%s) for the selected toolset (%s).', cfg.toolchainversion, cfg.toolset) + end else - p.error('Invalid toolchainversion (%s) for the selected toolset (%s).', cfg.toolchainversion, cfg.toolset) + p.error('Specify a toolchain version for the selected toolset (%s). (%s - %s)', cfg.toolset, tool, version) end end @@ -4327,7 +4341,26 @@ ["5.0"] = "Clang_5_0", } - if cfg.toolchainversion ~= nil then + local toolset_map = { + gcc = gcc_map, + clang = clang_map, + } + + local toolset = p.tools.normalize(cfg.toolset):explode("-", true, 1) + local tool = toolset[1] + local version = toolset[2] + + if version then + local tool_mapping = toolset_map[tool] + if tool_mapping then + local ts = tool_mapping[version] + if ts == nil then + p.error('Invalid version (%s) for the selected toolset (%s).', version, tool) + end + + m.element("PlatformToolset", nil, ts) + end + elseif cfg.toolchainversion ~= nil then local map = iif(cfg.toolset == "gcc", gcc_map, clang_map) local ts = map[cfg.toolchainversion] if ts == nil then diff --git a/website/docs/toolchainversion.md b/website/docs/toolchainversion.md index cb9c7948d..7cb887802 100644 --- a/website/docs/toolchainversion.md +++ b/website/docs/toolchainversion.md @@ -37,6 +37,7 @@ Project configurations. Premake 5.0.0-alpha14 or later, only applies to Android projects. Premake 5.0.0-beta3 or later, only applies to Visual Studio Linux projects. +Deprecated in 5.0.0-beta8. Use `toolset` API with version instead, such as `toolset 'gcc-4.6'` or `toolset 'clang-wsl2'`. ### Examples ### diff --git a/website/docs/toolset.md b/website/docs/toolset.md index 99a740506..94eef25de 100644 --- a/website/docs/toolset.md +++ b/website/docs/toolset.md @@ -46,3 +46,9 @@ Use the toolset for Windows XP ```lua toolset "v140_xp" ``` + +Specify version 4.8 of GCC for Android +```lua +filter { "system:android" } + toolset "gcc-4.8" +```