123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- --
- -- tests/test_msc.lua
- -- Automated test suite for the Microsoft C toolset interface.
- -- Copyright (c) 2012-2013 Jason Perkins and the Premake project
- --
- local p = premake
- local suite = test.declare("tools_msc")
- local msc = p.tools.msc
- --
- -- Setup/teardown
- --
- local wks, prj, cfg
- function suite.setup()
- wks, prj = test.createWorkspace()
- kind "SharedLib"
- end
- local function prepare()
- cfg = test.getconfig(prj, "Debug")
- end
- --
- -- Check the optimization flags.
- --
- function suite.cflags_onNoOptimize()
- optimize "Off"
- prepare()
- test.contains("/Od", msc.getcflags(cfg))
- end
- function suite.cflags_onOptimize()
- optimize "On"
- prepare()
- test.contains("/Ot", msc.getcflags(cfg))
- end
- function suite.cflags_onOptimizeSize()
- optimize "Size"
- prepare()
- test.contains("/O1", msc.getcflags(cfg))
- end
- function suite.cflags_onOptimizeSpeed()
- optimize "Speed"
- prepare()
- test.contains("/O2", msc.getcflags(cfg))
- end
- function suite.cflags_onOptimizeFull()
- optimize "Full"
- prepare()
- test.contains("/Ox", msc.getcflags(cfg))
- end
- function suite.cflags_onOptimizeDebug()
- optimize "Debug"
- prepare()
- test.contains("/Od", msc.getcflags(cfg))
- end
- function suite.cflags_onNoFramePointers()
- flags "NoFramePointer"
- prepare()
- test.contains("/Oy", msc.getcflags(cfg))
- end
- function suite.cflags_onOmitFramePointer()
- omitframepointer "On"
- prepare()
- test.contains("/Oy", msc.getcflags(cfg))
- end
- function suite.cflags_onNoOmitFramePointers()
- omitframepointer "Off"
- prepare()
- test.excludes("/Oy", msc.getcflags(cfg))
- end
- function suite.cflags_onLinkTimeOptimizations()
- flags "LinkTimeOptimization"
- prepare()
- test.contains("/GL", msc.getcflags(cfg))
- end
- function suite.ldflags_onLinkTimeOptimizations()
- flags "LinkTimeOptimization"
- prepare()
- test.contains("/LTCG", msc.getldflags(cfg))
- end
- function suite.cflags_onStringPoolingOn()
- stringpooling "On"
- prepare()
- test.contains("/GF", msc.getcflags(cfg))
- end
- function suite.cflags_onStringPoolingOff()
- stringpooling "Off"
- prepare()
- test.contains("/GF-", msc.getcflags(cfg))
- end
- function suite.cflags_onStringPoolingNotSpecified()
- prepare()
- test.excludes("/GF", msc.getcflags(cfg))
- test.excludes("/GF-", msc.getcflags(cfg))
- end
- function suite.cflags_onFloatingPointExceptionsOn()
- floatingpointexceptions "On"
- prepare()
- test.contains("/fp:except", msc.getcflags(cfg))
- end
- function suite.cflags_onFloatingPointExceptionsOff()
- floatingpointexceptions "Off"
- prepare()
- test.contains("/fp:except-", msc.getcflags(cfg))
- end
- function suite.cflags_onFloatingPointExceptionsNotSpecified()
- prepare()
- test.excludes("/fp:except", msc.getcflags(cfg))
- test.excludes("/fp:except-", msc.getcflags(cfg))
- end
- function suite.cflags_onFunctionLevelLinkingOn()
- functionlevellinking "On"
- prepare()
- test.contains("/Gy", msc.getcflags(cfg))
- end
- function suite.cflags_onFunctionLevelLinkingOff()
- functionlevellinking "Off"
- prepare()
- test.contains("/Gy-", msc.getcflags(cfg))
- end
- function suite.cflags_onFunctionLevelLinkingNotSpecified()
- prepare()
- test.excludes("/Gy", msc.getcflags(cfg))
- test.excludes("/Gy-", msc.getcflags(cfg))
- end
- function suite.cflags_onIntrinsicsOn()
- intrinsics "On"
- prepare()
- test.contains("/Oi", msc.getcflags(cfg))
- end
- --
- -- Check the translation of symbols.
- --
- function suite.cflags_onDefaultSymbols()
- prepare()
- test.excludes({ "/Z7" }, msc.getcflags(cfg))
- end
- function suite.cflags_onNoSymbols()
- symbols "Off"
- prepare()
- test.excludes({ "/Z7" }, msc.getcflags(cfg))
- end
- function suite.cflags_onSymbols()
- symbols "On"
- prepare()
- test.contains({ "/Z7" }, msc.getcflags(cfg))
- end
- --
- -- Check the translation of unsignedchar.
- --
- function suite.sharedflags_onUnsignedCharOn()
- unsignedchar "On"
- prepare()
- test.contains({ "/J" }, msc.getcflags(cfg))
- test.contains({ "/J" }, msc.getcxxflags(cfg))
- end
- function suite.sharedflags_onUnsignedCharOff()
- unsignedchar "Off"
- prepare()
- test.excludes({ "/J" }, msc.getcflags(cfg))
- test.excludes({ "/J" }, msc.getcxxflags(cfg))
- end
- --
- -- Check handling of debugging support.
- --
- function suite.ldflags_onSymbols()
- symbols "On"
- prepare()
- test.contains("/DEBUG", msc.getldflags(cfg))
- end
- --
- -- Check handling warnings and errors.
- --
- function suite.cflags_OnNoWarnings()
- warnings "Off"
- prepare()
- test.contains("/W0", msc.getcflags(cfg))
- end
- function suite.cflags_OnHighWarnings()
- warnings "High"
- prepare()
- test.contains("/W4", msc.getcflags(cfg))
- end
- function suite.cflags_OnExtraWarnings()
- warnings "Extra"
- prepare()
- test.contains("/W4", msc.getcflags(cfg))
- end
- function suite.cflags_OnEverythingWarnings()
- warnings "Everything"
- prepare()
- test.contains("/Wall", msc.getcflags(cfg))
- end
- function suite.cflags_OnFatalWarnings()
- flags "FatalWarnings"
- prepare()
- test.contains("/WX", msc.getcflags(cfg))
- end
- function suite.cflags_onSpecificWarnings()
- enablewarnings { "enable" }
- disablewarnings { "disable" }
- fatalwarnings { "fatal" }
- prepare()
- test.contains({ '/w1"enable"', '/wd"disable"', '/we"fatal"' }, msc.getcflags(cfg))
- end
- function suite.ldflags_OnFatalWarnings()
- flags "FatalWarnings"
- prepare()
- test.contains("/WX", msc.getldflags(cfg))
- end
- --
- -- Check handling of library search paths.
- --
- function suite.libdirs_onLibdirs()
- libdirs { "../libs" }
- prepare()
- test.contains('/LIBPATH:"../libs"', msc.getLibraryDirectories(cfg))
- end
- --
- -- Check handling of forced includes.
- --
- function suite.forcedIncludeFiles()
- forceincludes { "include/sys.h" }
- prepare()
- test.contains('/FIinclude/sys.h', msc.getforceincludes(cfg))
- end
- --
- -- Check handling of floating point modifiers.
- --
- function suite.cflags_onFloatingPointFast()
- floatingpoint "Fast"
- prepare()
- test.contains("/fp:fast", msc.getcflags(cfg))
- end
- function suite.cflags_onFloatingPointStrict()
- floatingpoint "Strict"
- prepare()
- test.contains("/fp:strict", msc.getcflags(cfg))
- end
- function suite.cflags_onSSE()
- vectorextensions "SSE"
- prepare()
- test.contains("/arch:SSE", msc.getcflags(cfg))
- end
- function suite.cflags_onSSE2()
- vectorextensions "SSE2"
- prepare()
- test.contains("/arch:SSE2", msc.getcflags(cfg))
- end
- function suite.cflags_onSSE4_2()
- vectorextensions "SSE4.2"
- prepare()
- test.contains("/arch:SSE2", msc.getcflags(cfg))
- end
- function suite.cflags_onAVX()
- vectorextensions "AVX"
- prepare()
- test.contains("/arch:AVX", msc.getcflags(cfg))
- end
- function suite.cflags_onAVX2()
- vectorextensions "AVX2"
- prepare()
- test.contains("/arch:AVX2", msc.getcflags(cfg))
- end
- --
- -- Check the defines and undefines.
- --
- function suite.defines()
- defines "DEF"
- prepare()
- test.contains({ '/D"DEF"' }, msc.getdefines(cfg.defines, cfg))
- end
- function suite.undefines()
- undefines "UNDEF"
- prepare()
- test.contains({ '/U"UNDEF"' }, msc.getundefines(cfg.undefines))
- end
- --
- -- Check compilation options.
- --
- function suite.cflags_onNoMinimalRebuild()
- flags "NoMinimalRebuild"
- prepare()
- test.contains("/Gm-", msc.getcflags(cfg))
- end
- function suite.cflags_onMultiProcessorCompile()
- flags "MultiProcessorCompile"
- prepare()
- test.contains("/MP", msc.getcflags(cfg))
- end
- --
- -- Check handling of C++ language features.
- --
- function suite.cxxflags_onExceptions()
- exceptionhandling "on"
- prepare()
- test.contains("/EHsc", msc.getcxxflags(cfg))
- end
- function suite.cxxflags_onSEH()
- exceptionhandling "SEH"
- prepare()
- test.contains("/EHa", msc.getcxxflags(cfg))
- end
- function suite.cxxflags_onNoExceptions()
- exceptionhandling "Off"
- prepare()
- test.missing("/EHsc", msc.getcxxflags(cfg))
- end
- function suite.cxxflags_onNoRTTI()
- rtti "Off"
- prepare()
- test.contains("/GR-", msc.getcxxflags(cfg))
- end
- --
- -- Check handling of additional linker options.
- --
- function suite.ldflags_onOmitDefaultLibrary()
- flags "OmitDefaultLibrary"
- prepare()
- test.contains("/NODEFAULTLIB", msc.getldflags(cfg))
- end
- function suite.ldflags_onNoIncrementalLink()
- flags "NoIncrementalLink"
- prepare()
- test.contains("/INCREMENTAL:NO", msc.getldflags(cfg))
- end
- function suite.ldflags_onNoManifest()
- flags "NoManifest"
- prepare()
- test.contains("/MANIFEST:NO", msc.getldflags(cfg))
- end
- function suite.ldflags_onDLL()
- kind "SharedLib"
- prepare()
- test.contains("/DLL", msc.getldflags(cfg))
- end
- --
- -- Check handling of CLR settings.
- --
- function suite.cflags_onClrOn()
- clr "On"
- prepare()
- test.contains("/clr", msc.getcflags(cfg))
- end
- function suite.cflags_onClrUnsafe()
- clr "Unsafe"
- prepare()
- test.contains("/clr", msc.getcflags(cfg))
- end
- function suite.cflags_onClrSafe()
- clr "Safe"
- prepare()
- test.contains("/clr:safe", msc.getcflags(cfg))
- end
- function suite.cflags_onClrPure()
- clr "Pure"
- prepare()
- test.contains("/clr:pure", msc.getcflags(cfg))
- end
- --
- -- Check handling of character set switches
- --
- function suite.cflags_onCharSetDefault()
- prepare()
- test.contains('/D"_UNICODE"', msc.getdefines(cfg.defines, cfg))
- end
- function suite.cflags_onCharSetUnicode()
- characterset "Unicode"
- prepare()
- test.contains('/D"_UNICODE"', msc.getdefines(cfg.defines, cfg))
- end
- function suite.cflags_onCharSetMBCS()
- characterset "MBCS"
- prepare()
- test.contains('/D"_MBCS"', msc.getdefines(cfg.defines, cfg))
- end
- function suite.cflags_onCharSetASCII()
- characterset "ASCII"
- prepare()
- test.excludes({'/D"_MBCS"', '/D"_UNICODE"'}, msc.getdefines(cfg.defines, cfg))
- end
- --
- -- Check handling of system search paths.
- --
- function suite.includeDirs_onSysIncludeDirs()
- sysincludedirs { "/usr/local/include" }
- prepare()
- test.contains("-I/usr/local/include", msc.getincludedirs(cfg, cfg.includedirs, cfg.sysincludedirs))
- end
- function suite.libDirs_onSysLibDirs()
- syslibdirs { "/usr/local/lib" }
- prepare()
- test.contains('/LIBPATH:"/usr/local/lib"', msc.getLibraryDirectories(cfg))
- end
- --
- -- Check handling of ignore default libraries
- --
- function suite.ignoreDefaultLibraries_WithExtensions()
- ignoredefaultlibraries { "lib1.lib" }
- prepare()
- test.contains('/NODEFAULTLIB:lib1.lib', msc.getldflags(cfg))
- end
- function suite.ignoreDefaultLibraries_WithoutExtensions()
- ignoredefaultlibraries { "lib1" }
- prepare()
- test.contains('/NODEFAULTLIB:lib1.lib', msc.getldflags(cfg))
- end
- --
- -- Check handling of shared C/C++ flags.
- --
- function suite.mixedToolFlags_onCFlags()
- flags { "FatalCompileWarnings" }
- prepare()
- test.isequal({ "/WX", "/MD" }, msc.getcflags(cfg))
- end
- function suite.mixedToolFlags_onCxxFlags()
- flags { "FatalCompileWarnings" }
- prepare()
- test.isequal({ "/WX", "/MD", "/EHsc" }, msc.getcxxflags(cfg))
- end
- --
- -- Check handling of Run-Time Library flags.
- --
- function suite.cflags_onStaticRuntime()
- staticruntime "On"
- prepare()
- test.isequal({ "/MT" }, msc.getcflags(cfg))
- end
- function suite.cflags_onDynamicRuntime()
- staticruntime "Off"
- prepare()
- test.isequal({ "/MD" }, msc.getcflags(cfg))
- end
- function suite.cflags_onStaticRuntimeAndDebug()
- staticruntime "On"
- runtime "Debug"
- prepare()
- test.isequal({ "/MTd" }, msc.getcflags(cfg))
- end
- function suite.cflags_onDynamicRuntimeAndDebug()
- staticruntime "Off"
- runtime "Debug"
- prepare()
- test.isequal({ "/MDd" }, msc.getcflags(cfg))
- end
- function suite.cflags_onStaticRuntimeAndSymbols()
- staticruntime "On"
- symbols "On"
- prepare()
- test.isequal({ "/MTd", "/Z7" }, msc.getcflags(cfg))
- end
- function suite.cflags_onDynamicRuntimeAndSymbols()
- staticruntime "Off"
- symbols "On"
- prepare()
- test.isequal({ "/MDd", "/Z7" }, msc.getcflags(cfg))
- end
- function suite.cflags_onDynamicRuntimeAndReleaseAndSymbols()
- staticruntime "Off"
- runtime "Release"
- symbols "On"
- prepare()
- test.isequal({ "/MD", "/Z7" }, msc.getcflags(cfg))
- end
|