-- -- 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 suite = test.declare("vs2010_link") local vc2010 = premake.vstudio.vc2010 local project = premake.project -- -- Setup -- local wks, prj function suite.setup() _ACTION = "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 false bin\Debug\MyProject.lib ]] end -- -- Check the basic element structure with a release build. -- function suite.defaultSettings_onOptimize() optimize "On" prepare() test.capture [[ Windows false true true bin\Debug\MyProject.lib ]] end -- -- Check subsystem values with each project kind. -- function suite.subsystem_onConsoleApp() kind "ConsoleApp" prepare() test.capture [[ Console false mainCRTStartup ]] end function suite.subsystem_onWindowedApp() kind "WindowedApp" prepare() test.capture [[ Windows false mainCRTStartup ]] end function suite.subsystem_onSharedLib() kind "SharedLib" prepare() test.capture [[ Windows false bin\Debug\MyProject.lib ]] end function suite.subsystem_onStaticLib() kind "StaticLib" prepare() test.capture [[ Windows false ]] end -- -- Test the handling of the NoImplicitLink flag. -- function suite.linkDependencies_onNoImplicitLink() flags "NoImplicitLink" prepare() test.capture [[ Windows false bin\Debug\MyProject.lib false ]] end -- -- Test the handling of the Symbols flag. -- function suite.generateDebugInfo_onSymbols() flags "Symbols" prepare() test.capture [[ Windows true ]] end -- -- Any system libraries specified in links() should be listed as -- additional dependencies. -- function suite.additionalDependencies_onSystemLinks() links { "lua", "zlib" } prepare() test.capture [[ Windows false 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 false 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 false 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 false ..\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 false 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 false 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 false ]] end -- -- Check handling of the import library settings. -- function suite.importLibrary_onImpLibDir() implibdir "../lib" prepare() test.capture [[ Windows false ..\lib\MyProject.lib ]] end -- -- Check handling of additional options. -- function suite.additionalOptions_onNonStaticLib() kind "SharedLib" linkoptions { "/kupo" } prepare() test.capture [[ Windows false bin\Debug\MyProject.lib /kupo %(AdditionalOptions) ]] end function suite.additionalOptions_onStaticLib() kind "StaticLib" linkoptions { "/kupo" } prepare() test.capture [[ Windows false /kupo %(AdditionalOptions) ]] end -- -- Enable reference optimizing if Optimize flag is specified. -- function suite.optimizeReferences_onOptimizeFlag() optimize "On" prepare() test.capture [[ Windows false true true ]] end -- -- Correctly handle module definition (.def) files. -- function suite.recognizesModuleDefinitionFile() files { "hello.cpp", "hello.def" } prepare() test.capture [[ Windows false 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 false kernel32.lib;%(AdditionalDependencies) ]] end -- -- Xbox 360 doesn't list a subsystem or entry point. -- function suite.onXbox360() kind "ConsoleApp" system "Xbox360" prepare() test.capture [[ false ]] end -- -- Xbox 360 uses .lib for library extensions -- function suite.libAdded_onXbox360SystemLibs() kind "ConsoleApp" system "Xbox360" links { "user32" } prepare() test.capture [[ false user32.lib;%(AdditionalDependencies) ]] end -- -- Check handling of warning flags. -- function suite.fatalWarnings_onDynamicLink() kind "ConsoleApp" flags { "FatalLinkWarnings" } prepare() test.capture [[ Console false mainCRTStartup true ]] end function suite.fatalWarnings_onStaticLink() kind "StaticLib" flags { "FatalLinkWarnings" } prepare() test.capture [[ Windows false true ]] end -- -- Test generating .map files. -- function suite.generateMapFile_onMapsFlag() flags { "Maps" } prepare() test.capture [[ Windows false 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 false bin\Debug\MyProject.lib lib1.lib;lib2.obj ]] end -- -- Test ignoring default libraries without extensions specified. -- function suite.ignoreDefaultLibraries_WithExtensions() ignoredefaultlibraries { "lib1", "lib2.obj" } prepare() test.capture [[ Windows false bin\Debug\MyProject.lib lib1.lib;lib2.obj ]] end