diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index f52e50d..9526c18 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -62,7 +62,7 @@ jobs: - os: windows-latest TARGET: windows CMD_BUILD: > - pyinstaller --onefile cli.py -n cli --additional-hooks-dir=hooks --collect-datas reuse --collect-datas fosslight_util --copy-metadata Jinja2 --add-binary "LICENSE;LICENSES" --add-binary "LICENSES\LicenseRef-3rd_party_licenses.txt;LICENSES" && + pyinstaller cli.spec && move dist/cli.exe fosslight_prechecker_windows.exe OUT_FILE_NAME: fosslight_prechecker_windows.exe ASSET_MIME: application/vnd.microsoft.portable-executable diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 2abedb0..129a937 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -29,7 +29,7 @@ jobs: TARGET: windows CMD_BUILD: | tox -e windows - pyinstaller --onefile cli.py -n cli --additional-hooks-dir=hooks --collect-datas reuse --collect-datas fosslight_util --add-data="src\fosslight_prechecker\templates\default_template.jinja2;." && + pyinstaller cli.spec && move dist\cli.exe fosslight_prechecker_windows.exe && .\fosslight_prechecker_windows.exe OUT_FILE_NAME: fosslight_prechecker_windows.exe ASSET_MIME: application/vnd.microsoft.portable-executable diff --git a/.reuse/dep5 b/.reuse/dep5 index a3060d6..45e52a6 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -33,3 +33,7 @@ License: GPL-3.0-only Files: .coderabbit.yaml Copyright: 2026 LG Electronics License: GPL-3.0-only + +Files: cli.spec +Copyright: 2026 LG Electronics +License: GPL-3.0-only diff --git a/cli.spec b/cli.spec new file mode 100644 index 0000000..5599176 --- /dev/null +++ b/cli.spec @@ -0,0 +1,77 @@ +# -*- mode: python ; coding: utf-8 -*- + +from PyInstaller.utils.hooks import collect_data_files, copy_metadata, collect_all, collect_submodules + +# Collect data files from packages +datas = [] +datas += collect_data_files('reuse') +datas += collect_data_files('fosslight_util') +datas += copy_metadata('Jinja2') + +# Collect chardet and binaryornot to fix mypyc module issues +datas_chardet, binaries_chardet, hiddenimports_chardet = collect_all('chardet') +datas += datas_chardet + +datas_binaryornot, binaries_binaryornot, hiddenimports_binaryornot = collect_all('binaryornot') +datas += datas_binaryornot + +# Add template file +datas += [('src/fosslight_prechecker/templates/default_template.jinja2', '.')] + +# Add license files +datas += [('LICENSE', 'LICENSES')] +datas += [('LICENSES/LicenseRef-3rd_party_licenses.txt', 'LICENSES')] + +# Collect binaries +binaries = [] +binaries += binaries_chardet +binaries += binaries_binaryornot + +# Collect hidden imports including all chardet submodules +hiddenimports = ['pkg_resources.extern'] +hiddenimports += hiddenimports_chardet +hiddenimports += hiddenimports_binaryornot +hiddenimports += collect_submodules('chardet') +hiddenimports += collect_submodules('binaryornot') +hiddenimports += [ + 'chardet.universaldetector', + 'chardet.detector', + 'chardet.pipeline', + 'chardet.pipeline.orchestrator', +] + +a = Analysis( + ['cli.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=['hooks'], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='cli', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/hooks/hook-fosslight_prechecker.py b/hooks/hook-fosslight_prechecker.py index 5d54763..dd994e9 100644 --- a/hooks/hook-fosslight_prechecker.py +++ b/hooks/hook-fosslight_prechecker.py @@ -5,3 +5,16 @@ from PyInstaller.utils.hooks import collect_all datas, binaries, hiddenimports = collect_all('fosslight_prechecker') + +# Collect data files from binaryornot package +datas_binaryornot, binaries_binaryornot, hiddenimports_binaryornot = collect_all('binaryornot') +datas += datas_binaryornot +binaries += binaries_binaryornot +hiddenimports += hiddenimports_binaryornot + +# Collect data files from chardet package (fixes mypyc module issues) +datas_chardet, binaries_chardet, hiddenimports_chardet = collect_all('chardet') +datas += datas_chardet +binaries += binaries_chardet +hiddenimports += hiddenimports_chardet + diff --git a/requirements.txt b/requirements.txt index 680c431..a2e8909 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ python-debian==0.1.40 binaryornot +chardet<5.0.0 requests reuse==1.1.2 PyYAML diff --git a/tox.ini b/tox.ini index 6ee719b..cb70164 100644 --- a/tox.ini +++ b/tox.ini @@ -22,6 +22,7 @@ exclude = .tox/* [pytest] filterwarnings = ignore::DeprecationWarning +norecursedirs = build dist .tox .git __pycache__ [testenv:windows] commands =