--
-- tests/actions/vstudio/vc2010/test_link.lua
-- Validate linking and project references in Visual Studio 2010 C/C++ projects.
-- Copyright (c) 2011-2013 Jason Perkins and the Premake project
--
local p = premake
local suite = test.declare("vs2010_link")
local vc2010 = p.vstudio.vc2010
local project = p.project
--
-- Setup
--
local wks, prj
function suite.setup()
p.action.set("vs2010")
wks, prj = test.createWorkspace()
kind "SharedLib"
end
local function prepare(platform)
local cfg = test.getconfig(prj, "Debug", platform)
vc2010.linker(cfg)
end
--
-- Check the basic element structure with default settings.
--
function suite.defaultSettings()
kind "SharedLib"
prepare()
test.capture [[
Windowsbin\Debug\MyProject.lib
]]
end
--
-- Check the basic element structure with a release build.
--
function suite.defaultSettings_onOptimize()
optimize "On"
prepare()
test.capture [[
Windowstruetruebin\Debug\MyProject.lib
]]
end
--
-- Check subsystem values with each project kind.
--
function suite.subsystem_onConsoleApp()
kind "ConsoleApp"
prepare()
test.capture [[
Console
]]
end
function suite.subsystem_onWindowedApp()
kind "WindowedApp"
prepare()
test.capture [[
Windows
]]
end
function suite.subsystem_onSharedLib()
kind "SharedLib"
prepare()
test.capture [[
Windowsbin\Debug\MyProject.lib
]]
end
function suite.subsystem_onStaticLib()
kind "StaticLib"
prepare()
test.capture [[
Windows
]]
end
--
-- Test the handling of the entrypoint API.
--
function suite.onEntryPoint()
kind "ConsoleApp"
entrypoint "foobar"
prepare()
test.capture [[
Consolefoobar
]]
end
--
-- Test the handling of the NoImplicitLink flag.
--
function suite.linkDependencies_onNoImplicitLink()
flags "NoImplicitLink"
prepare()
test.capture [[
Windowsbin\Debug\MyProject.libfalse
]]
end
--
-- Test the handling of the Symbols flag.
--
function suite.generateDebugInfo_onSymbolsOn_on2010()
p.action.set("vs2010")
symbols "On"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateDebugInfo_onSymbolsFastLink_on2010()
p.action.set("vs2010")
symbols "FastLink"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateDebugInfo_onSymbolsFull_on2010()
p.action.set("vs2010")
symbols "Full"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateDebugInfo_onSymbolsOn_on2015()
p.action.set("vs2015")
symbols "On"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateDebugInfo_onSymbolsFastLink_on2015()
p.action.set("vs2015")
symbols "FastLink"
prepare()
test.capture [[
WindowstrueDebugFastLink
]]
end
function suite.generateDebugInfo_onSymbolsFull_on2015()
p.action.set("vs2015")
symbols "Full"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateDebugInfo_onSymbolsFull_on2017()
p.action.set("vs2017")
symbols "Full"
prepare()
test.capture [[
WindowsDebugFull
]]
end
function suite.generateDebugInfo_onSymbolsFull_on2019()
p.action.set("vs2019")
symbols "Full"
prepare()
test.capture [[
WindowsDebugFull
]]
end
--
-- Test the handling of the SymbolsPath flag.
--
function suite.generateProgramDataBaseFile_onStaticLib()
kind "StaticLib"
symbols "On"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstrue
]]
end
function suite.generateProgramDataBaseFile_onSharedLib()
kind "SharedLib"
symbols "On"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstruebin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsOn_on2010()
p.action.set("vs2010")
symbols "On"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstruebin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFastLink_on2010()
p.action.set("vs2010")
symbols "Off"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowsfalsebin\Debug\MyProject.lib
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFull_on2010()
p.action.set("vs2010")
symbols "Full"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstruebin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsOn_on2015()
p.action.set("vs2015")
symbols "On"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstruebin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFastLink_on2015()
p.action.set("vs2015")
symbols "FastLink"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
WindowstrueDebugFastLinkbin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFull_on2015()
p.action.set("vs2015")
symbols "Full"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
Windowstruebin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFull_on2017()
p.action.set("vs2017")
symbols "Full"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
WindowsDebugFullbin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
function suite.generateProgramDatabaseFile_onSymbolsFull_on2019()
p.action.set("vs2019")
symbols "Full"
symbolspath "$(IntDir)$(TargetName).pdb"
prepare()
test.capture [[
WindowsDebugFullbin\Debug\MyProject.lib$(IntDir)$(TargetName).pdb
]]
end
--
-- Any system libraries specified in links() should be listed as
-- additional dependencies.
--
function suite.additionalDependencies_onSystemLinks()
links { "lua", "zlib" }
prepare()
test.capture [[
Windowslua.lib;zlib.lib;%(AdditionalDependencies)
]]
end
function suite.additionalDependencies_onSystemLinksStatic()
kind "StaticLib"
links { "lua", "zlib" }
prepare()
test.capture [[
Windowslua.lib;zlib.lib;%(AdditionalDependencies)
]]
end
--
-- Any system libraries specified in links() with valid extensions should
-- be listed with those extensions.
--
function suite.additionalDependencies_onSystemLinksExtensions()
links { "lua.obj", "zlib.lib" }
prepare()
test.capture [[
Windowslua.obj;zlib.lib;%(AdditionalDependencies)
]]
end
function suite.additionalDependencies_onSystemLinksExtensionsStatic()
kind "StaticLib"
links { "lua.obj", "zlib.lib" }
prepare()
test.capture [[
Windowslua.obj;zlib.lib;%(AdditionalDependencies)
]]
end
--
-- Any system libraries specified in links() with multiple dots should
-- only have .lib appended to the end when no valid extension is found
--
function suite.additionalDependencies_onSystemLinksExtensionsMultipleDots()
links { "lua.5.3.lib", "lua.5.4" }
prepare()
test.capture [[
Windowslua.5.3.lib;lua.5.4.lib;%(AdditionalDependencies)
]]
end
function suite.additionalDependencies_onSystemLinksExtensionsMultipleDotsStatic()
kind "StaticLib"
links { "lua.5.3.lib", "lua.5.4" }
prepare()
test.capture [[
Windowslua.5.3.lib;lua.5.4.lib;%(AdditionalDependencies)
]]
end
--
-- Additional library directories should be specified, relative to the project.
--
function suite.additionalLibraryDirectories_onLibDirs()
libdirs { "../lib", "../lib64" }
prepare()
test.capture [[
Windows..\lib;..\lib64;%(AdditionalLibraryDirectories)
]]
end
--
-- Sibling projects do not need to be listed in additional dependencies, as Visual
-- Studio will link them implicitly.
--
function suite.excludeSiblings()
links { "MyProject2" }
test.createproject(wks)
kind "SharedLib"
prepare()
test.capture [[
Windowsbin\Debug\MyProject.lib
]]
end
--
-- If the NoImplicitLink flag is set, all dependencies should be listed explicitly.
--
function suite.includeSiblings_onNoImplicitLink()
flags { "NoImplicitLink" }
links { "MyProject2" }
test.createproject(wks)
kind "SharedLib"
prepare()
test.capture [[
Windowsbin\Debug\MyProject2.lib;%(AdditionalDependencies)bin\Debug\MyProject.libfalse
]]
end
--
-- Static libraries do not link dependencies directly, to maintain
-- compatibility with GCC and others.
--
function suite.additionalDependencies_onSystemLinksAndStaticLib()
kind "StaticLib"
links { "lua", "zlib" }
libdirs { "../lib", "../lib64" }
prepare()
test.capture [[
Windows
]]
end
--
-- Check handling of the import library settings.
--
function suite.importLibrary_onImpLibDir()
implibdir "../lib"
prepare()
test.capture [[
Windows..\lib\MyProject.lib
]]
end
--
-- Check handling of additional options.
--
function suite.additionalOptions_onNonStaticLib()
kind "SharedLib"
linkoptions { "/kupo" }
prepare()
test.capture [[
Windowsbin\Debug\MyProject.lib/kupo %(AdditionalOptions)
]]
end
function suite.additionalOptions_onStaticLib()
kind "StaticLib"
linkoptions { "/kupo" }
prepare()
test.capture [[
Windows/kupo %(AdditionalOptions)
]]
end
--
-- Enable reference optimizing if Optimize flag is specified.
--
function suite.optimizeReferences_onOptimizeFlag()
optimize "On"
prepare()
test.capture [[
Windowstruetrue
]]
end
--
-- Correctly handle module definition (.def) files.
--
function suite.recognizesModuleDefinitionFile()
files { "hello.cpp", "hello.def" }
prepare()
test.capture [[
Windowsbin\Debug\MyProject.libhello.def
]]
end
--
-- Managed assembly references should not be listed in additional dependencies.
--
function suite.ignoresAssemblyReferences()
links { "kernel32", "System.dll", "System.Data.dll" }
prepare()
test.capture [[
Windowskernel32.lib;%(AdditionalDependencies)
]]
end
--
-- Check handling of warning flags.
--
function suite.fatalWarnings_onDynamicLink()
kind "ConsoleApp"
flags { "FatalLinkWarnings" }
prepare()
test.capture [[
Consoletrue
]]
end
function suite.fatalWarnings_onStaticLink()
kind "StaticLib"
flags { "FatalLinkWarnings" }
prepare()
test.capture [[
Windowstrue
]]
end
--
-- Test generating .map files.
--
function suite.generateMapFile_onMapsFlag()
flags { "Maps" }
prepare()
test.capture [[
Windowsbin\Debug\MyProject.libtrue
]]
end
--
-- Test ignoring default libraries with extensions specified.
--
function suite.ignoreDefaultLibraries_WithExtensions()
ignoredefaultlibraries { "lib1.lib", "lib2.obj" }
prepare()
test.capture [[
Windowsbin\Debug\MyProject.liblib1.lib;lib2.obj
]]
end
--
-- Test ignoring default libraries without extensions specified.
--
function suite.ignoreDefaultLibraries_WithoutExtensions()
ignoredefaultlibraries { "lib1", "lib2.obj" }
prepare()
test.capture [[
Windowsbin\Debug\MyProject.liblib1.lib;lib2.obj
]]
end
--
-- Test ignoring default libraries with extensions specified.
--
function suite.assemblyDebug()
assemblydebug "true"
prepare()
test.capture [[
Windowsbin\Debug\MyProject.libtrue
]]
end