diff --git a/.gitignore b/.gitignore index 6266c2b6b..2e9057d9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,23 @@ # Nazara build build/config.lua + +# Nazara libraries +lib/* + +# Nazara package +package/* + +# Example files examples/bin/*.exe examples/bin/*.pdb examples/bin/*.dll examples/bin/*.so + +# Unit tests tests/*.exe tests/*.pdb tests/*.dll tests/*.so -lib/* # Example generated files examples/bin/HardwareInfo.txt diff --git a/build/Package_MSVC.bat b/build/Package_MSVC.bat new file mode 100644 index 000000000..3a5c45bce --- /dev/null +++ b/build/Package_MSVC.bat @@ -0,0 +1 @@ +premake5 --pack-libdir=msvc package \ No newline at end of file diff --git a/build/Package_MinGW.bat b/build/Package_MinGW.bat new file mode 100644 index 000000000..aaa7bbf9a --- /dev/null +++ b/build/Package_MinGW.bat @@ -0,0 +1 @@ +premake5 --pack-libdir=mingw package \ No newline at end of file diff --git a/build/scripts/actions/package.lua b/build/scripts/actions/package.lua new file mode 100644 index 000000000..a03aaae2f --- /dev/null +++ b/build/scripts/actions/package.lua @@ -0,0 +1,189 @@ +newoption({ + trigger = "pack-libdir", + description = "Specifiy the subdirectory in lib/ to be used when packaging the project" +}) + +ACTION.Name = "Package" +ACTION.Description = "Pack Nazara binaries/include/lib together" + +ACTION.Function = function () + local libDir = _OPTIONS["pack-libdir"] + if (not libDir or #libDir == 0) then + local libDirs = os.matchdirs("../lib/*") + if (#libDirs > 1) then + error("More than one subdirectory was found in the lib directory, please use the --pack-libdir command to clarify which directory should be used") + elseif (#libDirs == 0) then + error("No subdirectory was found in the lib directory, have you built the engine yet?") + else + libDir = libDirs[1] + print("No directory was set by the --pack-libdir command, \"" .. libDir .. "\" will be used") + end + else + libDir = "../lib/" .. libDir .. "/" + end + + if (not os.isdir(libDir)) then + error(string.format("\"%s\" doesn't seem to be an existing directory", libDir)) + end + + local packageDir = "../package/" + + local copyTargets = { + { -- Engine headers + Masks = {"**.hpp", "**.inl"}, + Source = "../include/", + Target = "include/" + }, + { -- SDK headers + Masks = {"**.hpp", "**.inl"}, + Source = "../SDK/include/", + Target = "include/" + }, + { -- Examples files + Masks = {"**.hpp", "**.inl", "**.cpp"}, + Source = "../examples/", + Target = "examples/" + }, + { -- Demo resources + Masks = {"**.*"}, + Source = "../examples/bin/resources/", + Target = "examples/bin/resources/" + } + } + + if (os.is("windows")) then + -- Engine/SDK binaries + table.insert(copyTargets, { + Masks = {"**.dll"}, + Source = libDir, + Target = "bin/" + }) + + -- Engine/SDK libraries + table.insert(copyTargets, { + Masks = {"**.lib"}, + Source = libDir, + Target = "lib/" + }) + + -- 3rd party binary dep + table.insert(copyTargets, { + Masks = {"**.dll"}, + Source = "../extlibs/lib/common/", + Target = "bin/" + }) + + -- Demo executable (Windows) + table.insert(copyTargets, { + Masks = {"Demo*.exe"}, + Source = "../examples/bin", + Target = "examples/bin" + }) + elseif (os.is("macosx")) then + -- Engine/SDK binaries + table.insert(copyTargets, { + Masks = {"**.dynlib"}, + Source = libDir, + Target = "bin/" + }) + + -- Engine/SDK libraries + table.insert(copyTargets, { + Masks = {"**.a"}, + Source = libDir, + Target = "lib/" + }) + + -- 3rd party binary dep + table.insert(copyTargets, { + Masks = {"**.dynlib"}, + Source = "../extlibs/lib/common/", + Target = "bin/" + }) + + -- Demo executable (Windows) + table.insert(copyTargets, { + Masks = {"Demo*"}, + Filter = function (path) return path.getextension(path) == "" end, + Source = "../examples/bin", + Target = "examples/bin" + }) + else + -- Engine/SDK binaries + table.insert(copyTargets, { + Masks = {"**.so"}, + Source = libDir, + Target = "bin/" + }) + + -- Engine/SDK libraries + table.insert(copyTargets, { + Masks = {"**.a"}, + Source = libDir, + Target = "lib/" + }) + + -- 3rd party binary dep + table.insert(copyTargets, { + Masks = {"**.so"}, + Source = "../extlibs/lib/common/", + Target = "bin/" + }) + + -- Demo executable (Windows) + table.insert(copyTargets, { + Masks = {"Demo*"}, + Filter = function (path) return path.getextension(path) == "" end, + Source = "../examples/bin", + Target = "examples/bin" + }) + end + + + -- Processing + os.mkdir(packageDir) + + for k,v in pairs(copyTargets) do + local target = packageDir .. v.Target + local includePrefix = v.Source + for k,v in pairs(os.matchdirs(includePrefix .. "**")) do + local relPath = v:sub(#includePrefix + 1) + + local targetPath = target .. relPath + + if (not os.isdir(targetPath)) then + local ok, err = os.mkdir(targetPath) + if (not ok) then + print("Failed to create directory \"" .. targetPath .. "\": " .. err) + end + end + end + + local targetFiles = {} + for k, mask in pairs(v.Masks) do + local files = os.matchfiles(includePrefix .. mask) + if (v.Filter) then + for k,path in pairs(files) do + if (not v.Filter(v)) then + files[k] = nil + end + end + end + + targetFiles = table.join(targetFiles, files) + end + + for k,v in pairs(targetFiles) do + local relPath = v:sub(#includePrefix + 1) + + local targetPath = target .. relPath + + local ok, err = os.copyfile(v, targetPath) + if (not ok) then + print("Failed to copy \"" .. v .. "\" to \"" .. targetPath .. "\": " .. err) + end + end + end + + print(string.format("Package successfully created at \"%s\"", packageDir)) +end