-- -- tests/actions/vstudio/vc200x/test_files.lua -- Validate generation of block in Visual Studio 200x projects. -- Copyright (c) 2009-2014 Jason Perkins and the Premake project -- local p = premake local suite = test.declare("vstudio_vs200x_files") local vc200x = p.vstudio.vc200x -- -- Setup -- local wks, prj function suite.setup() p.action.set("vs2008") p.escaper(p.vstudio.vs2005.esc) wks = test.createWorkspace() end local function prepare() prj = test.getproject(wks, 1) vc200x.files(prj) end -- -- Check the structure of an individual file element. -- function suite.file_onDefaults() files { "hello.cpp" } prepare() test.capture [[ ]] end -- -- Check the structure of a file contained in a folder. -- function suite.file_onSingleLevelFolder() files { "src/hello.cpp", "so_long.cpp" } prepare() test.capture [[ ]] end -- -- Check the structure of a file contained in multiple folders. -- function suite.file_onMultipleFolderLevels() files { "src/greetings/hello.cpp", "so_long.cpp" } prepare() test.capture [[ ]] end -- -- Check the structure of a file with a virtual path. -- function suite.file_onVpath() files { "src/hello.cpp", "so_long.h" } vpaths { ["Source Files"] = "**.cpp" } prepare() test.capture [[ ]] end -- -- Make sure that the special "build a C code" logic only gets triggered -- by actual C source code files. -- function suite.file_markedAsNonBuildable_onSupportFiles() language "C" files { "hello.lua" } prepare() test.capture [[ ]] end -- -- When a C code file is listed in a C++ project, it should still be -- compiled as C (and not C++), and vice versa. -- function suite.compileAsSet_onCFileInCppProject() language "C++" files { "hello.c" } prepare() test.capture [[ ]] end -- make sure compileas is still omitted when it matches the language. function suite.onCompileAs_C_as_CPP_in_CPP() language "C++" files { "hello.c" } filter {"files:hello.c"} compileas "C++" prepare() test.capture [[ ]] end function suite.onCompileAs_C_as_CPP_release() language "C" files { "hello.c" } filter {"files:hello.c", "configurations:release"} compileas "C++" prepare() test.capture [[ ]] end function suite.onCompileAs_CPP_as_C() language "C++" files { "hello.cpp" } filter {"files:hello.cpp"} compileas "C" prepare() test.capture [[ ]] end function suite.onCompileAs_CPP_as_C_release() language "C++" files { "hello.cpp" } filter {"files:hello.cpp", "configurations:release"} compileas "C" prepare() test.capture [[ ]] end -- -- A PCH source file should be marked as such. -- function suite.usePrecompiledHeadersSet_onPchSource() files { "afxwin.cpp" } pchsource "afxwin.cpp" prepare() test.capture [[ ]] end function suite.excludedFromBuild_onExcludeFlag() files { "hello.cpp" } filter "files:hello.cpp" flags { "ExcludeFromBuild" } prepare() test.capture [[ ]] end function suite.excludedFromBuild_onCustomBuildRule_excludedFile() files { "hello.cg" } filter "files:**.cg" buildcommands { "cgc $(InputFile)" } buildoutputs { "$(InputName).obj" } filter "Debug" removefiles { "hello.cg" } prepare() test.capture [[ ]] end function suite.excludedFromBuild_onCustomBuildRule_excludeFlag() files { "hello.cg" } filter "files:**.cg" buildcommands { "cgc $(InputFile)" } buildoutputs { "$(InputName).obj" } flags { "ExcludeFromBuild" } prepare() test.capture [[ ]] end -- -- If a custom build rule is supplied, the custom build tool settings should be used. -- function suite.customBuildTool_onBuildRule() files { "hello.x" } filter "files:**.x" buildmessage "Compiling $(InputFile)" buildcommands { 'cxc -c "$(InputFile)" -o "$(IntDir)/$(InputName).xo"', 'c2o -c "$(IntDir)/$(InputName).xo" -o "$(IntDir)/$(InputName).obj"' } buildoutputs { "$(IntDir)/$(InputName).obj" } prepare() test.capture [[ ]] end function suite.customBuildTool_onBuildRuleMultipleBuildOutputs() files { "hello.x" } filter "files:**.x" buildmessage "Compiling $(InputFile)" buildcommands { 'cp "$(InputFile)" "$(IntDir)/$(InputName).a"', 'cp "$(InputFile)" "$(IntDir)/$(InputName).b"' } buildoutputs { "$(IntDir)/$(InputName).a", "$(IntDir)/$(InputName).b" } prepare() test.capture [[ ]] end function suite.customBuildTool_onBuildRuleWithTokens() files { "hello.x" } objdir "../tmp/%{cfg.name}" filter "files:**.x" buildmessage "Compiling $(InputFile)" buildcommands { 'cxc -c %{file.relpath} -o %{cfg.objdir}/%{file.basename}.xo', 'c2o -c %{cfg.objdir}/%{file.basename}.xo -o %{cfg.objdir}/%{file.basename}.obj' } buildoutputs { "%{cfg.objdir}/%{file.basename}.obj" } prepare() test.capture [[ ]] end function suite.customBuildTool_onBuildRuleWithAdditionalInputs() files { "hello.x" } filter "files:**.x" buildmessage "Compiling $(InputFile)" buildcommands { 'cxc -c "$(InputFile)" -o "$(IntDir)/$(InputName).xo"', 'c2o -c "$(IntDir)/$(InputName).xo" -o "$(IntDir)/$(InputName).obj"' } buildoutputs { "$(IntDir)/$(InputName).obj" } buildinputs { "common.x.inc", "common.x.inc2" } prepare() test.capture [[ ]] end -- -- If two files at different folder levels have the same name, a different -- object file name should be used for each. -- function suite.uniqueObjectNames_onSourceNameCollision() files { "hello.cpp", "greetings/hello.cpp" } prepare() test.capture [[ ]] end -- -- Check handling of per-file forced includes. -- function suite.forcedIncludeFiles() files { "hello.cpp" } filter "files:**.cpp" forceincludes { "../include/force1.h", "../include/force2.h" } prepare() test.capture [[