-- -- tests/actions/vstudio/vc2010/test_compile_settings.lua -- Validate compiler settings in Visual Studio 2010 C/C++ projects. -- Copyright (c) 2011-2013 Jason Perkins and the Premake project -- local p = premake local suite = test.declare("vstudio_vs2010_compile_settings") local vc2010 = p.vstudio.vc2010 local project = p.project -- -- Setup -- local wks, prj function suite.setup() p.action.set("vs2010") wks, prj = test.createWorkspace() end local function prepare(platform) local cfg = test.getconfig(prj, "Debug", platform) vc2010.clCompile(cfg) end -- -- Check the basic element structure with default settings. --- function suite.defaultSettings() prepare() test.capture [[ NotUsing Level3 Disabled ]] end --- -- Test precompiled header handling; the header should be treated as -- a plain string value, with no path manipulation applied, since it -- needs to match the value of the #include statement used in the -- project code. --- function suite.usePrecompiledHeaders_onPrecompiledHeaders() location "build" pchheader "include/afxwin.h" prepare() test.capture [[ Use include/afxwin.h ]] end --- -- The NoPCH flag should override any other PCH settings. --- function suite.noPrecompiledHeaders_onNoPCH() pchheader "afxwin.h" flags "NoPCH" prepare() test.capture [[ NotUsing ]] end -- -- If extra warnings is specified, pump up the volume. -- function suite.warningLevel_onExtraWarnings() warnings "Extra" prepare() test.capture [[ NotUsing Level4 ]] end -- -- If the warnings are disabled, mute all warnings. -- function suite.warningLevel_onNoWarnings() warnings "Off" prepare() test.capture [[ NotUsing TurnOffAllWarnings ]] end -- -- If warnings are turned off, the fatal warnings flags should -- not be generated. -- function suite.warningLevel_onNoWarningsOverOtherWarningsFlags() flags { "FatalWarnings" } warnings "Off" prepare() test.capture [[ NotUsing TurnOffAllWarnings ]] end -- -- Disable specific warnings. -- function suite.disableSpecificWarnings() disablewarnings { "disable" } prepare() test.capture [[ NotUsing Level3 disable;%(DisableSpecificWarnings) ]] end -- -- Specific warnings as errors. -- function suite.specificWarningsAsErrors() fatalwarnings { "fatal" } prepare() test.capture [[ NotUsing Level3 fatal;%(TreatSpecificWarningsAsErrors) ]] end -- -- Check the optimization flags. -- function suite.optimization_onOptimize() optimize "On" prepare() test.capture [[ NotUsing Level3 Full true true false true ]] end function suite.optimization_onOptimizeSize() optimize "Size" prepare() test.capture [[ NotUsing Level3 MinSpace true true false true ]] end function suite.optimization_onOptimizeSpeed() optimize "Speed" prepare() test.capture [[ NotUsing Level3 MaxSpeed true true false true ]] end function suite.optimization_onOptimizeFull() optimize "Full" prepare() test.capture [[ NotUsing Level3 Full true true false true ]] end function suite.optimization_onOptimizeOff() optimize "Off" prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.optimization_onOptimizeDebug() optimize "Debug" prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- If defines are specified, the element should be added. -- function suite.preprocessorDefinitions_onDefines() defines { "DEBUG", "_DEBUG" } prepare() test.capture [[ NotUsing Level3 DEBUG;_DEBUG;%(PreprocessorDefinitions) ]] end -- -- If defines are specified with escapable characters, they should be escaped. -- function suite.preprocessorDefinitions_onDefinesWithEscapeCharacters() p.escaper(p.vstudio.vs2010.esc) defines { "&", "<", ">" } prepare() test.capture [[ NotUsing Level3 &;<;>;%(PreprocessorDefinitions) ]] p.escaper(nil) end -- -- If undefines are specified, the element should be added. -- function suite.preprocessorDefinitions_onUnDefines() undefines { "DEBUG", "_DEBUG" } prepare() test.capture [[ NotUsing Level3 DEBUG;_DEBUG;%(UndefinePreprocessorDefinitions) ]] end -- -- If build options are specified, the element should be specified. -- function suite.additionalOptions_onBuildOptions() buildoptions { "/xyz", "/abc" } prepare() test.capture [[ NotUsing Level3 Disabled /xyz /abc %(AdditionalOptions) ]] end -- -- If include directories are specified, the should be added. -- function suite.additionalIncludeDirs_onIncludeDirs() includedirs { "include/lua", "include/zlib" } prepare() test.capture [[ NotUsing Level3 include\lua;include\zlib;%(AdditionalIncludeDirectories) ]] end -- -- Ensure macros are not truncated (see issue #63) -- function suite.additionalIncludeDirs_onIncludeDirs_with_vs_macros() includedirs { "$(Macro1)/foo/bar/$(Macro2)/baz" } prepare() test.capture [[ NotUsing Level3 $(Macro1)\foo\bar\$(Macro2)\baz;%(AdditionalIncludeDirectories) ]] end -- -- If include directories are specified, the should be added. -- function suite.additionalUsingDirs_onUsingDirs() usingdirs { "include/lua", "include/zlib" } prepare() test.capture [[ NotUsing Level3 include\lua;include\zlib;%(AdditionalUsingDirectories) ]] end -- -- Turn off minimal rebuilds if the NoMinimalRebuild flag is set. -- function suite.minimalRebuild_onNoMinimalRebuild() flags "NoMinimalRebuild" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end -- -- Can't minimal rebuild with the C7 debugging format. -- function suite.minimalRebuild_onC7() debugformat "C7" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end -- -- If staticruntime is specified, add the element. -- function suite.runtimeLibrary_onDynamicRuntime() staticruntime "Off" prepare() test.capture [[ NotUsing Level3 Disabled MultiThreadedDLL ]] end function suite.runtimeLibrary_onStaticRuntime() staticruntime "On" prepare() test.capture [[ NotUsing Level3 Disabled MultiThreaded ]] end function suite.runtimeLibrary_onDynamicRuntimeAndSymbols() staticruntime "Off" symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled MultiThreadedDebugDLL ]] end function suite.runtimeLibrary_onStaticRuntimeAndSymbols() staticruntime "On" symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled MultiThreadedDebug ]] end -- -- Add if FatalWarnings flag is set. -- function suite.treatWarningsAsError_onFatalWarnings() flags { "FatalCompileWarnings" } prepare() test.capture [[ NotUsing Level3 true ]] end -- -- Check the handling of the Symbols flag. -- function suite.onDefaultSymbols() prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- Check handling of the explicitly disabling symbols. -- Note: VS2013 and older have a bug with setting -- DebugInformationFormat to None. The workaround -- is to leave the field blank. -- function suite.onNoSymbols() symbols 'Off' prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- VS2015 and newer can use DebugInformationFormat None. -- function suite.onNoSymbolsVS2015() symbols 'Off' p.action.set("vs2015") prepare() test.capture [[ NotUsing Level3 None Disabled ]] end function suite.onSymbols() symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled ]] end -- -- Check the handling of the C7 debug information format. -- function suite.onC7DebugFormat() symbols "On" debugformat "c7" prepare() test.capture [[ NotUsing Level3 OldStyle Disabled ]] end -- -- Verify character handling. -- function suite.wchar_onNative() flags "NativeWChar" prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.wchar_onNoNative() flags "NoNativeWChar" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end -- -- Check exception handling and RTTI. -- function suite.exceptions_onNoExceptions() exceptionhandling "Off" prepare() test.capture [[ NotUsing Level3 _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions) Disabled false ]] end function suite.exceptions_onSEH() exceptionhandling "SEH" prepare() test.capture [[ NotUsing Level3 Disabled Async ]] end function suite.runtimeTypeInfo_onNoRTTI() rtti "Off" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.runtimeTypeInfo_onNoBufferSecurityCheck() flags "NoBufferSecurityCheck" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end -- -- On Win32 builds, use the Edit-and-Continue debug information format. -- function suite.debugFormat_onWin32() symbols "On" architecture "x86" prepare() test.capture [[ NotUsing Level3 EditAndContinue ]] end -- -- Edit-and-Continue is not support on 64-bit builds. -- function suite.debugFormat_onWin64() symbols "On" architecture "x86_64" prepare() test.capture [[ NotUsing Level3 ProgramDatabase ]] end -- -- Check the handling of the editandcontinue flag. -- function suite.debugFormat_onEditAndContinueOff() symbols "On" editandcontinue "Off" prepare() test.capture [[ NotUsing Level3 ProgramDatabase ]] end -- -- Check the handling of the editandcontinue flag. -- function suite.debugFormat_onFastLinkBuild() symbols "FastLink" editandcontinue "Off" prepare() test.capture [[ NotUsing Level3 ProgramDatabase ]] end -- -- Edit-and-Continue is not supported for optimized builds. -- function suite.debugFormat_onOptimizedBuild() symbols "On" optimize "On" prepare() test.capture [[ NotUsing Level3 ProgramDatabase ]] end -- -- Edit-and-Continue is not supported for Managed builds. -- function suite.debugFormat_onManagedCode() symbols "On" clr "On" prepare() test.capture [[ NotUsing Level3 ProgramDatabase ]] end -- -- Check handling of forced includes. -- function suite.forcedIncludeFiles() forceincludes { "stdafx.h", "include/sys.h" } prepare() test.capture [[ NotUsing Level3 stdafx.h;include\sys.h ]] end function suite.forcedUsingFiles() forceusings { "stdafx.h", "include/sys.h" } prepare() test.capture [[ NotUsing Level3 stdafx.h;include\sys.h ]] end -- -- Check handling of the NoRuntimeChecks flag. -- function suite.onNoRuntimeChecks() flags { "NoRuntimeChecks" } prepare() test.capture [[ NotUsing Level3 Default ]] end -- -- Check handling of the EnableMultiProcessorCompile flag. -- function suite.onMultiProcessorCompile() flags { "MultiProcessorCompile" } prepare() test.capture [[ NotUsing Level3 Disabled false true ]] end -- -- Check handling of the `runtime` API; should override the -- default behavior of linking the debug runtime when symbols are -- enabled with no optimizations. -- function suite.releaseRuntime_onReleaseRuntime() runtime "Release" symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled MultiThreadedDLL ]] end function suite.releaseRuntime_onDynamicAndReleaseRuntime() runtime "Release" staticruntime "Off" symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled MultiThreadedDLL ]] end function suite.releaseRuntime_onStaticAndReleaseRuntime() runtime "Release" staticruntime "On" symbols "On" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled MultiThreaded ]] end -- -- Check handling of the OmitDefaultLibrary flag. -- function suite.onOmitDefaultLibrary() flags { "OmitDefaultLibrary" } prepare() test.capture [[ NotUsing Level3 Disabled true ]] end -- -- Check handling of the stringpooling api -- function suite.onStringPoolingOff() stringpooling 'Off' prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.onStringPoolingOn() stringpooling 'On' prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.onStringPoolingNotSpecified() optimize "On" prepare() test.capture [[ NotUsing Level3 Full true true false true ]] end -- -- Check handling of the floatingpointexceptions api -- function suite.onFloatingPointExceptionsOff() floatingpointexceptions 'Off' prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.onFloatingPointExceptionsOn() floatingpointexceptions 'On' prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.onFloatingPointExceptionsNotSpecified() prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- Check handling of the functionlevellinking api -- function suite.onFunctionLevelLinkingOff() functionlevellinking 'Off' prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.onFunctionLevelLinkingOn() functionlevellinking 'On' prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.onFunctionLevelLinkingNotSpecified() optimize "On" prepare() test.capture [[ NotUsing Level3 Full true ]] end -- -- Check handling of the intrinsics api -- function suite.onIntrinsicsOff() intrinsics 'Off' prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.onIntrinsicsOn() intrinsics 'On' prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.onIntrinsicsNotSpecified() optimize "On" prepare() test.capture [[ NotUsing Level3 Full true true false true ]] end -- -- Check handling of the language api -- function suite.onLanguageC() language 'C' prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.onLanguageCpp() language 'C++' prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- Check handling of the compileAs api -- function suite.onCompileAsC() compileas 'C' prepare() test.capture [[ NotUsing Level3 Disabled CompileAsC ]] end function suite.onCompileAsCpp() compileas 'C++' prepare() test.capture [[ NotUsing Level3 Disabled CompileAsCpp ]] end -- -- Check handling of the C++14 & C++17 api -- function suite.onLanguage_Cpp14_VS2010() cppdialect 'C++14' prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.onLanguage_Cpp14_VS2015() p.action.set("vs2015") cppdialect 'C++14' prepare() test.capture [[ NotUsing Level3 Disabled /std:c++14 %(AdditionalOptions) ]] end function suite.onLanguage_Cpp14_VS2017() p.action.set("vs2017") cppdialect 'C++14' prepare() test.capture [[ NotUsing Level3 Disabled stdcpp14 ]] end function suite.onLanguage_Cpp14_VS2019() p.action.set("vs2019") cppdialect 'C++14' prepare() test.capture [[ NotUsing Level3 Disabled stdcpp14 ]] end function suite.onLanguage_Cpp17_VS2010() cppdialect 'C++17' prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.onLanguage_Cpp17_VS2015() p.action.set("vs2015") cppdialect 'C++17' prepare() test.capture [[ NotUsing Level3 Disabled /std:c++latest %(AdditionalOptions) ]] end function suite.onLanguage_Cpp17_VS2017() p.action.set("vs2017") cppdialect 'C++17' prepare() test.capture [[ NotUsing Level3 Disabled stdcpp17 ]] end function suite.onLanguage_Cpp17_VS2019() p.action.set("vs2019") cppdialect 'C++17' prepare() test.capture [[ NotUsing Level3 Disabled stdcpp17 ]] end function suite.onLanguage_CppLatest_VS2010() cppdialect 'C++latest' prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.onLanguage_CppLatest_VS2015() p.action.set("vs2015") cppdialect 'C++latest' prepare() test.capture [[ NotUsing Level3 Disabled /std:c++latest %(AdditionalOptions) ]] end function suite.onLanguage_CppLatest_VS2017() p.action.set("vs2017") cppdialect 'C++latest' prepare() test.capture [[ NotUsing Level3 Disabled stdcpplatest ]] end function suite.onLanguage_CppLatest_VS2019() p.action.set("vs2019") cppdialect 'C++latest' prepare() test.capture [[ NotUsing Level3 Disabled stdcpplatest ]] end -- -- Check StaticLib SymbolsPath -- function suite.generateProgramDataBaseFileName_onStaticLib() kind "StaticLib" symbols "On" symbolspath "$(IntDir)$(TargetName).pdb" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled $(IntDir)$(TargetName).pdb ]] end function suite.generateNotProgramDataBaseFileName_onSharedLib() kind "SharedLib" symbols "On" symbolspath "$(IntDir)$(TargetName).pdb" prepare() test.capture [[ NotUsing Level3 EditAndContinue Disabled ]] end -- -- Check UnsignedChar. -- function suite.unsignedChar_On() unsignedchar "On" prepare() test.capture [[ NotUsing Level3 Disabled /J %(AdditionalOptions) ]] end function suite.unsignedChar_Off() unsignedchar "Off" prepare() test.capture [[ NotUsing Level3 Disabled ]] end -- -- Check StructMemberAlignment -- function suite.structMemberAlignment() structmemberalign(1) prepare() test.capture [[ NotUsing Level3 Disabled 1Byte ]] end -- -- Check OmitFramePointer -- function suite.omitFramePointer_Default() omitframepointer "Default" prepare() test.capture [[ NotUsing Level3 Disabled ]] end function suite.omitFramePointer_On() omitframepointer "On" prepare() test.capture [[ NotUsing Level3 Disabled true ]] end function suite.omitFramePointer_Off() omitframepointer "Off" prepare() test.capture [[ NotUsing Level3 Disabled false ]] end function suite.omitFramePointer_DeprecationFlag() flags "NoFramePointer" prepare() test.capture [[ NotUsing Level3 Disabled true ]] end