diff --git a/CHANGES.txt b/CHANGES.txt index d2cfd08e..2e719e2d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,15 +1,9 @@ -------- - 4.4 (in progress) -------- - -* Patch 2963313: Enable setting .NET framework version (Justen Hyde) - - ------- 4.4 (in progress) ------- * Bug 3119793: Fixed ClCompile blocks with vs10 and PCH (Dan Dunham) * Patch 2963313: Enable setting .NET framework version (Justen Hyde) +* Switched PS3 builds from GCC to SNC ------- diff --git a/src/_manifest.lua b/src/_manifest.lua index 4ae99f4e..a88ed706 100644 --- a/src/_manifest.lua +++ b/src/_manifest.lua @@ -28,6 +28,7 @@ "tools/gcc.lua", "tools/msc.lua", "tools/ow.lua", + "tools/snc.lua", "base/validate.lua", "base/help.lua", "base/premake.lua", diff --git a/src/actions/vstudio/_vstudio.lua b/src/actions/vstudio/_vstudio.lua index 132d43ea..b598ef2f 100644 --- a/src/actions/vstudio/_vstudio.lua +++ b/src/actions/vstudio/_vstudio.lua @@ -212,16 +212,32 @@ output(indent, "") - if (not prj.flags.NoPCH and prj.pchsource == fname) then - for _, cfginfo in ipairs(prj.solution.vstudio_configs) do - if cfginfo.isreal then - local cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform) + + for _, cfginfo in ipairs(prj.solution.vstudio_configs) do + if cfginfo.isreal then + local cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform) + local usePCH = (not prj.flags.NoPCH and prj.pchsource == fname) + if (usePCH) then output(indent, "\t") output(indent, "\t\t") output(indent, "\t") end diff --git a/src/actions/vstudio/vs200x_vcproj.lua b/src/actions/vstudio/vs200x_vcproj.lua index ca9108ad..ac9843a7 100644 --- a/src/actions/vstudio/vs200x_vcproj.lua +++ b/src/actions/vstudio/vs200x_vcproj.lua @@ -274,17 +274,22 @@ local vcproj = premake.vstudio.vcproj -- --- Compiler and linker blocks for the PS3 platform, which uses GCC. +-- Compiler and linker blocks for the PS3 platform, which uses Sony's SNC. -- - function premake.vs200x_vcproj_VCCLCompilerTool_GCC(cfg) + function premake.vs200x_vcproj_VCCLCompilerTool_PS3(cfg) _p(3,' 0 then - _p(4,'AdditionalOptions="%s"', premake.esc(table.concat(buildoptions, " "))) + local buildoptions = table.join(premake.snc.getcflags(cfg), premake.snc.getcxxflags(cfg), cfg.buildoptions) + if not cfg.flags.NoPCH and cfg.pchheader then + _p(4,'UsePrecompiledHeader="%s"', iif(_ACTION < "vs2005", 3, 2)) + _p(4,'PrecompiledHeaderThrough="%s"', path.getname(cfg.pchheader)) + table.insert(buildoptions, "--use_pch=\"" .. path.getname(cfg.pchheader) .. ".pch" .. "\"") + else + _p(4,'UsePrecompiledHeader="%s"', iif(_ACTION > "vs2003" or cfg.flags.NoPCH, 0, 2)) end + _p(4,'AdditionalOptions="%s"', premake.esc(table.concat(buildoptions, " "))) if #cfg.includedirs > 0 then _p(4,'AdditionalIncludeDirectories="%s"', premake.esc(path.translate(table.concat(cfg.includedirs, ";"), '\\'))) @@ -300,12 +305,12 @@ local vcproj = premake.vstudio.vcproj _p(3,'/>') end - function premake.vs200x_vcproj_VCLinkerTool_GCC(cfg) + function premake.vs200x_vcproj_VCLinkerTool_PS3(cfg) _p(3,' 0 then _p(4,'AdditionalOptions="%s"', premake.esc(table.concat(buildoptions, " "))) end @@ -324,7 +329,7 @@ local vcproj = premake.vstudio.vcproj else _p(4,'Name="VCLibrarianTool"') - local buildoptions = table.join(premake.gcc.getldflags(cfg), cfg.linkoptions) + local buildoptions = table.join(premake.snc.getldflags(cfg), cfg.linkoptions) if #buildoptions > 0 then _p(4,'AdditionalOptions="%s"', premake.esc(table.concat(buildoptions, " "))) end @@ -432,9 +437,9 @@ local vcproj = premake.vstudio.vcproj local blockmap = { VCCLCompilerTool = premake.vs200x_vcproj_VCCLCompilerTool, - VCCLCompilerTool_GCC = premake.vs200x_vcproj_VCCLCompilerTool_GCC, + VCCLCompilerTool_PS3 = premake.vs200x_vcproj_VCCLCompilerTool_PS3, VCLinkerTool = premake.vs200x_vcproj_VCLinkerTool, - VCLinkerTool_GCC = premake.vs200x_vcproj_VCLinkerTool_GCC, + VCLinkerTool_PS3 = premake.vs200x_vcproj_VCLinkerTool_PS3, VCManifestTool = premake.vs200x_vcproj_VCManifestTool, VCMIDLTool = premake.vs200x_vcproj_VCMIDLTool, VCResourceCompilerTool = premake.vs200x_vcproj_VCResourceCompilerTool, @@ -504,11 +509,11 @@ local vcproj = premake.vstudio.vcproj "VCXMLDataGeneratorTool", "VCWebServiceProxyGeneratorTool", "VCMIDLTool", - "VCCLCompilerTool_GCC", + "VCCLCompilerTool_PS3", "VCManagedResourceCompilerTool", "VCResourceCompilerTool", "VCPreLinkEventTool", - "VCLinkerTool_GCC", + "VCLinkerTool_PS3", "VCALinkTool", "VCManifestTool", "VCXDCMakeTool", diff --git a/src/tools/snc.lua b/src/tools/snc.lua new file mode 100644 index 00000000..4928aaf5 --- /dev/null +++ b/src/tools/snc.lua @@ -0,0 +1,195 @@ +-- +-- snc.lua +-- Provides Sony SNC-specific configuration strings. +-- Copyright (c) 2010 Jason Perkins and the Premake project +-- + + + premake.snc = { } + + +-- TODO: Will cfg.system == "windows" ever be true for SNC? If +-- not, remove the conditional blocks that use this test. + +-- +-- Set default tools +-- + + premake.snc.cc = "snc" + premake.snc.cxx = "g++" + premake.snc.ar = "ar" + + +-- +-- Translation of Premake flags into SNC flags +-- + + local cflags = + { + EnableSSE = "-msse", + EnableSSE2 = "-msse2", + ExtraWarnings = "-Wall", + FatalWarnings = "-Werror", + FloatFast = "-ffast-math", + FloatStrict = "-ffloat-store", + NoFramePointer = "-fomit-frame-pointer", + Optimize = "-O2", + OptimizeSize = "-Os", + OptimizeSpeed = "-O3", + Symbols = "-g", + } + + local cxxflags = + { + NoExceptions = "", -- No exceptions is the default in the SNC compiler. + NoRTTI = "-Xc-=rtti", + } + + +-- +-- Map platforms to flags +-- + + premake.snc.platforms = + { + Native = { + cppflags = "-MMD -MP", + }, + x32 = { + cppflags = "-MMD -MP", + flags = "-m32", + ldflags = "-L/usr/lib32", + }, + x64 = { + cppflags = "-MMD -MP", + flags = "-m64", + ldflags = "-L/usr/lib64", + }, + PS3 = { + cc = "ppu-lv2-g++", + cxx = "ppu-lv2-g++", + ar = "ppu-lv2-ar", + cppflags = "-MMD -MP", + } + } + + local platforms = premake.snc.platforms + + +-- +-- Returns a list of compiler flags, based on the supplied configuration. +-- + + function premake.snc.getcppflags(cfg) + local result = { } + table.insert(result, platforms[cfg.platform].cppflags) + return result + end + + function premake.snc.getcflags(cfg) + local result = table.translate(cfg.flags, cflags) + table.insert(result, platforms[cfg.platform].flags) + if cfg.system ~= "windows" and cfg.kind == "SharedLib" then + table.insert(result, "-fPIC") + end + + return result + end + + function premake.snc.getcxxflags(cfg) + local result = table.translate(cfg.flags, cxxflags) + return result + end + + + +-- +-- Returns a list of linker flags, based on the supplied configuration. +-- + + function premake.snc.getldflags(cfg) + local result = { } + + if not cfg.flags.Symbols then + table.insert(result, "-s") + end + + if cfg.kind == "SharedLib" then + table.insert(result, "-shared") + if cfg.system == "windows" and not cfg.flags.NoImportLib then + table.insert(result, '-Wl,--out-implib="' .. cfg.linktarget.fullpath .. '"') + end + end + + if cfg.kind == "WindowedApp" and cfg.system == "windows" then + table.insert(result, "-mwindows") + end + + local platform = platforms[cfg.platform] + table.insert(result, platform.flags) + table.insert(result, platform.ldflags) + + return result + end + + +-- +-- Return a list of library search paths. Technically part of LDFLAGS but need to +-- be separated because of the way Visual Studio calls SNC for the PS3. See bug +-- #1729227 for background on why library paths must be split. +-- + + function premake.snc.getlibdirflags(cfg) + local result = { } + for _, value in ipairs(premake.getlinks(cfg, "all", "directory")) do + table.insert(result, '-L' .. _MAKE.esc(value)) + end + return result + end + + + +-- +-- Returns a list of linker flags for library search directories and library +-- names. See bug #1729227 for background on why the path must be split. +-- + + function premake.snc.getlinkflags(cfg) + local result = { } + for _, value in ipairs(premake.getlinks(cfg, "all", "basename")) do + if path.getextension(value) == ".framework" then + table.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value))) + else + table.insert(result, '-l' .. _MAKE.esc(value)) + end + end + return result + end + + + +-- +-- Decorate defines for the SNC command line. +-- + + function premake.snc.getdefines(defines) + local result = { } + for _,def in ipairs(defines) do + table.insert(result, '-D' .. def) + end + return result + end + + + +-- +-- Decorate include file search paths for the SNC command line. +-- + + function premake.snc.getincludedirs(includedirs) + local result = { } + for _,dir in ipairs(includedirs) do + table.insert(result, "-I" .. _MAKE.esc(dir)) + end + return result + end diff --git a/tests/actions/vstudio/test_vs200x_vcproj.lua b/tests/actions/vstudio/test_vs200x_vcproj.lua index c0466880..14a99222 100644 --- a/tests/actions/vstudio/test_vs200x_vcproj.lua +++ b/tests/actions/vstudio/test_vs200x_vcproj.lua @@ -361,10 +361,11 @@ includedirs { "include/pkg1", "include/pkg2" } defines { "DEFINE1", "DEFINE2" } prepare() - premake.vs200x_vcproj_VCCLCompilerTool_GCC(premake.getconfig(prj, "Debug", "PS3")) + premake.vs200x_vcproj_VCCLCompilerTool_PS3(premake.getconfig(prj, "Debug", "PS3")) test.capture [[