-- Generates some MSVC2008 project files.
require("lfs")
math.randomseed(5000)
function scan(path)
local files = {}
local dirs = {}
for f in lfs.dir(path) do
if f ~= "." and f ~= ".." then
local a = lfs.attributes(path.."/"..f)
if a and a.mode == "directory" then
table.insert(dirs, f)
else
table.insert(files, f)
end
end
end
return files, dirs
end
function ignore(path)
if string.find(path, "libtcc") then
if string.find(path, "libtcc%.c") then
return false
else
print("NO", path)
return true
end
end
return false
end
function traverse(path, p, t)
if not p then p = path end
if not t then t = {} end
local f, d = scan(path)
for i,v in ipairs(f) do
if not ignore(path.."/"..v) then
table.insert(t, path.."/"..v)
end
end
for i,v in ipairs(d) do
t[v] = traverse(path.."/"..v, v, {})
end
return t
end
function winslash(s)
return string.gsub(s, "/", "\\")
end
function addfolder(name, t, out)
-- Build the data.
for i,v in pairs(t) do
if type(v) == "table" then
table.insert(out, "\n")
addfolder(i, v, out)
table.insert(out, "\n")
else
table.insert(out, "")
if string.find(v, "%.cpp") then
table.insert(out, "")
local u1,u2,obj = string.find(v, "(/modules/.*/)")
table.insert(out, "")
table.insert(out, "")
table.insert(out, "")
table.insert(out, "")
table.insert(out, "")
end
table.insert(out, "")
end
end
end
function contains(haystack, needle)
for i,v in ipairs(haystack) do
if v == needle then return true end
end
return false
end
guid = {}
guid.chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
function guid.gen()
local g = {"{"}
for i=1,8 do table.insert(g, guid.chars[math.random(1,16)]) end
table.insert(g, "-")
for j=1,3 do
for i=1,4 do table.insert(g, guid.chars[math.random(1,16)]) end
table.insert(g, "-")
end
for i=1,12 do table.insert(g, guid.chars[math.random(1,16)]) end
table.insert(g, "}")
return table.concat(g)
end
filter = {}
function filter.guid(data)
local g = guid.gen()
print(" GUID: " .. g)
return string.gsub(data, "{GUID}", g)
end
function filter.name(data, module)
print(" Name: " .. module)
return string.gsub(data, "{MODULE}", module)
end
function filter.includes(data, module)
local incstr = "include;../../src;../../src/modules;"
local sdlstr = "include/SDL"
local sdlmod = {"audio", "event", "graphics", "joystick", "keyboard", "mouse", "timer"}
if contains(sdlmod, module) then
incstr = incstr .. sdlstr
end
print(" Include: " .. incstr)
return string.gsub(data, "{INCLUDES}", incstr)
end
function filter.defines(data, module)
local unique = string.upper(module) .."_EXPORTS;"
local release = "WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;".. unique
local dbg = "WIN32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;".. unique
print(" Defines:")
print(" Debug: "..dbg)
print(" Release: "..release)
if module == "sound" then
dbg = dbg .. "FLAC__NO_DLL;"
release = release .. "FLAC__NO_DLL;"
end
local data = string.gsub(data, "{DEFINES_RELEASE}", release)
return string.gsub(data, "{DEFINES_DEBUG}", dbg)
end
function filter.libdir(data, module)
local dir = "lib"
print(" Libdir: " .. dir)
return string.gsub(data, "{LIBDIR}", dir)
end
libconf = {
audio = "lua5.1.lib SDL.lib openal32.lib",
event = "lua5.1.lib SDL.lib",
filesystem = "lua5.1.lib physfs.lib",
font = "lua5.1.lib freetype.lib",
graphics = "lua5.1.lib SDL.lib freetype.lib opengl32.lib",
image = "lua5.1.lib DevIL.lib",
joystick = "lua5.1.lib SDL.lib",
keyboard = "lua5.1.lib SDL.lib",
mouse = "lua5.1.lib SDL.lib",
native = "lua5.1.lib",
physics = "lua5.1.lib",
sound = "lua5.1.lib libmodplug.lib libmpg123.lib libogg.lib libvorbis.lib libvorbisfile.lib libFLAC_static.lib libFLAC++_static.lib",
timer = "lua5.1.lib SDL.lib",
}
function filter.libs(data, module)
print(" Libs: " .. libconf[module])
return string.gsub(data, "{LIBS}", libconf[module])
end
filter.filters = {
filter.name,
filter.guid,
filter.includes,
filter.defines,
filter.libdir,
filter.libs,
}
function update(module, t)
print("Updating "..module.." ...")
local infile = "master.vct"
local outfile = module..".vcproj"
-- Get the template.
local f = io.open(infile, "r")
if not f then print("Warning, file "..infile.." not found."); return end
local data = f:read("*a")
io.close(f)
for i,v in ipairs(filter.filters) do
data = v(data, module)
end
local out = {}
table.insert(out, "")
table.insert(out, "")
-- Build the data.
addfolder(module, t.modules[module], out)
table.insert(out, "")
table.insert(out, "")
-- Insert into file.
data = string.gsub(data, "{FILES}", table.concat(out, "\n"))
-- Write the file.
f = io.open(outfile, "w")
f:write(data)
io.close(f)
end
t = traverse("../../src")
print("")
print("------------------")
print("")
function printr(t, tab)
if not tab then tab = 0 end
for i,v in pairs(t) do
if type(v) == "table" then
print(string.rep("\t", tab)..i.." => {")
printr(v, tab+1)
print(string.rep("\t", tab).."}")
else
print(string.rep("\t", tab)..i.." => " .. v)
end
end
end
--printr(t)
local mods = {
"audio",
"event",
"filesystem",
"font",
"graphics",
"image",
"joystick",
"keyboard",
"mouse",
"native",
"physics",
"sound",
"timer",
}
for i,v in ipairs(mods) do
update(v, t)
end