From a69bcbfb58125432e08f5ca014adfbc25ab76d0c Mon Sep 17 00:00:00 2001 From: Jason Perkins Date: Thu, 10 Feb 2011 12:24:51 -0500 Subject: [PATCH] Added support for Haiku OS (Yuriy O'Donnell) --- .hgignore | 1 + CHANGES.txt | 1 + premake4.lua | 2 +- src/base/cmdline.lua | 3 +- src/base/os.lua | 409 +++++++++++++++++---------------- src/host/premake.h | 137 +++++------ src/tools/gcc.lua | 26 ++- tests/base/test_os.lua | 247 ++++++++++---------- tests/premake4.lua | 4 +- tests/{ => tools}/test_gcc.lua | 44 +++- 10 files changed, 462 insertions(+), 412 deletions(-) rename tests/{ => tools}/test_gcc.lua (75%) diff --git a/.hgignore b/.hgignore index aba8d711..af38b3f4 100644 --- a/.hgignore +++ b/.hgignore @@ -6,6 +6,7 @@ build bin obj release +ipch src/host/scripts.c Makefile diff --git a/CHANGES.txt b/CHANGES.txt index 4925816a..53a1214e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,6 +2,7 @@ 4.4 (in progress) ------- +* Added support for Haiku OS (Yuriy O'Donnell) * Patch 2963313: Enable setting .NET framework version (Justen Hyde) * Switched PS3 builds from GCC to SNC * Ignore NoRTTI flag for Managed C++ projects (Nick Darnell) diff --git a/premake4.lua b/premake4.lua index 503930ba..1646731b 100644 --- a/premake4.lua +++ b/premake4.lua @@ -60,7 +60,7 @@ buildoptions { "-mmacosx-version-min=10.1" } linkoptions { "-lstdc++-static", "-mmacosx-version-min=10.1" } - configuration { "not windows", "not solaris" } + configuration { "linux", "bsd", "macosx" } linkoptions { "-rdynamic" } configuration { "solaris" } diff --git a/src/base/cmdline.lua b/src/base/cmdline.lua index 4b1433bd..592edff9 100644 --- a/src/base/cmdline.lua +++ b/src/base/cmdline.lua @@ -1,7 +1,7 @@ -- -- cmdline.lua -- Functions to define and handle command line actions and options. --- Copyright (c) 2002-2009 Jason Perkins and the Premake project +-- Copyright (c) 2002-2011 Jason Perkins and the Premake project -- @@ -52,6 +52,7 @@ description = "Generate files for a different operating system", allowed = { { "bsd", "OpenBSD, NetBSD, or FreeBSD" }, + { "haiku", "Haiku" }, { "linux", "Linux" }, { "macosx", "Apple Mac OS X" }, { "solaris", "Solaris" }, diff --git a/src/base/os.lua b/src/base/os.lua index a9a040e9..59dc041c 100644 --- a/src/base/os.lua +++ b/src/base/os.lua @@ -1,203 +1,206 @@ --- --- os.lua --- Additions to the OS namespace. --- Copyright (c) 2002-2010 Jason Perkins and the Premake project --- - - --- --- Same as os.execute(), but accepts string formatting arguments. --- - - function os.executef(cmd, ...) - cmd = string.format(cmd, unpack(arg)) - return os.execute(cmd) - end - - --- --- Scan the well-known system locations for a particular library. --- - - function os.findlib(libname) - local path, formats - - -- assemble a search path, depending on the platform - if os.is("windows") then - formats = { "%s.dll", "%s" } - path = os.getenv("PATH") - else - if os.is("macosx") then - formats = { "lib%s.dylib", "%s.dylib" } - path = os.getenv("DYLD_LIBRARY_PATH") - else - formats = { "lib%s.so", "%s.so" } - path = os.getenv("LD_LIBRARY_PATH") or "" - - io.input("/etc/ld.so.conf") - if io.input() then - for line in io.lines() do - path = path .. ":" .. line - end - io.input():close() - end - end - - table.insert(formats, "%s") - path = (path or "") .. ":/lib:/usr/lib:/usr/local/lib" - end - - for _, fmt in ipairs(formats) do - local name = string.format(fmt, libname) - local result = os.pathsearch(name, path) - if result then return result end - end - end - - - --- --- Retrieve the current operating system ID string. --- - - function os.get() - return _OPTIONS.os or _OS - end - - - --- --- Check the current operating system; may be set with the /os command line flag. --- - - function os.is(id) - return (os.get():lower() == id:lower()) - end - - - --- --- The os.matchdirs() and os.matchfiles() functions --- - - local function domatch(result, mask, wantfiles) - -- need to remove extraneous path info from the mask to ensure a match - -- against the paths returned by the OS. Haven't come up with a good - -- way to do it yet, so will handle cases as they come up - if mask:startswith("./") then - mask = mask:sub(3) - end - - -- strip off any leading directory information to find out - -- where the search should take place - local basedir = mask - local starpos = mask:find("%*") - if starpos then - basedir = basedir:sub(1, starpos - 1) - end - basedir = path.getdirectory(basedir) - if (basedir == ".") then basedir = "" end - - -- recurse into subdirectories? - local recurse = mask:find("**", nil, true) - - -- convert mask to a Lua pattern - mask = path.wildcards(mask) - - local function matchwalker(basedir) - local wildcard = path.join(basedir, "*") - - -- retrieve files from OS and test against mask - local m = os.matchstart(wildcard) - while (os.matchnext(m)) do - local isfile = os.matchisfile(m) - if ((wantfiles and isfile) or (not wantfiles and not isfile)) then - local fname = path.join(basedir, os.matchname(m)) - if fname:match(mask) == fname then - table.insert(result, fname) - end - end - end - os.matchdone(m) - - -- check subdirectories - if recurse then - m = os.matchstart(wildcard) - while (os.matchnext(m)) do - if not os.matchisfile(m) then - local dirname = os.matchname(m) - matchwalker(path.join(basedir, dirname)) - end - end - os.matchdone(m) - end - end - - matchwalker(basedir) - end - - function os.matchdirs(...) - local result = { } - for _, mask in ipairs(arg) do - domatch(result, mask, false) - end - return result - end - - function os.matchfiles(...) - local result = { } - for _, mask in ipairs(arg) do - domatch(result, mask, true) - end - return result - end - - - --- --- An overload of the os.mkdir() function, which will create any missing --- subdirectories along the path. --- - - local builtin_mkdir = os.mkdir - function os.mkdir(p) - local dir = iif(p:startswith("/"), "/", "") - for part in p:gmatch("[^/]+") do - dir = dir .. part - - if (part ~= "" and not path.isabsolute(part) and not os.isdir(dir)) then - local ok, err = builtin_mkdir(dir) - if (not ok) then - return nil, err - end - end - - dir = dir .. "/" - end - - return true - end - - --- --- Remove a directory, along with any contained files or subdirectories. --- - - local builtin_rmdir = os.rmdir - function os.rmdir(p) - -- recursively remove subdirectories - local dirs = os.matchdirs(p .. "/*") - for _, dname in ipairs(dirs) do - os.rmdir(dname) - end - - -- remove any files - local files = os.matchfiles(p .. "/*") - for _, fname in ipairs(files) do - os.remove(fname) - end - - -- remove this directory - builtin_rmdir(p) - end - +-- +-- os.lua +-- Additions to the OS namespace. +-- Copyright (c) 2002-2011 Jason Perkins and the Premake project +-- + + +-- +-- Same as os.execute(), but accepts string formatting arguments. +-- + + function os.executef(cmd, ...) + cmd = string.format(cmd, unpack(arg)) + return os.execute(cmd) + end + + +-- +-- Scan the well-known system locations for a particular library. +-- + + function os.findlib(libname) + local path, formats + + -- assemble a search path, depending on the platform + if os.is("windows") then + formats = { "%s.dll", "%s" } + path = os.getenv("PATH") + elseif os.is("haiku") then + formats = { "lib%s.so", "%s.so" } + path = os.getenv("LIBRARY_PATH") + else + if os.is("macosx") then + formats = { "lib%s.dylib", "%s.dylib" } + path = os.getenv("DYLD_LIBRARY_PATH") + else + formats = { "lib%s.so", "%s.so" } + path = os.getenv("LD_LIBRARY_PATH") or "" + + io.input("/etc/ld.so.conf") + if io.input() then + for line in io.lines() do + path = path .. ":" .. line + end + io.input():close() + end + end + + table.insert(formats, "%s") + path = (path or "") .. ":/lib:/usr/lib:/usr/local/lib" + end + + for _, fmt in ipairs(formats) do + local name = string.format(fmt, libname) + local result = os.pathsearch(name, path) + if result then return result end + end + end + + + +-- +-- Retrieve the current operating system ID string. +-- + + function os.get() + return _OPTIONS.os or _OS + end + + + +-- +-- Check the current operating system; may be set with the /os command line flag. +-- + + function os.is(id) + return (os.get():lower() == id:lower()) + end + + + +-- +-- The os.matchdirs() and os.matchfiles() functions +-- + + local function domatch(result, mask, wantfiles) + -- need to remove extraneous path info from the mask to ensure a match + -- against the paths returned by the OS. Haven't come up with a good + -- way to do it yet, so will handle cases as they come up + if mask:startswith("./") then + mask = mask:sub(3) + end + + -- strip off any leading directory information to find out + -- where the search should take place + local basedir = mask + local starpos = mask:find("%*") + if starpos then + basedir = basedir:sub(1, starpos - 1) + end + basedir = path.getdirectory(basedir) + if (basedir == ".") then basedir = "" end + + -- recurse into subdirectories? + local recurse = mask:find("**", nil, true) + + -- convert mask to a Lua pattern + mask = path.wildcards(mask) + + local function matchwalker(basedir) + local wildcard = path.join(basedir, "*") + + -- retrieve files from OS and test against mask + local m = os.matchstart(wildcard) + while (os.matchnext(m)) do + local isfile = os.matchisfile(m) + if ((wantfiles and isfile) or (not wantfiles and not isfile)) then + local fname = path.join(basedir, os.matchname(m)) + if fname:match(mask) == fname then + table.insert(result, fname) + end + end + end + os.matchdone(m) + + -- check subdirectories + if recurse then + m = os.matchstart(wildcard) + while (os.matchnext(m)) do + if not os.matchisfile(m) then + local dirname = os.matchname(m) + matchwalker(path.join(basedir, dirname)) + end + end + os.matchdone(m) + end + end + + matchwalker(basedir) + end + + function os.matchdirs(...) + local result = { } + for _, mask in ipairs(arg) do + domatch(result, mask, false) + end + return result + end + + function os.matchfiles(...) + local result = { } + for _, mask in ipairs(arg) do + domatch(result, mask, true) + end + return result + end + + + +-- +-- An overload of the os.mkdir() function, which will create any missing +-- subdirectories along the path. +-- + + local builtin_mkdir = os.mkdir + function os.mkdir(p) + local dir = iif(p:startswith("/"), "/", "") + for part in p:gmatch("[^/]+") do + dir = dir .. part + + if (part ~= "" and not path.isabsolute(part) and not os.isdir(dir)) then + local ok, err = builtin_mkdir(dir) + if (not ok) then + return nil, err + end + end + + dir = dir .. "/" + end + + return true + end + + +-- +-- Remove a directory, along with any contained files or subdirectories. +-- + + local builtin_rmdir = os.rmdir + function os.rmdir(p) + -- recursively remove subdirectories + local dirs = os.matchdirs(p .. "/*") + for _, dname in ipairs(dirs) do + os.rmdir(dname) + end + + -- remove any files + local files = os.matchfiles(p .. "/*") + for _, fname in ipairs(files) do + os.remove(fname) + end + + -- remove this directory + builtin_rmdir(p) + end + diff --git a/src/host/premake.h b/src/host/premake.h index 4358b18a..0c83571b 100644 --- a/src/host/premake.h +++ b/src/host/premake.h @@ -1,67 +1,70 @@ -/** - * \file premake.h - * \brief Program-wide constants and definitions. - * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project - */ - -#define lua_c -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - - -/* Identify the current platform I'm not sure how to reliably detect - * Windows but since it is the most common I use it as the default */ -#if defined(__linux__) -#define PLATFORM_LINUX (1) -#define PLATFORM_STRING "linux" -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) -#define PLATFORM_BSD (1) -#define PLATFORM_STRING "bsd" -#elif defined(__APPLE__) && defined(__MACH__) -#define PLATFORM_MACOSX (1) -#define PLATFORM_STRING "macosx" -#elif defined(__sun__) && defined(__svr4__) -#define PLATFORM_SOLARIS (1) -#define PLATFORM_STRING "solaris" -#else -#define PLATFORM_WINDOWS (1) -#define PLATFORM_STRING "windows" -#endif - - -/* Pull in platform-specific headers required by built-in functions */ -#if PLATFORM_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -#else -#include -#endif - - -/* A success return code */ -#define OKAY (0) - - -/* Bootstrapping helper functions */ -int do_isfile(const char* filename); - - -/* Built-in functions */ -int path_isabsolute(lua_State* L); -int os_chdir(lua_State* L); -int os_copyfile(lua_State* L); -int os_getcwd(lua_State* L); -int os_isdir(lua_State* L); -int os_isfile(lua_State* L); -int os_matchdone(lua_State* L); -int os_matchisfile(lua_State* L); -int os_matchname(lua_State* L); -int os_matchnext(lua_State* L); -int os_matchstart(lua_State* L); -int os_mkdir(lua_State* L); -int os_pathsearch(lua_State* L); -int os_rmdir(lua_State* L); -int os_uuid(lua_State* L); -int string_endswith(lua_State* L); - +/** + * \file premake.h + * \brief Program-wide constants and definitions. + * \author Copyright (c) 2002-2011 Jason Perkins and the Premake project + */ + +#define lua_c +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" + + +/* Identify the current platform I'm not sure how to reliably detect + * Windows but since it is the most common I use it as the default */ +#if defined(__linux__) +#define PLATFORM_LINUX (1) +#define PLATFORM_STRING "linux" +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +#define PLATFORM_BSD (1) +#define PLATFORM_STRING "bsd" +#elif defined(__APPLE__) && defined(__MACH__) +#define PLATFORM_MACOSX (1) +#define PLATFORM_STRING "macosx" +#elif defined(__sun__) && defined(__svr4__) +#define PLATFORM_SOLARIS (1) +#define PLATFORM_STRING "solaris" +#elif defined(__HAIKU__) +#define PLATFORM_HAIKU (1) +#define PLATFORM_STRING "haiku" +#else +#define PLATFORM_WINDOWS (1) +#define PLATFORM_STRING "windows" +#endif + + +/* Pull in platform-specific headers required by built-in functions */ +#if PLATFORM_WINDOWS +#define WIN32_LEAN_AND_MEAN +#include +#else +#include +#endif + + +/* A success return code */ +#define OKAY (0) + + +/* Bootstrapping helper functions */ +int do_isfile(const char* filename); + + +/* Built-in functions */ +int path_isabsolute(lua_State* L); +int os_chdir(lua_State* L); +int os_copyfile(lua_State* L); +int os_getcwd(lua_State* L); +int os_isdir(lua_State* L); +int os_isfile(lua_State* L); +int os_matchdone(lua_State* L); +int os_matchisfile(lua_State* L); +int os_matchname(lua_State* L); +int os_matchnext(lua_State* L); +int os_matchstart(lua_State* L); +int os_mkdir(lua_State* L); +int os_pathsearch(lua_State* L); +int os_rmdir(lua_State* L); +int os_uuid(lua_State* L); +int string_endswith(lua_State* L); + diff --git a/src/tools/gcc.lua b/src/tools/gcc.lua index 1f5fc74e..7adb9a05 100644 --- a/src/tools/gcc.lua +++ b/src/tools/gcc.lua @@ -1,7 +1,7 @@ -- -- gcc.lua -- Provides GCC-specific configuration strings. --- Copyright (c) 2002-2008 Jason Perkins and the Premake project +-- Copyright (c) 2002-2011 Jason Perkins and the Premake project -- @@ -50,15 +50,15 @@ premake.gcc.platforms = { Native = { - cppflags = "-MMD -MP", + cppflags = "-MMD", }, x32 = { - cppflags = "-MMD -MP", + cppflags = "-MMD", flags = "-m32", ldflags = "-L/usr/lib32", }, x64 = { - cppflags = "-MMD -MP", + cppflags = "-MMD", flags = "-m64", ldflags = "-L/usr/lib64", }, @@ -78,7 +78,7 @@ cc = "ppu-lv2-g++", cxx = "ppu-lv2-g++", ar = "ppu-lv2-ar", - cppflags = "-MMD -MP", + cppflags = "-MMD", } } @@ -90,11 +90,20 @@ -- function premake.gcc.getcppflags(cfg) - local result = { } - table.insert(result, platforms[cfg.platform].cppflags) - return result + local flags = { } + table.insert(flags, platforms[cfg.platform].cppflags) + + -- We want the -MP flag for dependency generation (creates phony rules + -- for headers, prevents make errors if file is later deleted), but + -- Haiku doesn't support it (yet) + if flags[1]:startswith("-MMD") and cfg.system ~= "haiku" then + table.insert(flags, "-MP") + end + + return flags end + function premake.gcc.getcflags(cfg) local result = table.translate(cfg.flags, cflags) table.insert(result, platforms[cfg.platform].flags) @@ -104,6 +113,7 @@ return result end + function premake.gcc.getcxxflags(cfg) local result = table.translate(cfg.flags, cxxflags) return result diff --git a/tests/base/test_os.lua b/tests/base/test_os.lua index 9bcd2309..fb720c98 100644 --- a/tests/base/test_os.lua +++ b/tests/base/test_os.lua @@ -1,121 +1,126 @@ --- --- tests/base/test_os.lua --- Automated test suite for the new OS functions. --- Copyright (c) 2008-2010 Jason Perkins and the Premake project --- - - - T.os = { } - local suite = T.os - - --- --- os.findlib() tests --- - - function suite.findlib_FindSystemLib() - local libname = iif(os.is("windows"), "user32", "m") - test.istrue(os.findlib(libname)) - end - - function suite.findlib_FailsOnBadLibName() - test.isfalse(os.findlib("NoSuchLibraryAsThisOneHere")) - end - - --- --- os.isfile() tests --- - - function suite.isfile_ReturnsTrue_OnExistingFile() - test.istrue(os.isfile("premake4.lua")) - end - - function suite.isfile_ReturnsFalse_OnNonexistantFile() - test.isfalse(os.isfile("no_such_file.lua")) - end - - - --- --- os.matchfiles() tests --- - - function suite.matchfiles_OnNonRecursive() - local result = os.matchfiles("*.lua") - test.istrue(table.contains(result, "testfx.lua")) - test.isfalse(table.contains(result, "folder/ok.lua")) - end - - function suite.matchfiles_Recursive() - local result = os.matchfiles("**.lua") - test.istrue(table.contains(result, "folder/ok.lua")) - end - - function suite.matchfiles_SkipsDotDirs_OnRecursive() - local result = os.matchfiles("**.lua") - test.isfalse(table.contains(result, ".svn/text-base/testfx.lua.svn-base")) - end - - function suite.matchfiles_OnSubfolderMatch() - local result = os.matchfiles("**/xcode/*") - test.istrue(table.contains(result, "actions/xcode/test_xcode_project.lua")) - test.isfalse(table.contains(result, "premake4.lua")) - end - - function suite.matchfiles_OnDotSlashPrefix() - local result = os.matchfiles("./**.lua") - test.istrue(table.contains(result, "folder/ok.lua")) - end - - function suite.matchfiles_OnImplicitEndOfString() - local result = os.matchfiles("folder/*.lua") - test.istrue(table.contains(result, "folder/ok.lua")) - test.isfalse(table.contains(result, "folder/ok.lua.2")) - end - - function suite.matchfiles_OnLeadingDotSlashWithPath() - local result = os.matchfiles("./folder/*.lua") - test.istrue(table.contains(result, "folder/ok.lua")) - end - - - --- --- os.pathsearch() tests --- - - function suite.pathsearch_ReturnsNil_OnNotFound() - test.istrue( os.pathsearch("nosuchfile", "aaa;bbb;ccc") == nil ) - end - - function suite.pathsearch_ReturnsPath_OnFound() - test.isequal(os.getcwd(), os.pathsearch("premake4.lua", os.getcwd())) - end - - function suite.pathsearch_FindsFile_OnComplexPath() - test.isequal(os.getcwd(), os.pathsearch("premake4.lua", "aaa;"..os.getcwd()..";bbb")) - end - - function suite.pathsearch_NilPathsAllowed() - test.isequal(os.getcwd(), os.pathsearch("premake4.lua", nil, os.getcwd(), nil)) - end - - --- --- os.uuid() tests --- - - function suite.guid_ReturnsValidUUID() - local g = os.uuid() - test.istrue(#g == 36) - for i=1,36 do - local ch = g:sub(i,i) - test.istrue(ch:find("[ABCDEF0123456789-]")) - end - test.isequal("-", g:sub(9,9)) - test.isequal("-", g:sub(14,14)) - test.isequal("-", g:sub(19,19)) - test.isequal("-", g:sub(24,24)) - end - +-- +-- tests/base/test_os.lua +-- Automated test suite for the new OS functions. +-- Copyright (c) 2008-2011 Jason Perkins and the Premake project +-- + + + T.os = { } + local suite = T.os + + +-- +-- os.findlib() tests +-- + + function suite.findlib_FindSystemLib() + if os.is("windows") then + test.istrue(os.findlib("user32")) + elseif os.is("haiku") then + test.istrue(os.findlib("root")) + else + test.istrue(os.findlib("m")) + end + end + + function suite.findlib_FailsOnBadLibName() + test.isfalse(os.findlib("NoSuchLibraryAsThisOneHere")) + end + + +-- +-- os.isfile() tests +-- + + function suite.isfile_ReturnsTrue_OnExistingFile() + test.istrue(os.isfile("premake4.lua")) + end + + function suite.isfile_ReturnsFalse_OnNonexistantFile() + test.isfalse(os.isfile("no_such_file.lua")) + end + + + +-- +-- os.matchfiles() tests +-- + + function suite.matchfiles_OnNonRecursive() + local result = os.matchfiles("*.lua") + test.istrue(table.contains(result, "testfx.lua")) + test.isfalse(table.contains(result, "folder/ok.lua")) + end + + function suite.matchfiles_Recursive() + local result = os.matchfiles("**.lua") + test.istrue(table.contains(result, "folder/ok.lua")) + end + + function suite.matchfiles_SkipsDotDirs_OnRecursive() + local result = os.matchfiles("**.lua") + test.isfalse(table.contains(result, ".svn/text-base/testfx.lua.svn-base")) + end + + function suite.matchfiles_OnSubfolderMatch() + local result = os.matchfiles("**/xcode/*") + test.istrue(table.contains(result, "actions/xcode/test_xcode_project.lua")) + test.isfalse(table.contains(result, "premake4.lua")) + end + + function suite.matchfiles_OnDotSlashPrefix() + local result = os.matchfiles("./**.lua") + test.istrue(table.contains(result, "folder/ok.lua")) + end + + function suite.matchfiles_OnImplicitEndOfString() + local result = os.matchfiles("folder/*.lua") + test.istrue(table.contains(result, "folder/ok.lua")) + test.isfalse(table.contains(result, "folder/ok.lua.2")) + end + + function suite.matchfiles_OnLeadingDotSlashWithPath() + local result = os.matchfiles("./folder/*.lua") + test.istrue(table.contains(result, "folder/ok.lua")) + end + + + +-- +-- os.pathsearch() tests +-- + + function suite.pathsearch_ReturnsNil_OnNotFound() + test.istrue( os.pathsearch("nosuchfile", "aaa;bbb;ccc") == nil ) + end + + function suite.pathsearch_ReturnsPath_OnFound() + test.isequal(os.getcwd(), os.pathsearch("premake4.lua", os.getcwd())) + end + + function suite.pathsearch_FindsFile_OnComplexPath() + test.isequal(os.getcwd(), os.pathsearch("premake4.lua", "aaa;"..os.getcwd()..";bbb")) + end + + function suite.pathsearch_NilPathsAllowed() + test.isequal(os.getcwd(), os.pathsearch("premake4.lua", nil, os.getcwd(), nil)) + end + + +-- +-- os.uuid() tests +-- + + function suite.guid_ReturnsValidUUID() + local g = os.uuid() + test.istrue(#g == 36) + for i=1,36 do + local ch = g:sub(i,i) + test.istrue(ch:find("[ABCDEF0123456789-]")) + end + test.isequal("-", g:sub(9,9)) + test.isequal("-", g:sub(14,14)) + test.isequal("-", g:sub(19,19)) + test.isequal("-", g:sub(24,24)) + end + diff --git a/tests/premake4.lua b/tests/premake4.lua index 51d96919..48dd459c 100644 --- a/tests/premake4.lua +++ b/tests/premake4.lua @@ -1,7 +1,7 @@ -- -- tests/premake4.lua -- Automated test suite for Premake 4.x --- Copyright (c) 2008-2010 Jason Perkins and the Premake project +-- Copyright (c) 2008-2011 Jason Perkins and the Premake project -- dofile("testfx.lua") @@ -44,7 +44,6 @@ dofile("test_platforms.lua") dofile("test_targets.lua") dofile("test_keywords.lua") - dofile("test_gcc.lua") dofile("test_gmake_cpp.lua") dofile("test_gmake_cs.lua") dofile("base/test_api.lua") @@ -55,6 +54,7 @@ dofile("base/test_path.lua") dofile("base/test_table.lua") dofile("base/test_tree.lua") + dofile("tools/test_gcc.lua") -- Clean tests dofile("actions/test_clean.lua") diff --git a/tests/test_gcc.lua b/tests/tools/test_gcc.lua similarity index 75% rename from tests/test_gcc.lua rename to tests/tools/test_gcc.lua index 9334ef3b..c7fed844 100644 --- a/tests/test_gcc.lua +++ b/tests/tools/test_gcc.lua @@ -1,7 +1,7 @@ -- -- tests/test_gcc.lua -- Automated test suite for the GCC toolset interface. --- Copyright (c) 2009 Jason Perkins and the Premake project +-- Copyright (c) 2009-2011 Jason Perkins and the Premake project -- T.gcc = { } @@ -23,6 +23,28 @@ end +-- +-- CPPFLAGS tests +-- + + function suite.cppflags_OnWindows() + cfg.system = "windows" + local r = premake.gcc.getcppflags(cfg) + test.isequal("-MMD -MP", table.concat(r, " ")) + end + + function suite.cppflags_OnHaiku() + cfg.system = "haiku" + local r = premake.gcc.getcppflags(cfg) + test.isequal("-MMD", table.concat(r, " ")) + end + + + +-- +-- CFLAGS tests +-- + function suite.cflags_SharedLib_Windows() cfg.kind = "SharedLib" cfg.system = "windows" @@ -31,14 +53,6 @@ end - function suite.ldflags_SharedLib_Windows() - cfg.kind = "SharedLib" - cfg.system = "windows" - local r = premake.gcc.getldflags(cfg) - test.isequal('-s|-shared|-Wl,--out-implib="libMyProject.a"', table.concat(r,"|")) - end - - function suite.cflags_OnFpFast() cfg.flags = { "FloatFast" } local r = premake.gcc.getcflags(cfg) @@ -53,6 +67,18 @@ end +-- +-- LDFLAGS tests +-- + + function suite.ldflags_SharedLib_Windows() + cfg.kind = "SharedLib" + cfg.system = "windows" + local r = premake.gcc.getldflags(cfg) + test.isequal('-s|-shared|-Wl,--out-implib="libMyProject.a"', table.concat(r,"|")) + end + + function suite.linkflags_OnFrameworks() cfg.links = { "Cocoa.framework" } local r = premake.gcc.getlinkflags(cfg)