-- The class responsible for collecting the file associated with a library -- It basically collect all files under a directory within a set of extensions -- and remove all files that have suffix of a different platform. -- Note: only known suffixes are removed. unknown suffixes are kept. require "operators" require "functools" require "itertools" -- all valid platform suffixes defined. -- they must appear at the end of the filename only to be valid local PLATFORM_NAMES = { win32 = { "win32", "ms", "ms_pc", "vc", "sse" }, win64 = { "win64", "ms", "ms_pc", "vc", "sse" }, mac = { "mac", "apple", "clang", "sse" }, ios = { "ios", "apple", "clang" }, ps3_ppu = { "ps3", "ps3_ppu", "snc" }, ps3_spu = { "ps3", "ps3_spu", "gcc" }, vita = { "vita", "snc" }, orbis = { "orbis", "sse", "clang" }, xenon = { "ms", "xenon", "vc" }, durango = { "ms", "durango", "vc", "sse" }, cafe = { "cafe", "gc2", "gc", "ghs" }, linux = { "linux", "gcc" }, android = { "android", "gcc" }, } local ALL_PLATFORM_NAMES = collect(unique(concat_from_iterable(PLATFORM_NAMES))) FileHarvester = { -- all valid extensions. extensions = { ".h", ".cpp", ".inl", ".asm", ".c", ".mm", ".cgs" } } function FileHarvester:New(o) o = o or {} setmetatable(o, self) self.__index = self return o end -- Validation to check if a file is platform specific. function FileHarvester:HasPlatformIn(file, platforms) local basename = path.getbasename(file) function isplatform(platform) return basename:match("_" .. platform .. "$") ~= nil end return any(map(isplatform, platforms)) end -- Validation to check if a file is a bulk. function FileHarvester:IsBulk(file) return file:match("^.+_bulk_.+.cpp$") ~= nil end -- Validation to check if a file is a satellite blob. function FileHarvester:IsSatelliteBlob(file) return file:match("^.+" .. self.satelliteName .. "%.cpp$") ~= nil or file:match("^.+" .. self.satelliteName .. "_" .. self.platform .. "%.cpp$") ~= nil end -- Return all sources files (based on the extensions list) under the specified directory. function FileHarvester:GetSrcFiles(directory, extensions) function match_by_ext(ext) local pattern = joinpath(directory, "**" .. ext) return matchfiles(pattern) end return concat_from_iterable(map(match_by_ext, extensions)) end -- Check if a file is not specific to another platform. function FileHarvester:IsIncluded(file) return not self:HasPlatformIn(file, self.excluded_platforms) and not self:IsBulk(file) and (self.IsInBlobMode or not self:IsSatelliteBlob(file)) end -- return the list of valid files under the directory. function FileHarvester:Harvest(directory) self.included_platforms = PLATFORM_NAMES[self.platform] assert(self.included_platforms) self.excluded_platforms = collect(difference(ALL_PLATFORM_NAMES, self.included_platforms)) -- check if platform is ios if any(map(function(platform) return platform and platform == "ios" end, self.included_platforms)) then -- if platform is ios and ".plist" extension is not already included, add it in the extensions list if not any(map(function(extension) return extension and extension == ".plist" end, self.extensions)) then table.insert(self.extensions, ".plist") end end local files = self:GetSrcFiles(directory, self.extensions) return filter(partial(self.IsIncluded, self), files) end