Files
deskflow/scripts/lib/linux.py
Nick Bolton c8d9707857 Re-implement packaging for GitHub workflows (Linux) (#7361)
* Reorganize CMake Packaging module

* Match if statements to function order

* Cleanup root, res, and doc dirs

* Move deps to requirements.txt file

* Reorganize and format CMake files

* Rename changelog lint

* Add reccomended extension

* Workflow to lint CMake files

* Move CMake lint to script

* Try lighter dep

* Use venv

* Add --format arg

* Format all CMake files

* Convert bash script to Python

* Set CMake line ending format

* Restore formatting

* Add pyyaml dep

* Remove unused arg

* Rename config file

* Remove comment

* Repair copyrights (broken by defualt cmake-format)

* Restore 3rd party copyright

* Break up libs config into smaller macros

* Better macro name

* Load config after venv

* Make intentional noop clearer

* Only use upload step if required (make skip clearer)

* Use CPack for deb and rpm packaging

* Add upload step for Linux

* Remove cpack dep, doesn't exist

* Roll back presets version

* Fixed distro like match

* Update ChangeLog

* Legacy checkout for some distros

* All distros support v4

* Trying out newer Linux distros

* Install Git on Docker images

* Install without actions (not available before checkout)

* Delete useless action

* Install Python

* Support for Arch and OpenSUSE

* Add Arch and OpenSUSE to deps

* Name steps

* Full OpenSUSE names

* Mark Git dir safe

* Add pkgconf

* Legacy CMake for Debian 11

* Add OpenSSL to OpenSUSE

* Drop OpenSUSE Leap (no C++20 support)

* Skip packaging for Arch and OpenSUSE (for now)

* Shorten Arch/OpenSUSE names

* Clearer step name

* SImpler bootstrap

* Shell not needed

* Update apt

* Don't check return code

* Simplify python deps commands

* Add STGZ/.sh package type

* Prevent input prompt

* Only config git safe dir when needed

* Try cache v4

* Safe dir for Ubuntu

* Safe dir for Arch

* All Docker images seem to need safe dir config

* Refactor env var getters

* Make Ubuntu build extra packages

* Condense bootstep to single step

* Fixed var name

* Fixed bootstrap logic

* Simplify logic for upload condition (Windows and macOS)

* Make package/upload condition easier to understand

* Add Manjaro

* Generic names for Linux .tar.gz and .sh packages

* Add Manjaro deps

* Swap macOS matrix entries

* Add Red Hat UBI

* Remove RHEL subscription manager

* Throw on unsupported package distro

* Conditionally install pip and venv

* Remove extra pip arg

* Add config for RHEL

* Install EPEL for RHEL

* Back-out RHEL as EPEL requires subscription

* Restore Python deps logic

* Fixed bug: Packacking run twice

* Testing arm32v7 and arm64v8

* Revert "Testing arm32v7 and arm64v8"

This reverts commit cb3caf188d2b79ed083a62fc091de295f9889f3d.

* Re-add icon and shortcut file for Linux to package

* Support OpenSUSE RPM build

* Check return code

* Add `rpm-build` for OpenSUSE

* Reorg packages

* Remove busybox-which

* Add --non-interactive

* Move --non-interactive to correct position

* Experiment with makepkg

* Check and print package commands

* Make distro version optional

* Use 8 cores to build

* Default to distro name only

* Fixed bad PKGBUILD filename

* Use 4-part version for Arch

* Remove comma from conflicts

* Use .tar.gz from cwd

* Generate checksum for Arch

* Fixed file extension

* Use shell to print output

* Don't use shell

* Gaurd against bad cmd_utils.run

* Fixed bad import

* Use list command

* Fixed unable to run list commands

* Use source file name

* Simplify PKGBUILD to use make install

* Change install prefix

* Use DESTDIR

* Copy .desktop and .png to build dir

* Restore original `install(FILES...`

* Improving comments

* Fixed: makepkg runs from `src` by default

* Move error after command print

* Remove shell arg

* Package as a user instead of root (makepkg can't run as root)

* Fixed codesign runs in shell

* Allow list commands in shell on windows

* Don't use sudo on arch

* Install sudo on Arch

* Fixed typo

* Fix ownership of build directory for package user

* Improve example .env

* Change to depend on libstdc++6

* Add TODO

* Fixed Fedora version

* Remove libstdc++ deps (names vary between distros)

* Roll back to Fedora 40 and 39

* Improve comment

* Remove unneccesary default
2024-07-02 11:23:56 +01:00

88 lines
2.4 KiB
Python

import os, shutil, glob
import lib.cmd_utils as cmd_utils
import lib.env as env
dist_dir = "dist"
build_dir = "build"
def package(filename_base, build_distro=True, build_tgz=False, build_stgz=False):
extension, cmd = get_package_info(build_distro, build_tgz, build_stgz)
run_package_cmd(cmd)
package_filename = get_package_filename(extension)
target_file = f"{filename_base}.{extension}"
copy_to_dist_dir(package_filename, target_file)
def get_package_info(build_distro, build_tgz, build_stgz):
command = None
cpack_generator = None
file_extension = None
if build_tgz:
cpack_generator = "TGZ"
file_extension = "tar.gz"
elif build_stgz:
cpack_generator = "STGZ"
file_extension = "sh"
elif build_distro:
distro, distro_like, _distro_version = env.get_linux_distro()
if not distro_like:
distro_like = distro
if "debian" in distro_like:
cpack_generator = "DEB"
file_extension = "deb"
elif "fedora" in distro_like or "opensuse" in distro_like:
cpack_generator = "RPM"
file_extension = "rpm"
elif "arch" in distro_like:
command = ["makepkg", "-s"]
file_extension = "pkg.tar.zst"
else:
raise RuntimeError(f"Linux distro not yet supported: {distro_like}")
if not cpack_generator and not command:
raise RuntimeError("No package generator or command found")
if cpack_generator:
command = ["cpack", "-G", cpack_generator]
return file_extension, command
def run_package_cmd(command):
package_user = env.get_env("LINUX_PACKAGE_USER", required=False)
if package_user:
cmd_utils.run(["sudo", "chown", "-R", package_user, "build"], check=True)
command = ["sudo", "-u", package_user] + command
cwd = os.getcwd()
try:
os.chdir("build")
cmd_utils.run(command, check=True, print_cmd=True)
finally:
os.chdir(cwd)
def get_package_filename(extension):
files = glob.glob(f"build/*.{extension}")
if not files:
raise ValueError(f"No .{extension} file found in build directory")
return files[0]
def copy_to_dist_dir(source_file, target_file):
os.makedirs(dist_dir, exist_ok=True)
target_path = f"{dist_dir}/{target_file}"
print(f"Copying to: {target_path}")
shutil.copy(source_file, target_path)