From 69220922e573a662133a1a7672460e13acf248c3 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Sun, 25 Oct 2015 16:35:01 +0100 Subject: build-pkg: don't pre-download if MXE_MAX_ITEMS MXE_MAX_ITEMS is used mostly for debugging purposes. Waiting all packages to download (2Gb) is boring. --- tools/build-pkg.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 4b47b14..78fe32f 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -573,7 +573,9 @@ end assert(trim(shell('pwd')) == MXE_DIR, "Clone MXE to " .. MXE_DIR) assert(execute(("%s check-requirements"):format(tool 'make'))) -while not execute(('%s download -j 6 -k'):format(tool 'make')) do +if not max_items then + local cmd = ('%s download -j 6 -k'):format(tool 'make') + while not execute(cmd) do end end gitInit() local items, item2deps, item2ver = getItems() -- cgit v0.12 From 36cddeb56d32d2d332d4b59a2b991f5aa0792e19 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Sun, 25 Oct 2015 16:37:27 +0100 Subject: build-pkg: refactor Debian control generating Function debianControl() takes parameters of the Debian package and returns the contents of the Debian control file. --- tools/build-pkg.lua | 60 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 78fe32f..72f9bb4 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -397,14 +397,29 @@ Architecture: %s Depends: %s Maintainer: Boris Nagaev Homepage: http://mxe.cc -Description: MXE package %s for %s +Description: %s MXE (M cross environment) is a Makefile that compiles a cross compiler and cross compiles many free libraries such as SDL and Qt for various target platforms (MinGW). . - This package contains the files for MXE package %s. + %s ]] +local function debianControl(options) + local deb_deps_str = table.concat(options.deps, ', ') + return CONTROL:format( + options.package, + options.version, + options.arch, + deb_deps_str, + options.description1, + options.description2 + ) +end + +local D1 = "MXE package %s for %s" +local D2 = "This package contains the files for MXE package %s" + local function makeDeb(item, list_path, deps, ver) local target, pkg = parseItem(item) local deb_pkg = nameToDebian(item) @@ -428,13 +443,18 @@ local function makeDeb(item, list_path, deps, ver) for _, dep in ipairs(deps) do table.insert(deb_deps, nameToDebian(dep)) end - local deb_deps_str = table.concat(deb_deps, ', ') -- make DEBIAN/control file os.execute(('mkdir -p %s/DEBIAN'):format(dirname)) local control_fname = dirname .. '/DEBIAN/control' local control = io.open(control_fname, 'w') - control:write(CONTROL:format(deb_pkg, protectVersion(ver), - ARCH, deb_deps_str, pkg, target, pkg)) + control:write(debianControl { + package = deb_pkg, + version = protectVersion(ver), + arch = ARCH, + deps = deb_deps, + description1 = D1:format(pkg, target), + description2 = D2:format(pkg), + }) control:close() -- keep a copy of control file local cmd = 'cp %s %s.deb-control' @@ -517,22 +537,9 @@ local function getMxeVersion() return text:match('Release ([^<]+)') end -local MXE_REQUIREMENTS_CONTROL = [[Package: %s -Version: %s -Section: devel -Priority: optional -Architecture: %s -Depends: %s -Maintainer: Boris Nagaev -Homepage: http://mxe.cc -Description: MXE requirements package - MXE (M cross environment) is a Makefile that compiles - a cross compiler and cross compiles many free libraries - such as SDL and Qt for various target platforms (MinGW). - . - This package depends on all Debian dependencies of MXE. - Other MXE packages depend on this package. -]] +local MXE_REQUIREMENTS_DESCRIPTION2 = +[[This package depends on all Debian dependencies of MXE. + Other MXE packages depend on this package.]] local function makeMxeRequirementsDeb(release) local name = 'mxe-requirements' @@ -552,7 +559,6 @@ local function makeMxeRequirementsDeb(release) -- Jessie+ table.insert(deps, 'libtool-bin') end - local deps_str = table.concat(deps, ', ') -- directory local DIRNAME = '%s/%s_%s_%s' local dirname = DIRNAME:format(release, name, ver, ARCH) @@ -560,8 +566,14 @@ local function makeMxeRequirementsDeb(release) os.execute(('mkdir -p %s/DEBIAN'):format(dirname)) local control_fname = dirname .. '/DEBIAN/control' local control = io.open(control_fname, 'w') - control:write(MXE_REQUIREMENTS_CONTROL:format(name, - ver, ARCH, deps_str)) + control:write(debianControl { + package = name, + version = ver, + arch = ARCH, + deps = deps, + description1 = "MXE requirements package", + description2 = MXE_REQUIREMENTS_DESCRIPTION2, + }) control:close() -- make .deb file local cmd = 'dpkg-deb -b %s' -- cgit v0.12 From ac1543115b0e96154e01ae3e36e2598fe2deaf06 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Sun, 25 Oct 2015 21:01:53 +0100 Subject: build-pkg: find build arch with dpkg-architecture --- tools/build-pkg.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 72f9bb4..84e5e5c 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -35,8 +35,6 @@ How to remove them: http://stackoverflow.com/a/4262545 local max_items = tonumber(os.getenv('MXE_MAX_ITEMS')) local no_debs = os.getenv('MXE_NO_DEBS') -local ARCH = 'amd64' - local MXE_DIR = os.getenv('MXE_DIR') or '/usr/lib/mxe' local GIT = 'git --work-tree=./usr/ --git-dir=./usr/.git ' @@ -163,6 +161,9 @@ local function isCross(target) return target ~= NATIVE_TARGET end +local cmd = "dpkg-architecture -qDEB_BUILD_ARCH 2> /dev/null" +local ARCH = trim(shell(cmd)) + -- return target and package from item name local function parseItem(item) return item:match("([^~]+)~([^~]+)") -- cgit v0.12 From f50add7fc08856505b364232975addcd1349e2cf Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Oct 2015 01:15:37 +0100 Subject: build-pkg: refactor package building function Move common code (making a directory, control file, running tar, dpkg-deb, etc) to function makePackage(). This function is used by functions makeDeb() and makeMxeRequirementsDeb(). --- tools/build-pkg.lua | 132 +++++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 74 deletions(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 84e5e5c..e68af3a 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -156,6 +156,12 @@ local function fileExists(name) end end +local function writeFile(filename, data) + local file = io.open(filename, 'w') + file:write(data) + file:close() +end + local NATIVE_TARGET = trim(shell("ext/config.guess")) local function isCross(target) return target ~= NATIVE_TARGET @@ -385,11 +391,6 @@ local function protectVersion(ver) end end -local function listFile(item) - local target, pkg = parseItem(item) - return ('%s-%s.list'):format(target, pkg) -end - local CONTROL = [[Package: %s Version: %s Section: devel @@ -418,63 +419,60 @@ local function debianControl(options) ) end -local D1 = "MXE package %s for %s" -local D2 = "This package contains the files for MXE package %s" - -local function makeDeb(item, list_path, deps, ver) - local target, pkg = parseItem(item) - local deb_pkg = nameToDebian(item) - local dirname = ('%s_%s'):format(deb_pkg, +local function makePackage(name, files, deps, ver, d1, d2, dst) + local dst = dst or '.' + local dirname = ('%s/%s_%s'):format(dst, name, protectVersion(ver)) + -- make .list file + local list_path = ('%s/%s.list'):format(dst, name) + writeFile(list_path, table.concat(files, "\n")) -- make .tar.xz file local tar_name = dirname .. '.tar.xz' local cmd = '%s -T %s --owner=root --group=root -cJf %s' os.execute(cmd:format(tool 'tar', list_path, tar_name)) - -- unpack .tar.xz to the path for Debian - local usr = dirname .. MXE_DIR - os.execute(('mkdir -p %s'):format(usr)) - -- use tar to copy files with paths - local cmd = '%s -C %s -xf %s' - if not no_debs then - cmd = 'fakeroot -s deb.fakeroot ' .. cmd - end - os.execute(cmd:format(tool 'tar', usr, tar_name)) - -- prepare dependencies - local deb_deps = {'mxe-requirements'} - for _, dep in ipairs(deps) do - table.insert(deb_deps, nameToDebian(dep)) - end -- make DEBIAN/control file - os.execute(('mkdir -p %s/DEBIAN'):format(dirname)) - local control_fname = dirname .. '/DEBIAN/control' - local control = io.open(control_fname, 'w') - control:write(debianControl { - package = deb_pkg, + local control_text = debianControl { + package = name, version = protectVersion(ver), arch = ARCH, - deps = deb_deps, - description1 = D1:format(pkg, target), - description2 = D2:format(pkg), - }) - control:close() - -- keep a copy of control file - local cmd = 'cp %s %s.deb-control' - os.execute(cmd:format(control_fname, dirname)) + deps = deps, + description1 = d1, + description2 = d2, + } + writeFile(dirname .. ".deb-control", control_text) if not no_debs then + -- unpack .tar.xz to the path for Debian + local usr = dirname .. MXE_DIR + os.execute(('mkdir -p %s'):format(usr)) + os.execute(('mkdir -p %s/DEBIAN'):format(dirname)) + -- use tar to copy files with paths + local cmd = '%s -C %s -xf %s' + cmd = 'fakeroot -s deb.fakeroot ' .. cmd + os.execute(cmd:format(tool 'tar', usr, tar_name)) + -- make DEBIAN/control file + local control_fname = dirname .. '/DEBIAN/control' + writeFile(control_fname, control_text) -- make .deb file local cmd = 'fakeroot -i deb.fakeroot dpkg-deb -b %s' os.execute(cmd:format(dirname)) + -- cleanup + os.execute(('rm -fr %s deb.fakeroot'):format(dirname)) end - -- cleanup - os.execute(('rm -fr %s deb.fakeroot'):format(dirname)) end -local function saveFileList(list_file, list) - local file = io.open(list_file, 'w') - for _, installed_file in ipairs(list) do - file:write(installed_file .. '\n') +local D1 = "MXE package %s for %s" +local D2 = "This package contains the files for MXE package %s" + +local function makeDeb(item, files, deps, ver) + local target, pkg = parseItem(item) + local deb_pkg = nameToDebian(item) + local d1 = D1:format(pkg, target) + local d2 = D2:format(pkg) + local deb_deps = {'mxe-requirements'} + for _, dep in ipairs(deps) do + table.insert(deb_deps, nameToDebian(dep)) end - file:close() + makePackage(deb_pkg, files, deb_deps, ver, d1, d2) end local function isBuilt(item, files) @@ -494,6 +492,7 @@ local function buildPackages(items, item2deps) local broken = {} local unbroken = {} local file2item = {} + local item2files = {} local function brokenDep(item) for _, dep in ipairs(item2deps[item]) do if broken[dep] then @@ -506,7 +505,7 @@ local function buildPackages(items, item2deps) if not brokenDep(item) then local files = buildItem(item, item2deps, file2item) if isBuilt(item, files) then - saveFileList(listFile(item), files) + item2files[item] = files table.insert(unbroken, item) else -- broken package @@ -519,15 +518,15 @@ local function buildPackages(items, item2deps) item, brokenDep(item)) end end - return unbroken + return unbroken, item2files end -local function makeDebs(items, item2deps, item2ver) +local function makeDebs(items, item2deps, item2ver, item2files) for _, item in ipairs(items) do local deps = assert(item2deps[item], item) local ver = assert(item2ver[item], item) - local list_path = listFile(item) - makeDeb(item, list_path, deps, ver) + local files = assert(item2files[item], item) + makeDeb(item, files, deps, ver) end end @@ -543,6 +542,7 @@ local MXE_REQUIREMENTS_DESCRIPTION2 = Other MXE packages depend on this package.]] local function makeMxeRequirementsDeb(release) + os.execute(('mkdir -p %s'):format(release)) local name = 'mxe-requirements' local ver = getMxeVersion() .. release -- dependencies @@ -560,27 +560,11 @@ local function makeMxeRequirementsDeb(release) -- Jessie+ table.insert(deps, 'libtool-bin') end - -- directory - local DIRNAME = '%s/%s_%s_%s' - local dirname = DIRNAME:format(release, name, ver, ARCH) - -- make DEBIAN/control file - os.execute(('mkdir -p %s/DEBIAN'):format(dirname)) - local control_fname = dirname .. '/DEBIAN/control' - local control = io.open(control_fname, 'w') - control:write(debianControl { - package = name, - version = ver, - arch = ARCH, - deps = deps, - description1 = "MXE requirements package", - description2 = MXE_REQUIREMENTS_DESCRIPTION2, - }) - control:close() - -- make .deb file - local cmd = 'dpkg-deb -b %s' - os.execute(cmd:format(dirname)) - -- cleanup - os.execute(('rm -fr %s'):format(dirname)) + local files = {} + local d1 = "MXE requirements package" + local d2 = MXE_REQUIREMENTS_DESCRIPTION2 + local dst = release + makePackage(name, files, deps, ver, d1, d2, dst) end assert(trim(shell('pwd')) == MXE_DIR, @@ -594,8 +578,8 @@ gitInit() local items, item2deps, item2ver = getItems() local build_list = sortForBuild(items, item2deps) build_list = sliceArray(build_list, max_items) -local unbroken = buildPackages(build_list, item2deps) -makeDebs(unbroken, item2deps, item2ver) +local unbroken, item2files = buildPackages(build_list, item2deps) +makeDebs(unbroken, item2deps, item2ver, item2files) if not no_debs then makeMxeRequirementsDeb('wheezy') makeMxeRequirementsDeb('jessie') -- cgit v0.12 From c0b7e48c290529f4d7e47427d88e5fad5445c775 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Oct 2015 01:19:09 +0100 Subject: build-pkg: rename makeMxeRequirementsDeb rename makeMxeRequirementsDeb to makeMxeRequirementsPackage --- tools/build-pkg.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index e68af3a..7ab5740 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -541,7 +541,7 @@ local MXE_REQUIREMENTS_DESCRIPTION2 = [[This package depends on all Debian dependencies of MXE. Other MXE packages depend on this package.]] -local function makeMxeRequirementsDeb(release) +local function makeMxeRequirementsPackage(release) os.execute(('mkdir -p %s'):format(release)) local name = 'mxe-requirements' local ver = getMxeVersion() .. release @@ -581,6 +581,6 @@ build_list = sliceArray(build_list, max_items) local unbroken, item2files = buildPackages(build_list, item2deps) makeDebs(unbroken, item2deps, item2ver, item2files) if not no_debs then - makeMxeRequirementsDeb('wheezy') - makeMxeRequirementsDeb('jessie') + makeMxeRequirementsPackage('wheezy') + makeMxeRequirementsPackage('jessie') end -- cgit v0.12 From 97a8038a8bb3e4385dc208f5e397d827552d3fa3 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Oct 2015 01:42:25 +0100 Subject: build-pkg: add package mxe-source close #946 --- tools/build-pkg.lua | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 7ab5740..a0848d8 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -468,7 +468,7 @@ local function makeDeb(item, files, deps, ver) local deb_pkg = nameToDebian(item) local d1 = D1:format(pkg, target) local d2 = D2:format(pkg) - local deb_deps = {'mxe-requirements'} + local deb_deps = {'mxe-requirements', 'mxe-source'} for _, dep in ipairs(deps) do table.insert(deb_deps, nameToDebian(dep)) end @@ -567,6 +567,35 @@ local function makeMxeRequirementsPackage(release) makePackage(name, files, deps, ver, d1, d2, dst) end +local MXE_SOURCE_DESCRIPTION2 = +[[This package contains MXE source files. + Other MXE packages depend on this package.]] + +local function makeMxeSourcePackage() + local name = 'mxe-source' + local ver = getMxeVersion() + -- dependencies + local deps = {} + local files = { + 'CNAME', + 'LICENSE.md', + 'Makefile', + 'README.md', + 'assets', + 'doc', + 'ext', + 'index.html', + 'settings.mk', + 'src', + 'tools', + 'usr', + 'versions.json', + } + local d1 = "MXE source" + local d2 = MXE_SOURCE_DESCRIPTION2 + makePackage(name, files, deps, ver, d1, d2) +end + assert(trim(shell('pwd')) == MXE_DIR, "Clone MXE to " .. MXE_DIR) assert(execute(("%s check-requirements"):format(tool 'make'))) @@ -584,3 +613,4 @@ if not no_debs then makeMxeRequirementsPackage('wheezy') makeMxeRequirementsPackage('jessie') end +makeMxeSourcePackage() -- cgit v0.12 From 0886967de89393dac593da46ebf108427ab1a1c0 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Wed, 28 Oct 2015 00:25:15 +0100 Subject: build-pkg: replace _ with . in versions Underscores in versions were previously replaced with dashes. Example: 4_1_3 -> 4-1-3 (package winpcap). "-3" is interpreted as Debian patch version, which is wrong. --- tools/build-pkg.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index a0848d8..3ebd83c 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -382,7 +382,7 @@ local function nameToDebian(item) end local function protectVersion(ver) - ver = ver:gsub('_', '-') + ver = ver:gsub('_', '.') if ver:sub(1, 1):match('%d') then return ver else -- cgit v0.12 From eac808245f5211ac668b3c314247174046ef30cb Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Wed, 28 Oct 2015 00:28:01 +0100 Subject: build-pkg: use current date as Debian patch version Example: "4_1_3" -> "4.1.3-20151028". Adding build-unique (making two builds in one day is unlikely) Debian patch version tells APT that the package was updated. --- tools/build-pkg.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 3ebd83c..68008e7 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -35,6 +35,8 @@ How to remove them: http://stackoverflow.com/a/4262545 local max_items = tonumber(os.getenv('MXE_MAX_ITEMS')) local no_debs = os.getenv('MXE_NO_DEBS') +local TODAY = os.date("%Y%m%d") + local MXE_DIR = os.getenv('MXE_DIR') or '/usr/lib/mxe' local GIT = 'git --work-tree=./usr/ --git-dir=./usr/.git ' @@ -409,9 +411,10 @@ Description: %s local function debianControl(options) local deb_deps_str = table.concat(options.deps, ', ') + local version = options.version .. '-' .. TODAY return CONTROL:format( options.package, - options.version, + version, options.arch, deb_deps_str, options.description1, -- cgit v0.12 From af25251ae9c6af3bd40e5d9c15c9a5e8296eb557 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Wed, 28 Oct 2015 03:19:56 +0300 Subject: build-pkg: exclude usr and settings.mk from source --- tools/build-pkg.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/build-pkg.lua b/tools/build-pkg.lua index 68008e7..63452c8 100755 --- a/tools/build-pkg.lua +++ b/tools/build-pkg.lua @@ -588,10 +588,8 @@ local function makeMxeSourcePackage() 'doc', 'ext', 'index.html', - 'settings.mk', 'src', 'tools', - 'usr', 'versions.json', } local d1 = "MXE source" -- cgit v0.12