Rewrite langpack generation Lua
The existing shell-based approach required super-linear processing time for the SUPPORTED file.
This commit is contained in:
parent
b586203c24
commit
746617ce7d
112
glibc.spec
112
glibc.spec
@ -495,35 +495,91 @@ The sources for all locales provided in the language packs.
|
|||||||
If you are building custom locales you will most likely use
|
If you are building custom locales you will most likely use
|
||||||
these sources as the basis for your new locale.
|
these sources as the basis for your new locale.
|
||||||
|
|
||||||
%define lang_package()\
|
|
||||||
%package langpack-%{1}\
|
|
||||||
Summary: Locale data for %{1}\
|
|
||||||
Provides: glibc-langpack = %{version}-%{release}\
|
|
||||||
Requires: %{name} = %{version}-%{release}\
|
|
||||||
Requires: %{name}-common = %{version}-%{release}\
|
|
||||||
%define supplements_list %(cat %{SOURCE11} | grep ^%{1}_ | cut -d / -f 1 | cut -d @ -f 1 | cut -d . -f 1 | sort -u | tr "\\\\n" " " | sed 's/ $//' | sed 's/ / or langpacks-/g' | sed 's/^/ or langpacks-/')\
|
|
||||||
Supplements: (glibc = %{version}-%{release} and (langpacks-%{1}%{supplements_list}))\
|
|
||||||
%description langpack-%{1}\
|
|
||||||
The glibc-langpack-%{1} package includes the basic information required\
|
|
||||||
to support the %{1} language in your applications.\
|
|
||||||
%ifnarch %{auxarches}\
|
|
||||||
%files -f langpack-%{1}.filelist langpack-%{1}\
|
|
||||||
%defattr(-,root,root)\
|
|
||||||
%endif\
|
|
||||||
%{nil}
|
|
||||||
|
|
||||||
# language_list will contain a list of all supported language
|
|
||||||
# names in iso-639 format, i.e. something like "aa af ... yue zh zu"
|
|
||||||
# We add "eo" (Esperanto) manually because currently glibc has no
|
|
||||||
# Esperanto locale in SUPPORTED but translations for Esperanto exist.
|
|
||||||
# Therefore, we want a glibc-langpack-eo sub-package containing these
|
|
||||||
# translations.
|
|
||||||
%define language_list eo %(cat %{SOURCE11} | grep -E '^[a-z]+_' | cut -d _ -f 1 | sort -u | tr "\\\\n" " " | sed 's/ $//')
|
|
||||||
|
|
||||||
%{lua:
|
%{lua:
|
||||||
local languages = rpm.expand("%language_list")
|
-- Array of languages (ISO-639 codes).
|
||||||
string.gsub(languages, "(%a+)",
|
local languages = {}
|
||||||
function(i) print(rpm.expand("%lang_package "..i.."")) end)
|
-- Dictionary from language codes (as in the languages array) to arrays
|
||||||
|
-- of regions.
|
||||||
|
local supplements = {}
|
||||||
|
do
|
||||||
|
-- Parse the SUPPORTED file. Eliminate duplicates.
|
||||||
|
local lang_region_seen = {}
|
||||||
|
for line in io.lines(rpm.expand("%{SOURCE11}")) do
|
||||||
|
-- Match lines which contain a language (eo) or language/region
|
||||||
|
-- (en_US) strings.
|
||||||
|
local lang_region = string.match(line, "^([a-z][^/@.]+)")
|
||||||
|
if lang_region ~= nil then
|
||||||
|
if lang_region_seen[lang_region] == nil then
|
||||||
|
lang_region_seen[lang_region] = true
|
||||||
|
|
||||||
|
-- Split language/region pair.
|
||||||
|
local lang, region = string.match(lang_region, "^(.+)_(.+)")
|
||||||
|
if lang == nil then
|
||||||
|
-- Region is missing, use only the language.
|
||||||
|
lang = lang_region
|
||||||
|
end
|
||||||
|
local suppl = supplements[lang]
|
||||||
|
if suppl == nil then
|
||||||
|
suppl = {}
|
||||||
|
supplements[lang] = suppl
|
||||||
|
-- New language not seen before.
|
||||||
|
languages[#languages + 1] = lang
|
||||||
|
end
|
||||||
|
if region ~= nil then
|
||||||
|
-- New region because of the check against
|
||||||
|
-- lang_region_seen above.
|
||||||
|
suppl[#suppl + 1] = region
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Sort for determinism.
|
||||||
|
table.sort(languages)
|
||||||
|
for _, supples in pairs(supplements) do
|
||||||
|
table.sort(supplements)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Compute the Supplements: list for a language, based on the regions.
|
||||||
|
local function compute_supplements(lang)
|
||||||
|
result = "langpacks-" .. lang
|
||||||
|
regions = supplements[lang]
|
||||||
|
if regions ~= nil then
|
||||||
|
for i = 1, #regions do
|
||||||
|
result = result .. " or langpacks-" .. lang .. "_" .. regions[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Emit the definition of a language pack package.
|
||||||
|
local function lang_package(lang)
|
||||||
|
local suppl = compute_supplements(lang)
|
||||||
|
print(rpm.expand([[
|
||||||
|
|
||||||
|
%package langpack-]]..lang..[[
|
||||||
|
|
||||||
|
Summary: Locale data for ]]..lang..[[
|
||||||
|
|
||||||
|
Provides: glibc-langpack = %{version}-%{release}
|
||||||
|
Requires: %{name} = %{version}-%{release}
|
||||||
|
Requires: %{name}-common = %{version}-%{release}
|
||||||
|
Supplements: (glibc = %{version}-%{release} and (]]..suppl..[[))
|
||||||
|
%description langpack-]]..lang..[[
|
||||||
|
|
||||||
|
The glibc-langpack-]]..lang..[[ package includes the basic information required
|
||||||
|
to support the ]]..lang..[[ language in your applications.
|
||||||
|
%ifnarch %{auxarches}
|
||||||
|
%files -f langpack-]]..lang..[[.filelist langpack-]]..lang..[[
|
||||||
|
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%endif
|
||||||
|
]]))
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, #languages do
|
||||||
|
lang_package(languages[i])
|
||||||
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
# The glibc-all-langpacks provides the virtual glibc-langpack,
|
# The glibc-all-langpacks provides the virtual glibc-langpack,
|
||||||
|
Loading…
Reference in New Issue
Block a user