Index: build/premake/cxxtest/cxxtest.lua =================================================================== --- build/premake/cxxtest/cxxtest.lua +++ build/premake/cxxtest/cxxtest.lua @@ -1,49 +1,76 @@ local m = {} m._VERSION = "1.0.0-dev" -m.path = nil +m.exepath = nil +m.rootfile = nil +m.runner = "ErrorPrinter" +m.options = "" + +-- Premake module for CxxTest support (http://cxxtest.com/). +-- The module can be used for generating a root file (that contains the entrypoint +-- for the test executable) and source files for each test header. + +-- Set the executable path for cxxtestgen +function m.setpath(exepath) + m.exepath = path.getabsolute(exepath) +end + +-- Pass all the necessary options to cxxtest (see http://cxxtest.com/guide.html) +-- for a reference of available options, that should eventually be implemented in +-- this module. +function m.init(source_root, have_std, runner, includes) --- We need to create .cpp files from the .h files before they can be compiled. --- This is done by the cxxtestgen utility. + m.rootfile = source_root.."test_root.cpp" + m.runner = runner --- We use a custom build rule for headers in order to generate the .cpp files. --- This has several advantages over using pre-build commands: --- - It cannot break when running parallel builds --- - No new generation happens when the header files are untouched + if m.have_std then + m.options = m.options.." --have-std" + end -function m.configure_project(rootfile, hdrfiles, rootoptions, testoptions) - if rootoptions == nil then - rootoptions = '' + for _,includefile in ipairs(includes) do + m.options = m.options.." --include="..includefile end - if testoptions == nil then - testoptions = '' + + -- With gmake, create a Utility project that generates the test root file + -- This is a workaround for https://github.com/premake/premake-core/issues/286 + if _ACTION == "gmake" then + project "cxxtestroot" + kind "Utility" + + -- Note: this command is not silent and clutters the output + -- Reported upstream: https://github.com/premake/premake-core/issues/954 + prebuildmessage 'Generating test root file' + prebuildcommands { m.exepath.." --root "..m.options.." --runner="..m.runner.." -o "..path.getabsolute(m.rootfile) } + buildoutputs { m.rootfile } end +end - local abspath = path.getabsolute(m.path) - local rootpath = path.getabsolute(rootfile) +-- Populate the test project that was created in premake5.lua. +function m.configure_project(hdrfiles) - -- Add headers + -- Generate the root file, or make sure the utility for generating + -- it is a dependancy with gmake. + if _ACTION == "gmake" then + dependson { "cxxtestroot" } + else + prebuildmessage 'Generating test root file' + prebuildcommands { m.exepath.." --root "..m.options.." --runner="..m.runner.." -o "..path.getabsolute(m.rootfile) } + end + -- Add headers for _,hdrfile in ipairs(hdrfiles) do files { hdrfile } end - -- Generate the root file - prebuildmessage 'Generating test root file' - prebuildcommands { abspath.." --root "..rootoptions.." -o "..rootpath } - -- Generate the source files from headers - filter { "files:**.h", "files:not **precompiled.h" } buildmessage 'Generating %{file.basename}.cpp' - buildcommands { abspath.." --part "..testoptions.." -o %{file.directory}/%{file.basename}.cpp %{file.relpath}" } + buildcommands { m.exepath.." --part "..m.options.." -o %{file.directory}/%{file.basename}.cpp %{file.relpath}" } buildoutputs { "%{file.directory}/%{file.basename}.cpp" } filter {} -- Add source files - - files { rootfile } - + files { m.rootfile } for _,hdrfile in ipairs(hdrfiles) do local srcfile = string.sub(hdrfile, 1, -3) .. ".cpp" files { srcfile } Index: build/premake/premake5.lua =================================================================== --- build/premake/premake5.lua +++ build/premake/premake5.lua @@ -18,7 +18,7 @@ -- OS X specific options newoption { trigger = "macosx-bundle", description = "Enable OSX bundle, the argument is the bundle identifier string (e.g. com.wildfiregames.0ad)" } newoption { trigger = "macosx-version-min", description = "Set minimum required version of the OS X API, the build will possibly fail if an older SDK is used, while newer API functions will be weakly linked (i.e. resolved at runtime)" } -newoption { trigger = "sysroot", description = "Set compiler system root path, used for building against a non-system SDK. For example /usr/local becomes SYSROOT/user/local" } +newoption { trigger = "sysroot", description = "Set compiler system root path, used for building against ca non-system SDK. For example /usr/local becomes SYSROOT/user/local" } -- Windows specific options newoption { trigger = "build-shared-glooxwrapper", description = "Rebuild glooxwrapper DLL for Windows. Requires the same compiler version that gloox was built with" } @@ -1291,27 +1291,34 @@ -- tests -------------------------------------------------------------------------------- -function configure_cxxtestgen() - local lcxxtestrootfile = source_root.."test_root.cpp" +function setup_tests() - -- Define the options used for cxxtestgen - local lcxxtestoptions = "--have-std" - local lcxxtestrootoptions = "--have-std" + local cxxtest = require "cxxtest" - if _OPTIONS["jenkins-tests"] then - lcxxtestrootoptions = lcxxtestrootoptions .. " --runner=XmlPrinter" + if os.istarget("windows") then + cxxtest.setpath(rootdir.."/build/bin/cxxtestgen.exe") else - lcxxtestrootoptions = lcxxtestrootoptions .. " --runner=ErrorPrinter" + cxxtest.setpath(rootdir.."/libraries/source/cxxtest-4.4/bin/cxxtestgen") end - -- Precompiled headers - the header is added to all generated .cpp files - -- note that the header isn't actually precompiled here, only #included - -- so that the build stage can use it as a precompiled header. - local include = " --include=precompiled.h" - -- This is required to build against SDL 2.0.4 on Windows - include = include .. " --include=lib/external_libraries/libsdl.h" - lcxxtestrootoptions = lcxxtestrootoptions .. include - lcxxtestoptions = lcxxtestoptions .. include + local runner = "ErrorPrinter" + if _OPTIONS["jenkins-tests"] then + runner = "XmlPrinter" + end + + local includefiles = { + -- Precompiled headers - the header is added to all generated .cpp files + -- note that the header isn't actually precompiled here, only #included + -- so that the build stage can use it as a precompiled header. + "precompiled.h", + -- This is required to build against SDL 2.0.4 on Windows. + "lib/external_libraries/libsdl.h", + } + + cxxtest.init(source_root, true, runner, includefiles) + + local target_type = get_main_project_target_type() + project_create("test", target_type) -- Find header files in 'test' subdirectories local all_files = os.matchfiles(source_root .. "**/tests/*.h") @@ -1327,24 +1334,7 @@ end end - local cxxtest = require "cxxtest" - - if os.istarget("windows") then - cxxtest.path = rootdir.."/build/bin/cxxtestgen.exe" - else - cxxtest.path = rootdir.."/libraries/source/cxxtest-4.4/bin/cxxtestgen" - end - - cxxtest.configure_project(lcxxtestrootfile, test_files, lcxxtestrootoptions, lcxxtestoptions) -end - - -function setup_tests() - - local target_type = get_main_project_target_type() - project_create("test", target_type) - - configure_cxxtestgen() + cxxtest.configure_project(test_files) filter "system:not macosx" linkgroups 'On'