diff --git a/kibot/dep_downloader.py b/kibot/dep_downloader.py index 33b603da..8119069a 100644 --- a/kibot/dep_downloader.py +++ b/kibot/dep_downloader.py @@ -10,13 +10,16 @@ Dependencies: python_module: true role: Get color messages in a portable way debian: python3-colorama + arch: python-colorama - name: Requests python_module: true role: mandatory debian: python3-requests + arch: python-requests - name: PyYAML python_module: true debian: python3-yaml + arch: python-yaml module_name: yaml role: mandatory # Base dependencies used by various outputs @@ -30,9 +33,11 @@ Dependencies: url: https://git-scm.com/ downloader: git debian: git + arch: git - name: RSVG tools url: https://gitlab.gnome.org/GNOME/librsvg debian: librsvg2-bin + arch: librsvg command: rsvg-convert downloader: rsvg id: RSVG @@ -40,6 +45,7 @@ Dependencies: url: https://www.ghostscript.com/ url_down: https://github.com/ArtifexSoftware/ghostpdl-downloads/releases debian: ghostscript + arch: ghostscript command: gs downloader: gs - name: ImageMagick @@ -48,6 +54,8 @@ Dependencies: command: convert downloader: convert debian: imagemagick + arch: imagemagick + extra_arch: ['gsfonts'] - name: PcbDraw # 0.9.0 implements KiCad 6 support # 0.9.0.3 Fixes KiCad 5 problems @@ -789,7 +797,16 @@ def check_tool_dep(context, dep, fatal=False): if dep.deb_package: do_log_err('Debian package: '+dep.deb_package, fatal) if dep.extra_deb: - do_log_err('- Recommended extra Debian packages: '+' '.join(dep.deb_package), fatal) + do_log_err('- Recommended extra Debian packages: '+' '.join(dep.extra_deb), fatal) + if dep.arch: + arch = dep.arch + kind = 'Arch' + if arch.endswith('(AUR)'): + kind = 'AUR' + arch = arch[:-5] + do_log_err(kind+' package: '+dep.arch, fatal) + if dep.extra_arch: + do_log_err('- Recommended extra Arch packages: '+' '.join(dep.extra_arch), fatal) for comment in dep.comments: do_log_err(comment, fatal) show_roles(dep.roles, fatal) @@ -820,7 +837,7 @@ class ToolDependency(object): """ Class used to define tools needed for an output """ def __init__(self, output, name, url=None, url_down=None, is_python=False, deb=None, in_debian=True, extra_deb=None, roles=None, plugin_dirs=None, command=None, pypi_name=None, module_name=None, no_cmd_line_version=False, - help_option=None, no_cmd_line_version_old=False, downloader=None): + help_option=None, no_cmd_line_version_old=False, downloader=None, arch=None, extra_arch=None): # The associated output self.output = output # Name of the tool @@ -843,6 +860,9 @@ class ToolDependency(object): self.pypi_name = pypi_name if pypi_name is not None else name # Extra Debian packages needed to complement it self.extra_deb = extra_deb + # Arch Linux + self.arch = arch + self.extra_arch = extra_arch # URLs self.url = url self.url_down = url_down @@ -897,6 +917,8 @@ def register_dep(context, dep): deb = dep.get('debian', None) in_debian = deb is not None extra_deb = dep.get('extra_deb', None) + arch = dep.get('arch', None) + extra_arch = dep.get('extra_arch', None) is_python = dep.get('python_module', False) module_name = dep.get('module_name', None) plugin_dirs = dep.get('plugin_dirs', None) @@ -913,7 +935,8 @@ def register_dep(context, dep): td = ToolDependency(context, name, roles=role, url=url, url_down=url_down, deb=deb, in_debian=in_debian, extra_deb=extra_deb, is_python=is_python, module_name=module_name, plugin_dirs=plugin_dirs, command=command, help_option=help_option, pypi_name=pypi_name, - no_cmd_line_version_old=no_cmd_line_version_old, downloader=downloader) + no_cmd_line_version_old=no_cmd_line_version_old, downloader=downloader, arch=arch, + extra_arch=extra_arch) # Extra comments comments = dep.get('comments', []) if isinstance(comments, str): diff --git a/kibot/out_bom.py b/kibot/out_bom.py index 6cf26907..55026a34 100644 --- a/kibot/out_bom.py +++ b/kibot/out_bom.py @@ -14,6 +14,7 @@ Dependencies: role: Create XLSX files python_module: true debian: python3-xlsxwriter + arch: python-xlsxwriter downloader: python """ import csv diff --git a/kibot/out_compress.py b/kibot/out_compress.py index aa5e2e13..416caa9d 100644 --- a/kibot/out_compress.py +++ b/kibot/out_compress.py @@ -12,6 +12,7 @@ Dependencies: downloader: rar role: Compress in RAR format debian: rar + arch: rar(AUR) """ import re import os diff --git a/kibot/out_pcb_print.py b/kibot/out_pcb_print.py index f14a90e0..631acf38 100644 --- a/kibot/out_pcb_print.py +++ b/kibot/out_pcb_print.py @@ -24,6 +24,7 @@ Dependencies: - name: LXML python_module: true debian: python3-lxml + arch: python-lxml role: mandatory downloader: python """ diff --git a/kibot/out_report.py b/kibot/out_report.py index f09de780..ab03a3db 100644 --- a/kibot/out_report.py +++ b/kibot/out_report.py @@ -10,7 +10,9 @@ Dependencies: url: https://pandoc.org/ url_down: https://github.com/jgm/pandoc/releases debian: pandoc + arch: pandoc extra_deb: ['texlive-latex-base', 'texlive-latex-recommended'] + extra_arch: ['texlive-core'] comments: 'In CI/CD environments: the `kicad_auto_test` docker image contains it.' """ import os diff --git a/src/kibot-check b/src/kibot-check index 2ddef4b6..9f0f142a 100755 --- a/src/kibot-check +++ b/src/kibot-check @@ -20,11 +20,13 @@ import sys deps = '{\ "Colorama": {\ + "arch": "python-colorama",\ "command": "colorama",\ "comments": [],\ "deb_package": "python3-colorama",\ "downloader": null,\ "downloader_str": null,\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 100,\ @@ -50,11 +52,13 @@ deps = '{\ "url_down": null\ },\ "Ghostscript": {\ + "arch": "ghostscript",\ "command": "gs",\ "comments": [],\ "deb_package": "ghostscript",\ "downloader": {},\ "downloader_str": "gs",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 2,\ @@ -85,11 +89,13 @@ deps = '{\ "url_down": "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases"\ },\ "Git": {\ + "arch": "git",\ "command": "git",\ "comments": [],\ "deb_package": "git",\ "downloader": {},\ "downloader_str": "git",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 4,\ @@ -132,11 +138,15 @@ deps = '{\ "url_down": null\ },\ "ImageMagick": {\ + "arch": "imagemagick",\ "command": "convert",\ "comments": [],\ "deb_package": "imagemagick",\ "downloader": {},\ "downloader_str": "convert",\ + "extra_arch": [\ + "gsfonts"\ + ],\ "extra_deb": null,\ "help_option": "--version",\ "importance": 3,\ @@ -173,11 +183,13 @@ deps = '{\ "url_down": "https://imagemagick.org/script/download.php"\ },\ "Interactive HTML BoM": {\ + "arch": null,\ "command": "generate_interactive_bom.py",\ "comments": [],\ "deb_package": "interactive html bom",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10000,\ @@ -212,11 +224,13 @@ deps = '{\ "url_down": "https://github.com/INTI-CMNB/InteractiveHtmlBom/releases"\ },\ "KiBoM": {\ + "arch": null,\ "command": "KiBOM_CLI.py",\ "comments": [],\ "deb_package": "kibom",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10000,\ @@ -245,11 +259,13 @@ deps = '{\ "url_down": "https://github.com/INTI-CMNB/KiBoM/releases"\ },\ "KiCad Automation tools": {\ + "arch": null,\ "command": "pcbnew_do",\ "comments": [],\ "deb_package": "kicad automation tools",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 110003,\ @@ -408,11 +424,13 @@ deps = '{\ "url_down": "https://github.com/INTI-CMNB/KiAuto/releases"\ },\ "KiCad PCB/SCH Diff": {\ + "arch": null,\ "command": "kicad-diff.py",\ "comments": [],\ "deb_package": "kicad pcb/sch diff",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10000,\ @@ -441,11 +459,13 @@ deps = '{\ "url_down": "https://github.com/INTI-CMNB/KiDiff/releases"\ },\ "KiCost": {\ + "arch": null,\ "command": "kicost",\ "comments": [],\ "deb_package": "kicost",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10001,\ @@ -484,11 +504,13 @@ deps = '{\ "url_down": "https://github.com/hildogjr/KiCost/releases"\ },\ "LXML": {\ + "arch": "python-lxml",\ "command": "lxml",\ "comments": [],\ "deb_package": "python3-lxml",\ "downloader": {},\ "downloader_str": "python",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10000,\ @@ -514,6 +536,7 @@ deps = '{\ "url_down": null\ },\ "Pandoc": {\ + "arch": "pandoc",\ "command": "pandoc",\ "comments": [\ "In CI/CD environments: the `kicad_auto_test` docker image contains it."\ @@ -521,6 +544,9 @@ deps = '{\ "deb_package": "pandoc",\ "downloader": null,\ "downloader_str": null,\ + "extra_arch": [\ + "texlive-core"\ + ],\ "extra_deb": [\ "texlive-latex-base",\ "texlive-latex-recommended"\ @@ -548,6 +574,7 @@ deps = '{\ "url_down": "https://github.com/jgm/pandoc/releases"\ },\ "PcbDraw": {\ + "arch": null,\ "command": "pcbdraw",\ "comments": [\ "Currently the upstream version is broken, please use the mentioned fork"\ @@ -555,6 +582,7 @@ deps = '{\ "deb_package": "pcbdraw",\ "downloader": {},\ "downloader_str": "pytool",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10001,\ @@ -595,11 +623,13 @@ deps = '{\ "url_down": "https://github.com/INTI-CMNB/pcbdraw/releases"\ },\ "PyYAML": {\ + "arch": "python-yaml",\ "command": "pyyaml",\ "comments": [],\ "deb_package": "python3-yaml",\ "downloader": null,\ "downloader_str": null,\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 1000000,\ @@ -625,11 +655,13 @@ deps = '{\ "url_down": null\ },\ "QRCodeGen": {\ + "arch": null,\ "command": "qrcodegen",\ "comments": [],\ "deb_package": "python3-qrcodegen",\ "downloader": {},\ "downloader_str": "python",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 10000,\ @@ -655,11 +687,13 @@ deps = '{\ "url_down": null\ },\ "RAR": {\ + "arch": "rar(AUR)",\ "command": "rar",\ "comments": [],\ "deb_package": "rar",\ "downloader": {},\ "downloader_str": "rar",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "-?",\ "importance": 1,\ @@ -684,11 +718,13 @@ deps = '{\ "url_down": "https://www.rarlab.com/download.htm"\ },\ "RSVG tools": {\ + "arch": "librsvg",\ "command": "rsvg-convert",\ "comments": [],\ "deb_package": "librsvg2-bin",\ "downloader": {},\ "downloader_str": "rsvg",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 4,\ @@ -731,11 +767,13 @@ deps = '{\ "url_down": null\ },\ "Requests": {\ + "arch": "python-requests",\ "command": "requests",\ "comments": [],\ "deb_package": "python3-requests",\ "downloader": null,\ "downloader_str": null,\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 1000000,\ @@ -761,11 +799,13 @@ deps = '{\ "url_down": null\ },\ "XLSXWriter": {\ + "arch": "python-xlsxwriter",\ "command": "xlsxwriter",\ "comments": [],\ "deb_package": "python3-xlsxwriter",\ "downloader": {},\ "downloader_str": "python",\ + "extra_arch": null,\ "extra_deb": null,\ "help_option": "--version",\ "importance": 1,\ @@ -993,7 +1033,7 @@ def show_roles(roles): print(sev2color(o['sev'])+' - {} for {}{}'.format(o['desc'], o['output'], ver)) -def python_module(severity, name, deb_package, roles): +def python_module(severity, name, deb_package, roles, arch): if not severity: return print(sev2color(severity)+'* Python module `{}` not installed or too old'.format(name)) @@ -1001,6 +1041,10 @@ def python_module(severity, name, deb_package, roles): if deb_package is None: deb_package = 'python3-'+name print(' Install the `{0}` package, i.e.: `sudo apt-get install {0}`'.format(deb_package)) + elif arch_support: + if arch is None: + arch = 'python-'+name + print(' Install the `{0}` package, i.e.: `sudo pacman -S {0}`'.format(arch)) elif pip_ok: print(' run `{} install {}` as root,'.format(pip_command, name)) print(' or run `{} install --user {}` as a regular user'.format(pip_command, name)) @@ -1010,7 +1054,7 @@ def python_module(severity, name, deb_package, roles): print(RESET) -def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, roles, downloader, comments): +def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, roles, downloader, comments, arch, extra_arch): if not severity: return print(sev2color(severity)+'* {} not installed or too old'.format(name)) @@ -1020,6 +1064,13 @@ def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, role print(' Install the `{0}` package, i.e.: `sudo apt-get install {0}`'.format(deb_package)) if extra_deb: print(' You should also install the following packages: '+', '.join(extra_deb)) + elif arch and arch_support: + if arch.endswith('(AUR)'): + print(' Install the `{0}` package, i.e.: `sudo yay -S {0}`'.format(arch[:-5])) + else: + print(' Install the `{0}` package, i.e.: `sudo pacman -S {0}`'.format(arch)) + if extra_arch: + print(' You should also install the following packages: '+', '.join(extra_arch)) else: print(' Visit: '+url) if url_down: @@ -1214,6 +1265,9 @@ print() debian_support = False if which('apt-get'): debian_support = True +arch_support = False +if which('pacman'): + arch_support = True pip_ok = False if which('pip3'): pip_ok = True @@ -1260,10 +1314,10 @@ if not kibot_ok: for name, d in dependencies.items(): if d['is_python']: - python_module(d['sev'], d['pypi_name'], d['deb_package'], d['roles']) + python_module(d['sev'], d['pypi_name'], d['deb_package'], d['roles'], d['arch']) else: binary_tool(d['sev'], d['name'], d['url'], d['url_down'], d['deb_package'], d['in_debian'], d['extra_deb'], - d['roles'], d['downloader_str'], d['comments']) + d['roles'], d['downloader_str'], d['comments'], d['arch'], d['extra_arch']) if sys.stdout.isatty(): labels = ('ok', 'optional for an output', 'optional for general use', 'mandatory for an output', 'mandatory for general use') diff --git a/src/kibot-check.in b/src/kibot-check.in index eda5667a..94948963 100755 --- a/src/kibot-check.in +++ b/src/kibot-check.in @@ -220,7 +220,7 @@ def show_roles(roles): print(sev2color(o['sev'])+' - {} for {}{}'.format(o['desc'], o['output'], ver)) -def python_module(severity, name, deb_package, roles): +def python_module(severity, name, deb_package, roles, arch): if not severity: return print(sev2color(severity)+'* Python module `{}` not installed or too old'.format(name)) @@ -228,6 +228,10 @@ def python_module(severity, name, deb_package, roles): if deb_package is None: deb_package = 'python3-'+name print(' Install the `{0}` package, i.e.: `sudo apt-get install {0}`'.format(deb_package)) + elif arch_support: + if arch is None: + arch = 'python-'+name + print(' Install the `{0}` package, i.e.: `sudo pacman -S {0}`'.format(arch)) elif pip_ok: print(' run `{} install {}` as root,'.format(pip_command, name)) print(' or run `{} install --user {}` as a regular user'.format(pip_command, name)) @@ -237,7 +241,7 @@ def python_module(severity, name, deb_package, roles): print(RESET) -def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, roles, downloader, comments): +def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, roles, downloader, comments, arch, extra_arch): if not severity: return print(sev2color(severity)+'* {} not installed or too old'.format(name)) @@ -247,6 +251,13 @@ def binary_tool(severity, name, url, url_down, deb_package, deb, extra_deb, role print(' Install the `{0}` package, i.e.: `sudo apt-get install {0}`'.format(deb_package)) if extra_deb: print(' You should also install the following packages: '+', '.join(extra_deb)) + elif arch and arch_support: + if arch.endswith('(AUR)'): + print(' Install the `{0}` package, i.e.: `sudo yay -S {0}`'.format(arch[:-5])) + else: + print(' Install the `{0}` package, i.e.: `sudo pacman -S {0}`'.format(arch)) + if extra_arch: + print(' You should also install the following packages: '+', '.join(extra_arch)) else: print(' Visit: '+url) if url_down: @@ -441,6 +452,9 @@ print() debian_support = False if which('apt-get'): debian_support = True +arch_support = False +if which('pacman'): + arch_support = True pip_ok = False if which('pip3'): pip_ok = True @@ -487,10 +501,10 @@ if not kibot_ok: for name, d in dependencies.items(): if d['is_python']: - python_module(d['sev'], d['pypi_name'], d['deb_package'], d['roles']) + python_module(d['sev'], d['pypi_name'], d['deb_package'], d['roles'], d['arch']) else: binary_tool(d['sev'], d['name'], d['url'], d['url_down'], d['deb_package'], d['in_debian'], d['extra_deb'], - d['roles'], d['downloader_str'], d['comments']) + d['roles'], d['downloader_str'], d['comments'], d['arch'], d['extra_arch']) if sys.stdout.isatty(): labels = ('ok', 'optional for an output', 'optional for general use', 'mandatory for an output', 'mandatory for general use')