1
0
forked from 0ad/0ad

# further cleanup to build system

remove platform specific code, provide "external library" definitions,
automatically add static libs to main EXE project.

This was SVN commit r3955.
This commit is contained in:
janwas 2006-06-07 01:40:24 +00:00
parent 40f29a8345
commit 82dc962a56

View File

@ -37,19 +37,7 @@ source_root = "../../../source/" -- default for most projects - overridden by lo
-- test workspace.
-- create a package and set the attributes that are common to all packages.
function create_package_with_cflags (package_name, target_type)
-- Note: don't store in local variable. A global variable needs to
-- be set for Premake's use; it is implicitly used in e.g. matchfiles()
package = newpackage()
package.path = project.path
package.language = "c++"
package.name = package_name
package.kind = target_type
------------- target --------------
function package_set_target(package_name)
-- Note: On Windows, ".exe" is added on the end, on unices the name is used directly
package.config["Debug" ].target = package_name.."_dbg"
@ -60,9 +48,9 @@ function create_package_with_cflags (package_name, target_type)
package.config["Debug" ].objdir = obj_dir_prefix.."Debug"
package.config["Testing"].objdir = obj_dir_prefix.."Test"
package.config["Release"].objdir = obj_dir_prefix.."Release"
end
------------- build flags --------------
function package_set_build_flags()
package.buildflags = { "with-symbols", "no-edit-and-continue", "extra-warnings" }
@ -77,10 +65,10 @@ function create_package_with_cflags (package_name, target_type)
-- various platform-specific build flags
if OS == "windows" then
table.insert(package.buildflags, "no-rtti")
tinsert(package.buildflags, "no-rtti")
-- use native wchar_t type (not typedef to unsigned short)
table.insert(package.buildflags, { "native-wchar_t" })
tinsert(package.buildflags, "native-wchar_t")
else -- *nix
package.buildoptions = {
"-Wall",
@ -98,12 +86,177 @@ function create_package_with_cflags (package_name, target_type)
"CONFIG_USE_MMGR"
}
end
end
-- create a package and set the attributes that are common to all packages.
function package_create(package_name, target_type)
-- Note: don't store in local variable. A global variable needs to
-- be set for Premake's use; it is implicitly used in e.g. matchfiles()
package = newpackage()
package.path = project.path
package.language = "c++"
package.name = package_name
package.kind = target_type
package_set_target(package_name)
package_set_build_flags()
return package
end
function package_add_contents(source_root, rel_source_dirs, rel_include_dirs, extern_libs, extra_params)
-- win_names
-- unix_names
-- dbg_suffix
-- no_delayload
-- add_func
extern_lib_defs = {
boost = {
},
cxxtest = {
},
dbghelp = {
win_names = { "dbghelp" },
dbg_suffix = "",
},
devil = {
},
directx = {
win_names = { "ddraw", "dsound" },
dbg_suffix = "",
},
libjpg = {
win_names = { "jpeg-6b" },
unix_names = { "jpeg" },
},
libpng = {
win_names = { "libpng13" },
unix_names = { "png" },
},
openal = {
win_names = { "openal32" },
unix_names = { "openal" },
dbg_suffix = "",
},
opengl = {
win_names = { "opengl32", "glu32", "gdi32" },
unix_names = { "GL", "GLU", "X11" },
dbg_suffix = "",
},
spidermonkey = {
win_names = { "js32" },
unix_names = { "js" },
},
vorbis = {
win_names = { "vorbisfile" },
unix_names = { "vorbisfile" },
dbg_suffix = "_d",
},
wxwindows = {
add_func = function()
tinsert(package.includepaths, libraries_dir.."wxwidgets/include/msvc")
tinsert(package.includepaths, libraries_dir.."wxwidgets/include")
tinsert(package.libpaths, libraries_dir.."wxwidgets/lib/vc_lib")
package.config["Debug" ].links = { "wxmsw26ud_gl" }
package.config["Release"].links = { "wxmsw26u_gl" }
end,
},
xerces = {
win_names = { "xerces-c_2" },
unix_names = { "xerces-c" },
no_delayload = 1,
},
zlib = {
win_names = { "zlib1" },
unix_names = { "z" },
},
sdl = {
unix_names = { "SDL" },
}
}
function add_delayload(name, suffix, def)
if def["no_delayload"] then
return
end
-- currently only supported by VC; nothing to do on other platforms.
if OS ~= "windows" then
return
end
-- no extra debug version
if suffix == "" then
tinsert(package.linkoptions, "/DELAYLOAD:"..name..".dll")
else
local dbg_cmd = "/DELAYLOAD:" .. name .. suffix .. ".dll"
local cmd = "/DELAYLOAD:" .. name .. ".dll"
tinsert(package.config["Debug" ].linkoptions, dbg_cmd)
-- 'Testing' config uses 'Debug' DLLs
tinsert(package.config["Testing"].linkoptions, dbg_cmd)
tinsert(package.config["Release"].linkoptions, cmd)
end
end
function add_extern_lib(extern_lib, def)
-- Add '<libraries root>/<libraryname>/lib' and '/include' to the includepaths and libpaths
tinsert(package.includepaths, libraries_dir .. extern_lib .. "/include")
tinsert(package.libpaths, libraries_dir .. extern_lib .. "/lib")
-- careful: make sure to only use *_names when on the correct platform.
local names = {}
if OS == "windows" then
if def.win_names then
names = def.win_names
end
else
if def.unix_names then
names = def.unix_names
end
end
local suffix = "d"
if def["dbg_suffix"] then
suffix = def["dbg_suffix"]
end
for i,name in names do
tinsert(package.config["Debug" ].links, name .. suffix)
-- 'Testing' config uses 'Debug' DLLs
tinsert(package.config["Testing"].links, name .. suffix)
tinsert(package.config["Release"].links, name)
add_delayload(name, suffix, def)
end
end
function package_add_extern_libs(extern_libs)
for i,extern_lib in extern_libs do
local def = extern_lib_defs[extern_lib]
assert(def, "external library not defined")
if def["add_func"] then
def["add_func"]()
else
add_extern_lib(extern_lib, def)
end
end
end
function package_add_contents(source_root, rel_source_dirs, rel_include_dirs, extra_params)
-- We don't want the VC project to be deeply nested (once for each
-- folder in source_root). Therefore, remove the source_root
@ -114,33 +267,32 @@ function package_add_contents(source_root, rel_source_dirs, rel_include_dirs, ex
package.trimprefix = source_root
package.files = sourcesfromdirs(source_root, rel_source_dirs)
if extra_params["extrasource"] then
for i,v in extra_params["extrasource"] do
table.insert(package.files, source_root .. v)
end
end
package.includepaths = {}
-- Put the project-specific PCH directory at the start of the
-- include path, so '#include "precompiled.h"' will look in
-- there first
if not extra_params["no_default_pch"] then
table.insert(package.includepaths, source_root .. "pch/" .. package.name)
tinsert(package.includepaths, source_root .. "pch/" .. package.name)
end
-- next is source root dir, for absolute (nonrelative) includes
-- (e.g. "lib/precompiled.h")
table.insert(package.includepaths, source_root)
tinsert(package.includepaths, source_root)
for i,v in rel_include_dirs do
table.insert(package.includepaths, source_root .. v)
tinsert(package.includepaths, source_root .. v)
end
-- Add '<libraries root>/<libraryname>/lib' and '/include' to the includepaths and libpaths
for i,v in extern_libs do
table.insert(package.includepaths, libraries_dir..v.."/include")
table.insert(package.libpaths, libraries_dir..v.."/lib")
if extra_params["extra_files"] then
for i,v in extra_params["extra_files"] do
tinsert(package.files, source_root .. v)
end
end
if extra_params["extra_links"] then
listconcat(package.links, extra_params["extra_links"])
end
end
@ -151,14 +303,21 @@ end
--------------------------------------------------------------------------------
-- the engine is split up into several static libraries. this eases separate
-- distribution of those components, reduces dependencies a bit, and can]
-- distribution of those components, reduces dependencies a bit, and can
-- also speed up builds.
-- names of all static libs created. added to the main app project later
-- (see explanation at end of this file)
static_lib_names = {}
-- note: rel_source_dirs and rel_include_dirs are relative to global source_root.
function setup_static_lib_package (package_name, rel_source_dirs, extern_libs, extra_params)
create_package_with_cflags(package_name, "lib")
package_add_contents(source_root, rel_source_dirs, {}, extern_libs, extra_params)
package_create(package_name, "lib")
package_add_contents(source_root, rel_source_dirs, {}, extra_params)
package_add_extern_libs(extern_libs)
tinsert(static_lib_names, package_name)
if OS == "windows" then
-- Precompiled Headers
@ -177,15 +336,18 @@ function setup_static_lib_package (package_name, rel_source_dirs, extern_libs, e
pch_dir = source_root.."pch/"..package_name.."/"
package.pchheader = "precompiled.h"
package.pchsource = "precompiled.cpp"
table.insert(package.files, pch_dir.."precompiled.cpp")
tinsert(package.files, pch_dir.."precompiled.cpp")
end
end
-- this is where the source tree is chopped up into static libs.
-- can be changed fairly easily; just copy+paste here, then add the new
-- library to the setup_main_exe package.links .
-- can be changed very easily; just copy+paste a new setup_static_lib_package,
-- or remove existing ones. static libs are automagically added to
-- main_exe link step.
function setup_all_libs ()
-- relative to global source_root.
local source_dirs = {}
-- names of external libraries used (see libraries_dir comment)
@ -207,7 +369,7 @@ function setup_all_libs ()
extern_libs = {
"spidermonkey",
"xerces",
"misc",
"opengl",
"zlib",
"boost"
}
@ -220,7 +382,7 @@ function setup_all_libs ()
"renderer"
}
extern_libs = {
"misc", -- i.e. OpenGL. our newer version of these headers is required.
"opengl",
"spidermonkey", -- for graphics/scripting
"boost"
}
@ -245,7 +407,7 @@ function setup_all_libs ()
}
extern_libs = {
"boost",
"misc", -- i.e. OpenGL. our newer version of these headers is required.
"opengl",
"spidermonkey"
}
setup_static_lib_package("atlas", source_dirs, extern_libs, {})
@ -257,7 +419,7 @@ function setup_all_libs ()
}
extern_libs = {
"spidermonkey",
"misc", -- i.e. OpenGL. our newer version of these headers is required.
"opengl",
"boost"
}
setup_static_lib_package("gui", source_dirs, extern_libs, {})
@ -272,7 +434,7 @@ function setup_all_libs ()
"lib/res/sound"
}
extern_libs = {
"misc", -- i.e. OpenGL. our newer version of these headers is required.
"opengl",
"libpng",
"zlib",
"openal",
@ -283,174 +445,123 @@ function setup_all_libs ()
}
setup_static_lib_package("lowlevel", source_dirs, extern_libs, {})
if OS == "windows" then
table.insert(package.files, sourcesfromdirs(source_root, {"lib/sysdep/win"}))
tinsert(package.files, sourcesfromdirs(source_root, {"lib/sysdep/win"}))
-- note: RC file must be added to main_exe package.
else
table.insert(package.files, sourcesfromdirs(source_root, {"lib/sysdep/unix"}))
tinsert(package.files, sourcesfromdirs(source_root, {"lib/sysdep/unix"}))
-- (X11 include path isn't standard across distributions)
table.insert(package.includepaths, { "/usr/X11R6/include/X11" } )
table.insert(package.includepaths, { "/usr/include/X11" } )
tinsert(package.includepaths, "/usr/X11R6/include/X11" )
tinsert(package.includepaths, "/usr/include/X11" )
end
end
--------------------------------------------------------------------------------
-- main EXE
--------------------------------------------------------------------------------
-- Bundles static libs together with main.cpp and builds game executable.
function setup_main_exe ()
create_package_with_cflags("pyrogenesis", "winexe")
package.files = { source_root .. "main.cpp" }
package.includepaths = { source_root }
package_create("pyrogenesis", "winexe")
-- For VS2005, tell the linker to use the libraries' .obj files instead of
-- the .lib, to allow incremental linking.
-- (Reduces re-link time from ~20 seconds to ~2 secs)
table.insert(package.buildflags, "use-library-dep-inputs")
tinsert(package.buildflags, "use-library-dep-inputs")
package.links = {
"engine",
"graphics",
"i18n",
"atlas",
"gui",
"lowlevel"
local extra_params = {
extra_files = { "main.cpp" },
}
package_add_contents(source_root, {}, {}, extra_params)
local extern_libs = {
"opengl",
"sdl",
"libjpg",
"libpng",
"zlib",
"spidermonkey",
"xerces",
"openal",
"vorbis",
"boost",
"dbghelp",
"cxxtest",
"directx",
}
package_add_extern_libs(extern_libs)
package.libpaths = {}
-- Platform Specifics
if OS == "windows" then
-- see libraries_dir comment
local extern_libs = {
"misc",
"libpng",
"zlib",
"openal",
"spidermonkey",
"xerces",
"vorbis",
"boost",
"libjpg",
"dbghelp",
"cxxtest",
"directx"
}
-- Add '<libraries root>/<libraryname>/lib' and '/include' to the includepaths and libpaths
for i,v in extern_libs do
table.insert(package.includepaths, libraries_dir..v.."/include")
table.insert(package.libpaths, libraries_dir..v.."/lib")
end
table.insert(package.links, { "opengl32" })
table.insert(package.files, {source_root.."lib/sysdep/win/icon.rc"})
tinsert(package.files, source_root.."lib/sysdep/win/icon.rc")
-- from lowlevel static lib; must be added here to be linked in
table.insert(package.files, {source_root.."lib/sysdep/win/error_dialog.rc"})
tinsert(package.files, source_root.."lib/sysdep/win/error_dialog.rc")
-- VS2005 generates its own manifest, but earlier ones need us to add it manually
if (options["target"] == "vs2002" or options["target"] == "vs2003") then
table.insert(package.files, {source_root.."lib/sysdep/win/manifest.rc"})
tinsert(package.files, source_root.."lib/sysdep/win/manifest.rc")
end
package.linkoptions = { "/ENTRY:entry",
"/DELAYLOAD:opengl32.dll",
"/DELAYLOAD:oleaut32.dll",
"/DELAYLOAD:advapi32.dll",
"/DELAYLOAD:gdi32.dll",
"/DELAYLOAD:user32.dll",
"/DELAYLOAD:ws2_32.dll",
"/DELAYLOAD:version.dll",
"/DELAYLOAD:ddraw.dll",
"/DELAYLOAD:dsound.dll",
"/DELAYLOAD:glu32.dll",
"/DELAYLOAD:openal32.dll",
"/DELAYLOAD:dbghelp.dll",
"/DELAY:UNLOAD" -- allow manual unload of delay-loaded DLLs
}
package.config["Debug"].linkoptions = {
"/DELAYLOAD:js32d.dll",
"/DELAYLOAD:zlib1d.dll",
"/DELAYLOAD:libpng13d.dll",
"/DELAYLOAD:jpeg-6bd.dll",
"/DELAYLOAD:vorbisfile_d.dll",
}
-- 'Testing' uses 'Debug' DLLs
package.config["Testing"].linkoptions = package.config["Debug"].linkoptions
package.config["Release"].linkoptions = {
"/DELAYLOAD:js32.dll",
"/DELAYLOAD:zlib1.dll",
"/DELAYLOAD:libpng13.dll",
"/DELAYLOAD:jpeg-6b.dll",
"/DELAYLOAD:vorbisfile.dll",
}
-- required to use WinMain() on Windows, otherwise will default to main()
table.insert(package.buildflags, { "no-main" })
tinsert(package.buildflags, "no-main")
else -- Non-Windows, = Unix
-- Libraries
table.insert(package.links, {
-- OpenGL and X-Windows
"GL", "GLU", "X11",
"SDL", "png", "jpeg",
tinsert(package.links, {
"fam",
-- Audio
"openal", "vorbisfile",
-- Utilities
"xerces-c", "z", "pthread", "rt", "js",
"pthread", "rt",
-- Debugging
"bfd", "iberty"
})
-- For debug_resolve_symbol
-- package.config["Debug"].links = { "bfd", "iberty" }
-- package.config["Testing"].links = { "bfd", "iberty" }
package.config["Debug"].linkoptions = { "-rdynamic" }
package.config["Testing"].linkoptions = { "-rdynamic" }
table.insert(package.libpaths, { "/usr/X11R6/lib" } )
tinsert(package.libpaths, "/usr/X11R6/lib")
end
end
---------------- Main Atlas package ----------------
function setuppackage_atlas(package_name, target_type, rel_source_dirs, rel_include_dirs, extern_libs, flags)
local source_root = "../../../source/tools/atlas/" .. package_name .. "/"
create_package_with_cflags(package_name, target_type)
package_create(package_name, target_type)
-- Don't add the default 'sourceroot/pch/projectname' for finding PCH files
flags["no_default_pch"] = 1
package_add_contents(source_root, rel_source_dirs, rel_include_dirs, extern_libs, flags)
package_add_contents(source_root, rel_source_dirs, rel_include_dirs, flags)
package_add_extern_libs(extern_libs)
-- Platform Specifics
if OS == "windows" then
table.insert(package.defines, "_UNICODE")
-- Handle wx specially
if flags["wx"] then
table.insert(package.includepaths, libraries_dir.."wxwidgets/include/msvc")
table.insert(package.includepaths, libraries_dir.."wxwidgets/include")
table.insert(package.libpaths, libraries_dir.."wxwidgets/lib/vc_lib")
end
tinsert(package.defines, "_UNICODE")
-- Link to required libraries
package.links = { "winmm", "comctl32", "rpcrt4" }
package.config["Debug"].links = { "wxmsw26ud_gl" }
package.config["Release"].links = { "wxmsw26u_gl" }
if flags["depends"] then
listconcat(package.links, flags["depends"])
end
-- required to use WinMain() on Windows, otherwise will default to main()
table.insert(package.buildflags, { "no-main" })
tinsert(package.buildflags, "no-main")
if flags["pch"] then
package.pchheader = "stdafx.h"
@ -463,33 +574,6 @@ function setuppackage_atlas(package_name, target_type, rel_source_dirs, rel_incl
end
---------------- Atlas 'frontend' tool-launching packages ----------------
function setuppackage_atlas_frontend (package_name)
create_package_with_cflags(package_name, "winexe")
local source_root = "../../../source/tools/atlas/AtlasFrontends/"
package.files = {
source_root..package_name..".cpp",
source_root..package_name..".rc"
}
package.trimprefix = source_root
package.includepaths = { source_root..".." }
-- Platform Specifics
if OS == "windows" then
table.insert(package.defines, "_UNICODE")
table.insert(package.links, "AtlasUI")
-- required to use WinMain() on Windows, otherwise will default to main()
table.insert(package.buildflags, { "no-main" })
else -- Non-Windows, = Unix
-- TODO
end
end
---------------- Atlas packages ----------------
@ -533,10 +617,10 @@ function setuppackages_atlas()
},{ -- extern_libs
"boost",
"devil",
"xerces"
"xerces",
"wxwidgets"
},{ -- flags
pch = 1,
wx = 1,
depends = { "AtlasObject", "DatafileIO" },
extrasource = { "Misc/atlas.rc" }
})
@ -558,11 +642,42 @@ function setuppackages_atlas()
pch = 1,
})
end
---------------- Atlas 'frontend' tool-launching packages ----------------
function setuppackage_atlas_frontend (package_name)
package_create(package_name, "winexe")
local source_root = "../../../source/tools/atlas/AtlasFrontends/"
package.files = {
source_root..package_name..".cpp",
source_root..package_name..".rc"
}
package.trimprefix = source_root
package.includepaths = { source_root..".." }
-- Platform Specifics
if OS == "windows" then
tinsert(package.defines, "_UNICODE")
tinsert(package.links, "AtlasUI")
-- required to use WinMain() on Windows, otherwise will default to main()
tinsert(package.buildflags, "no-main")
else -- Non-Windows, = Unix
-- TODO
end
end
function setup_atlas_frontends()
setuppackage_atlas_frontend("ActorEditor")
setuppackage_atlas_frontend("ArchiveViewer")
setuppackage_atlas_frontend("ColourTester")
setuppackage_atlas_frontend("FileConverter")
end
--------------------------------
@ -570,8 +685,20 @@ end
-- must come first, so that VC sets it as the default project and therefore
-- allows running via F5 without the "where is the EXE" dialog.
setup_main_exe()
-- save package global variable for later (will be overwritten by setup_all_libs)
main_exe_package = package
setup_all_libs()
-- HACK: add the static libs to the main EXE project. only now (after
-- setup_all_libs has run) are the lib names known. cannot move
-- setup_main_exe to run after setup_all_libs (see comment above).
-- we also don't want to hardcode the names - that would require more
-- work when changing the static lib breakdown.
listconcat(main_exe_package.links, static_lib_names)
if options["atlas"] then
setuppackages_atlas()
setup_atlas_frontends()
end