ffi = require 'ffi' local SLASH = "/" if ffi.os == "Windows" then SLASH = "\\" end -- Code by David Kastrup require "lfs" function dirtree(dir) assert(dir and dir ~= "", "directory parameter is missing or empty") if string.sub(dir, -1) == SLASH then dir=string.sub(dir, 1, -2) end local function yieldtree(dir) for entry in lfs.dir(dir) do if entry ~= "." and entry ~= ".." then entry=dir..SLASH..entry local attr=lfs.attributes(entry) coroutine.yield(entry,attr) if attr.mode == "directory" then yieldtree(entry) end end end end return coroutine.wrap(function() yieldtree(dir) end) end function string.ends(String,End) return End=='' or string.sub(String,-string.len(End))==End end function string.starts(String,Start) return string.sub(String,1,string.len(Start))==Start end local common_flags = "-Wno-macro-redefined -I.."..SLASH.."NativePath -I.."..SLASH.."NativePath"..SLASH.."standard" local debug_flags = "-O0 -g" local debug_ms_flags = "-Od -Zi" local release_flags = "-O3" local release_ms_flags = "" local objs = {} local cfiles = {} local hfiles = {} local exclude_dirs = {} local exclude_files = {} local debug = false local platform = "windows" local directory = "" local outputName = "lib" --Win dll for checking function BuildWindows32DLL(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -m32 -DNP_WIN32 -Wall -fno-ms-extensions -nobuiltininc -nostdinc++ -target i686-pc-windows-msvc "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; print(cmd) if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindows32DLL() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "clang -v -m32 -shared -o Windows\\x86\\"..outputName..".dll -Wl,\"-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.10586.0\\ucrt\\x86\",\"-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.10586.0\\um\\x86\",-nodefaultlib:libcmt,-dll,-libpath:..\\Libs\\Windows\\x86\\ -llibNativePath "..objs_str os.execute(cmd) end --Win function BuildWindows32(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -m32 -DNP_WIN32 -nobuiltininc -nostdinc++ -target i686-pc-windows-msvc "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindows32() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x86 && lib /OUT:Windows\\x86\\"..outputName..".lib "..objs_str os.execute(cmd) end function BuildWindows64(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -m64 -DNP_WIN32 -nobuiltininc -nostdinc++ -target i686-pc-windows-msvc "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindows64() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x64 && lib /OUT:Windows\\x64\\"..outputName..".lib "..objs_str os.execute(cmd) end --Win UWP function BuildWindowsUWP32(cfile) local flags = "" if debug then flags = debug_ms_flags else flags = release_ms_flags end local cmd = "clang-cl -DNP_WIN32 -WX -EHsc -MD -DWIN_EXPORT -m32 "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsUWP32() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x86 store && lib /OUT:WindowsUWP\\x86\\"..outputName..".lib "..objs_str os.execute(cmd) end function BuildWindowsUWP64(cfile) local flags = "" if debug then flags = debug_ms_flags else flags = release_ms_flags end local cmd = "clang-cl -DNP_WIN32 -WX -EHsc -MD -DWIN_EXPORT -m64 "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsUWP64() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x64 store && lib /OUT:WindowsUWP\\x64\\"..outputName..".lib "..objs_str os.execute(cmd) end function BuildWindowsUWPARM(cfile) local flags = "" if debug then flags = debug_ms_flags else flags = release_ms_flags end local cmd = "clang-cl -DNP_WIN32 -WX -EHsc -MD -DWIN_EXPORT -m32 --target=thumbv7-windows-msvc "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsUWPARM() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x86_arm store && lib /OUT:WindowsUWP\\ARM\\"..outputName..".lib "..objs_str os.execute(cmd) end --Win 8.1 function LinkWindows8132() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x86 8.1 store && lib /OUT:Windows8.1\\x86\\"..outputName..".lib "..objs_str os.execute(cmd) end function LinkWindows8164() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x64 8.1 store && lib /OUT:Windows8.1\\x64\\"..outputName..".lib "..objs_str os.execute(cmd) end function LinkWindows81ARM() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "\"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\vcvarsall\" x86_arm 8.1 store && lib /OUT:Windows8.1\\ARM\\"..outputName..".lib "..objs_str os.execute(cmd) end --iOS function BuildWindowsiOSArm7(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_IOS -nobuiltininc -nostdinc++ -mios-version-min=6.0 -target armv7-apple-ios "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsiOSArm7() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=bsd "..outputName.."_armv7.a "..objs_str os.execute(cmd) end function BuildWindowsiOSArm7s(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_IOS -nobuiltininc -nostdinc++ -mios-version-min=6.0 -target armv7s-apple-ios "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsiOSArm7s() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=bsd "..outputName.."_armv7s.a "..objs_str os.execute(cmd) end function BuildWindowsiOSArm64(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_IOS -nobuiltininc -nostdinc++ -mios-version-min=6.0 -target arm64-apple-ios "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsiOSArm64() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=bsd "..outputName.."_arm64.a "..objs_str os.execute(cmd) end function BuildWindowsiOSx86(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_IOS -nobuiltininc -nostdinc++ -mios-version-min=6.0 -target i386-apple-ios "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsiOSx86() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=bsd "..outputName.."_i386.a "..objs_str os.execute(cmd) end function BuildWindowsiOSx64(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_IOS -nobuiltininc -nostdinc++ -mios-version-min=6.0 -target x86_64-apple-ios "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkWindowsiOSx64() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=bsd "..outputName.."_x86_64.a "..objs_str os.execute(cmd) end --linux function BuildLinuxX64(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_LINUX -nobuiltininc -nostdinc++ -fPIC -target x86_64-linux-gnu "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkLinuxX64() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=gnu Linux\\x64\\"..outputName..".a "..objs_str os.execute(cmd) end function BuildLinuxX86(cfile) local flags = "" if debug then flags = debug_flags else flags = release_flags end local cmd = "clang -DNP_LINUX -nobuiltininc -nostdinc++ -fPIC -target i386-linux-gnu "..common_flags.." "..flags.." -o "..cfile..".o ".." -c "..cfile; if os.execute(cmd) == 0 then table.insert(objs, cfile..".o") end end function LinkLinuxX86() local objs_str = "" for i, o in ipairs(objs) do objs_str = objs_str..o.." " end local cmd = "llvm-ar rcs -format=gnu Linux\\x86\\"..outputName..".a "..objs_str os.execute(cmd) end function table.contains(table, element) for _, value in pairs(table) do if string.starts(element, value) then return true end end return false end for i,v in ipairs(arg) do if v == "debug" then debug = true elseif string.starts(v, "-I") then local includeDir = string.sub(v, 3) common_flags = common_flags.." -I"..includeDir elseif string.starts(v, "-D") then local includeDir = string.sub(v, 3) common_flags = common_flags.." -D"..includeDir elseif string.starts(v, "-n") then local n = string.sub(v, 3) outputName = n elseif string.starts(v, "-E") then local n = string.sub(v, 3) table.insert(exclude_dirs, n) elseif string.starts(v, "-e") then local n = string.sub(v, 3) table.insert(exclude_files, n) elseif v == "ios" then platform = "ios" elseif v == "linux" then platform = "linux" else directory = v end end for filename, attr in dirtree(directory) do if table.contains(exclude_dirs, filename) ~= true then if string.ends(filename, ".c") or string.ends(filename, ".cpp") and attr.mode == "file" and table.contains(exclude_files, filename) ~= true then table.insert(cfiles, filename) end else print("Excluding: "..filename) end end if platform == "windows" then lfs.mkdir("Windows") lfs.chdir("Windows") lfs.mkdir("x64") lfs.mkdir("x86") lfs.chdir("..") for i,f in ipairs(cfiles) do BuildWindows32DLL(f) end LinkWindows32DLL() objs = {} for i,f in ipairs(cfiles) do BuildWindows32(f) end LinkWindows32() objs = {} for i,f in ipairs(cfiles) do BuildWindows64(f) end LinkWindows64() objs = {} lfs.mkdir("WindowsUWP") lfs.chdir("WindowsUWP") lfs.mkdir("x64") lfs.mkdir("x86") lfs.mkdir("ARM") lfs.chdir("..") for i,f in ipairs(cfiles) do BuildWindowsUWP32(f) end LinkWindowsUWP32() objs = {} for i,f in ipairs(cfiles) do BuildWindowsUWP64(f) end LinkWindowsUWP64() objs = {} for i,f in ipairs(cfiles) do BuildWindowsUWPARM(f) end LinkWindowsUWPARM() objs = {} lfs.mkdir("Windows8.1") lfs.chdir("Windows8.1") lfs.mkdir("x64") lfs.mkdir("x86") lfs.mkdir("ARM") lfs.chdir("..") for i,f in ipairs(cfiles) do BuildWindowsUWP32(f) end LinkWindows8132() objs = {} for i,f in ipairs(cfiles) do BuildWindowsUWP64(f) end LinkWindows8164() objs = {} for i,f in ipairs(cfiles) do BuildWindowsUWPARM(f) end LinkWindows81ARM() elseif platform == "ios" then objs = {} for i,f in ipairs(cfiles) do BuildWindowsiOSArm7(f) end LinkWindowsiOSArm7() objs = {} for i,f in ipairs(cfiles) do BuildWindowsiOSArm7s(f) end LinkWindowsiOSArm7s() objs = {} for i,f in ipairs(cfiles) do BuildWindowsiOSArm64(f) end LinkWindowsiOSArm64() objs = {} for i,f in ipairs(cfiles) do BuildWindowsiOSx86(f) end LinkWindowsiOSx86() objs = {} for i,f in ipairs(cfiles) do BuildWindowsiOSx64(f) end LinkWindowsiOSx64() lfs.mkdir("iOS") os.execute("lipo "..outputName.."_armv7.a "..outputName.."_armv7s.a "..outputName.."_arm64.a "..outputName.."_i386.a "..outputName.."_x86_64.a -create -output iOS\\"..outputName..".a") elseif platform == "linux" then lfs.mkdir("Linux") lfs.chdir("Linux") lfs.mkdir("x64") lfs.mkdir("x86") lfs.chdir("..") objs = {} for i,f in ipairs(cfiles) do BuildLinuxX64(f) end LinkLinuxX64() objs = {} for i,f in ipairs(cfiles) do BuildLinuxX86(f) end LinkLinuxX86() end