-- -- 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 [[ Windows bin\Debug\MyProject.lib ]] end -- -- Check the basic element structure with a release build. -- function suite.defaultSettings_onOptimize() optimize "On" prepare() test.capture [[ Windows true true bin\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 [[ Windows bin\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 [[ Console foobar ]] end -- -- Test the handling of the NoImplicitLink flag. -- function suite.linkDependencies_onNoImplicitLink() flags "NoImplicitLink" prepare() test.capture [[ Windows bin\Debug\MyProject.lib false ]] end -- -- Test the handling of the Symbols flag. -- function suite.generateDebugInfo_onSymbolsOn_on2010() p.action.set("vs2010") symbols "On" prepare() test.capture [[ Windows true ]] end function suite.generateDebugInfo_onSymbolsFastLink_on2010() p.action.set("vs2010") symbols "FastLink" prepare() test.capture [[ Windows true ]] end function suite.generateDebugInfo_onSymbolsFull_on2010() p.action.set("vs2010") symbols "Full" prepare() test.capture [[ Windows true ]] end function suite.generateDebugInfo_onSymbolsOn_on2015() p.action.set("vs2015") symbols "On" prepare() test.capture [[ Windows true ]] end function suite.generateDebugInfo_onSymbolsFastLink_on2015() p.action.set("vs2015") symbols "FastLink" prepare() test.capture [[ Windows true DebugFastLink ]] end function suite.generateDebugInfo_onSymbolsFull_on2015() p.action.set("vs2015") symbols "Full" prepare() test.capture [[ Windows true ]] end function suite.generateDebugInfo_onSymbolsFull_on2017() p.action.set("vs2017") symbols "Full" prepare() test.capture [[ Windows DebugFull ]] end function suite.generateDebugInfo_onSymbolsFull_on2019() p.action.set("vs2019") symbols "Full" prepare() test.capture [[ Windows DebugFull ]] end -- -- Test the handling of the SymbolsPath flag. -- function suite.generateProgramDataBaseFile_onStaticLib() kind "StaticLib" symbols "On" symbolspath "$(IntDir)$(TargetName).pdb" prepare() test.capture [[ Windows true ]] end function suite.generateProgramDataBaseFile_onSharedLib() kind "SharedLib" symbols "On" symbolspath "$(IntDir)$(TargetName).pdb" prepare() test.capture [[ Windows true bin\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 [[ Windows true bin\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 [[ Windows false bin\Debug\MyProject.lib ]] end function suite.generateProgramDatabaseFile_onSymbolsFull_on2010() p.action.set("vs2010") symbols "Full" symbolspath "$(IntDir)$(TargetName).pdb" prepare() test.capture [[ Windows true bin\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 [[ Windows true bin\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 [[ Windows true DebugFastLink bin\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 [[ Windows true bin\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 [[ Windows DebugFull bin\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 [[ Windows DebugFull bin\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 [[ Windows lua.lib;zlib.lib;%(AdditionalDependencies) ]] end function suite.additionalDependencies_onSystemLinksStatic() kind "StaticLib" links { "lua", "zlib" } prepare() test.capture [[ Windows lua.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 [[ Windows lua.obj;zlib.lib;%(AdditionalDependencies) ]] end function suite.additionalDependencies_onSystemLinksExtensionsStatic() kind "StaticLib" links { "lua.obj", "zlib.lib" } prepare() test.capture [[ Windows lua.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 [[ Windows lua.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 [[ Windows lua.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 [[ Windows bin\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 [[ Windows bin\Debug\MyProject2.lib;%(AdditionalDependencies) bin\Debug\MyProject.lib false ]] 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 [[ Windows bin\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 [[ Windows true true ]] end -- -- Correctly handle module definition (.def) files. -- function suite.recognizesModuleDefinitionFile() files { "hello.cpp", "hello.def" } prepare() test.capture [[ Windows bin\Debug\MyProject.lib hello.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 [[ Windows kernel32.lib;%(AdditionalDependencies) ]] end -- -- Check handling of warning flags. -- function suite.fatalWarnings_onDynamicLink() kind "ConsoleApp" flags { "FatalLinkWarnings" } prepare() test.capture [[ Console true ]] end function suite.fatalWarnings_onStaticLink() kind "StaticLib" flags { "FatalLinkWarnings" } prepare() test.capture [[ Windows true ]] end -- -- Test generating .map files. -- function suite.generateMapFile_onMapsFlag() flags { "Maps" } prepare() test.capture [[ Windows bin\Debug\MyProject.lib true ]] end -- -- Test ignoring default libraries with extensions specified. -- function suite.ignoreDefaultLibraries_WithExtensions() ignoredefaultlibraries { "lib1.lib", "lib2.obj" } prepare() test.capture [[ Windows bin\Debug\MyProject.lib lib1.lib;lib2.obj ]] end -- -- Test ignoring default libraries without extensions specified. -- function suite.ignoreDefaultLibraries_WithoutExtensions() ignoredefaultlibraries { "lib1", "lib2.obj" } prepare() test.capture [[ Windows bin\Debug\MyProject.lib lib1.lib;lib2.obj ]] end -- -- Test ignoring default libraries with extensions specified. -- function suite.assemblyDebug() assemblydebug "true" prepare() test.capture [[ Windows bin\Debug\MyProject.lib true ]] end