From 6da9717725a00402b4f539b3bdf1e2e782acca33 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 09:18:57 +0300 Subject: [PATCH 01/25] Add the Release design spec (Windows zip and Linux AppImage via GitHub Actions) Co-Authored-By: Claude Opus 5.5 --- .../specs/2026-10-31-release-design.md | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 docs/superpowers/specs/2026-10-31-release-design.md diff --git a/docs/superpowers/specs/2026-10-31-release-design.md b/docs/superpowers/specs/2026-10-31-release-design.md new file mode 100644 index 0000000..ac283c8 --- /dev/null +++ b/docs/superpowers/specs/2026-10-31-release-design.md @@ -0,0 +1,134 @@ +# Подпроект «Релиз» — дизайн + +Дата: 2026-10-31 · Статус: на ревью · Опирается на: [«Фундамент»](2026-10-25-foundation-design.md), [спайк RAxML-NG](../spikes/2026-10-24-raxml-ng-windows/README.md) + +## 1. Цель и решения + +Релиз phymlGUI собирается в GitHub Actions по тегу и даёт два самодостаточных +пакета: zip для Windows x64 и AppImage для Linux x86-64. В обоих пакетах уже +есть все анализ-программы. + +**Решения пользователя:** Linux-пакет — AppImage; внутри оба PhyML +(последовательный и MPI), MPI на Linux — системный OpenMPI; релиз создаётся по +тегу `v*` как **черновик**, публикует его пользователь; RAxML-NG собирается и +кладётся в пакеты уже сейчас; один workflow `release.yml` (подход A); упаковщик +— PyInstaller. Задачи по Linux выполняются без субагентов. + +## 2. Перенос приложения на Linux + +- `phyml_core/utils.exe_name(base) -> str`: `base + '.exe'` на Windows, `base` + иначе. Движки (`phyml-mpi`/`phyml`, `iqtree2`) и runner (`muscle`) ищут + инструменты через него. +- `AppPaths.find_tool`: после `bin/` — поиск через `shutil.which` по тем же + именам. +- «Открыть папку результатов»: `os.startfile` на Windows, + `QDesktopServices.openUrl(QUrl.fromLocalFile(...))` на Linux. +- Тема «как в системе» на Linux: светлота палитры Qt; акцент — `green`. +- Папка данных: правило «папка приложения, если в неё можно писать» остаётся; + запасной вариант — `%APPDATA%\phymlGUI` на Windows и + `$XDG_CONFIG_HOME/phymlGUI` (по умолчанию `~/.config/phymlGUI`) на Linux. + AppImage монтируется только для чтения, поэтому там всегда работает запасной + вариант. +- MPI: по умолчанию `mpiexec` на Windows и `mpirun` на Linux. Значение + `mpiexec` из конфига, перенесённого с Windows, на Linux заменяется на + `mpirun`, если `mpiexec` не найден. Без OpenMPI проверка перед запуском даёт + понятную ошибку (`val_no_mpiexec` с именем команды). +- `tests.yml`: к заданию на `windows-latest` добавляется `ubuntu-22.04` + (Python 3.11 и 3.13, offscreen Qt, системные пакеты для Qt). + +## 3. Сторонние инструменты + +`packaging/third_party.json` получает секции `windows` и `linux`; у каждого +инструмента — версия, источник, SHA256 и способ получения (`download`, +`extract`, `build`). + +| Инструмент | Windows | Linux | +|---|---|---| +| IQ-TREE 2.4.0 | официальный zip (закреплён) | официальный архив Linux x86-64 | +| MUSCLE 5.3 | официальный exe (закреплён) | официальный бинарник linux x86 | +| RAxML-NG 2.0.3 | сборка MSYS2 UCRT64 по рецепту спайка + patch | официальный zip | +| PhyML | `phyml-mpi.exe` из релиза phymlGUI v1.2, закреплён по SHA256 | сборка из закреплённого тега исходников: `phyml` и `phyml-mpi` (OpenMPI) | + +- Рецепты сборки — `packaging/build_raxml_windows.sh`, + `packaging/build_phyml_linux.sh`; их можно запускать локально. +- `scripts/fetch_third_party.py --platform {windows,linux} --dest bin` + выполняет загрузки и сборки по манифесту; проверка SHA256 до записи в `dest` + сохраняется. +- Лицензии: `packaging/licenses/` (GPL для PhyML, IQ-TREE, MUSCLE; AGPL-3.0 для + RAxML-NG) кладётся в оба пакета. + +## 4. Упаковка + +- `packaging/phymlgui.spec` (в git) — PyInstaller, режим onedir, общий для обеих + платформ; включает `locales.json`, `icon.png`. Старый `phymlgui.spec` из + `.gitignore` удаляется из списка игнорируемых и заменяется этим. +- Версия: тег `vX.Y.Z` → `X.Y.Z` записывается в `phyml_core/__init__.py` + `__version__` во время сборки (файл в репозитории не меняется). + +Windows — `phymlGUI-X.Y.Z-windows-x64.zip`: + +``` +phymlGUI/ phymlgui.exe _internal/ bin/{phyml-mpi.exe, iqtree2.exe, libiomp5md.dll, muscle.exe, raxml-ng.exe} licenses/ README.txt +``` + +Linux — `phymlGUI-X.Y.Z-x86_64.AppImage` (собирается `appimagetool` на +ubuntu-22.04, glibc 2.35): + +``` +AppDir/ AppRun phymlgui.desktop phymlgui.png usr/bin/{phymlgui, _internal/, bin/{phyml, phyml-mpi, iqtree2, muscle, raxml-ng}} usr/share/licenses/phymlgui/ +``` + +Без аргументов — окно; `--file`/`--batch` — консольный режим (тот же файл +работает на серверах). + +## 5. Workflow `release.yml` + +Триггеры: `push` тега `v*` и `workflow_dispatch` (пробная сборка без +публикации). Задания: + +1. `tests` — переиспользует `tests.yml` (Windows и Linux). +2. `tools-windows` — RAxML-NG через MSYS2 + загрузки → артефакт `bin-windows`. +3. `tools-linux` — PhyML/PhyML-MPI из исходников (`libopenmpi-dev`) + загрузки → + артефакт `bin-linux`. +4. `raxml-parity` — сверка Windows-сборки RAxML-NG с официальной Linux-сборкой + (деревья, бутстреп-реплики, lnL на фиксированном дереве) на тестовых данных + из `tests/data`; расхождение роняет workflow. +5. `package-windows`, `package-linux` — PyInstaller → zip / AppImage → дымовой + тест готового пакета: `--version`; CLI `--file` на невыровненном FASTA через + встроенные MUSCLE и PhyML (последовательный), отдельно IQ-TREE; проверяется, + что дерево создано; на Linux — ещё MPI-прогон через OpenMPI раннера и запуск + AppImage в контейнере `ubuntu:22.04` без дополнительных пакетов (кроме FUSE + или `--appimage-extract-and-run`); окно открывается offscreen и + закрывается. +6. `release` — только по тегу: **черновик** релиза с zip, AppImage, + `SHA256SUMS`, `raxml-ng-2.0.3-source+patch.tar.gz` и описанием с версиями + вложенных инструментов. + +Защита: тег не формата `vX.Y.Z[-suffix]` роняет workflow до сборки; ручной +запуск ничего не публикует; сборки инструментов кэшируются по SHA256 из +манифеста. + +## 6. Вне рамок + +Движок RAxML-NG в приложении («Наука»); подпись файлов, MSI, `.deb`, Flatpak; +проверка обновлений; macOS и ARM. + +## 7. Критерии готовности + +1. Полный набор тестов проходит в CI на Windows и на ubuntu-22.04. +2. `workflow_dispatch` собирает оба пакета; все дымовые тесты, MPI на Linux и + сверка RAxML-NG зелёные. +3. Тестовый тег (`v2.0.0-rc1`) создаёт черновик релиза со всеми файлами и + `SHA256SUMS`; публикация только вручную. +4. AppImage работает на чистой Ubuntu 22.04 (контейнер в CI): окно открывается, + последовательный PhyML выполняется. +5. В обоих пакетах есть `licenses/`; исходники RAxML-NG с patch'ем приложены к + релизу. + +## 8. Риски + +- Сборка PhyML из исходников под Linux может потребовать правок — это первая + задача плана; при неудаче — сообщить пользователю. +- AppImage около 200–300 МБ из-за Qt — приемлемо. +- Происхождение `phyml-mpi.exe` v1.2 известно только как «ваш прошлый релиз»; + закрепляем его хешем, пересборка под Windows вне рамок. From ac28dc4df06fece2dfedabd7b4a2090fc8dc310c Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 09:21:56 +0300 Subject: [PATCH 02/25] Add the Release implementation plan (8 tasks) Co-Authored-By: Claude Opus 5.5 --- docs/superpowers/plans/2026-10-31-release.md | 158 +++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 docs/superpowers/plans/2026-10-31-release.md diff --git a/docs/superpowers/plans/2026-10-31-release.md b/docs/superpowers/plans/2026-10-31-release.md new file mode 100644 index 0000000..26b9a1d --- /dev/null +++ b/docs/superpowers/plans/2026-10-31-release.md @@ -0,0 +1,158 @@ +# Релиз — план реализации + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** по тегу `v*` GitHub Actions собирает Windows-zip и Linux-AppImage со всеми программами анализа, проверяет их и создаёт черновик релиза. + +**Architecture:** приложение получает небольшой слой кроссплатформенности; сторонние программы описаны в одном манифесте по платформам и собираются/скачиваются скриптами из `packaging/`; один `release.yml` проходит тесты → инструменты → упаковка → дымовые тесты → черновик. + +**Tech Stack:** Python ≥ 3.11, PySide6, PyInstaller ≥ 6, appimagetool, MSYS2 UCRT64, autotools + OpenMPI, GitHub Actions (`windows-latest`, `ubuntu-22.04`). + +**Spec:** [docs/superpowers/specs/2026-10-31-release-design.md](../specs/2026-10-31-release-design.md) + +## Global Constraints + +- `phyml_core` не импортирует PySide6. +- Тесты не трогают настоящий конфиг/историю пользователя; весь набор зелёный на Windows и ubuntu-22.04. +- Задачи 1–3 и 6 (Linux) выполняются без субагентов (пожелание пользователя). +- Релиз по тегу — только **черновик**; `workflow_dispatch` ничего не публикует; push и теги — только с явного «да» пользователя. +- Каждый скачиваемый файл закреплён SHA256 в `packaging/third_party.json`; проверка до записи в `dest`. +- Ветка `release`; сообщения коммитов — английское предложение + `Co-Authored-By: Claude Opus 5.5 `. + +### Закреплённые значения (проверены 2026-10-31) + +| Платформа / инструмент | URL | SHA256 | Что берём | +|---|---|---|---| +| linux IQ-TREE 2.4.0 | `https://github.com/iqtree/iqtree2/releases/download/v2.4.0/iqtree-2.4.0-Linux-intel.tar.gz` | `49c58e26f192dd5e0045110cee0af151203dfa0bd79fa03d01fcfc3e44ca2f1b` | `iqtree-2.4.0-Linux-intel/bin/iqtree2` → `iqtree2` | +| linux MUSCLE 5.3 | `https://github.com/rcedgar/muscle/releases/download/v5.3/muscle-linux-x86.v5.3` | `318abeb951d786a3e2532714cc81ad3b3d8f79a2b517dc31316eeb5b694db2bc` | → `muscle` (chmod +x) | +| linux RAxML-NG 2.0.3 | `https://github.com/amkozlov/raxml-ng/releases/download/2.0.3/raxml-ng_v2.0.3_linux_x86_64.zip` | `d660cebe2a083de6c20d9354968803b8fd10be206f625be2393997d0abe98105` | `raxml-ng` | +| linux PhyML (исходники) | `https://github.com/stephaneguindon/phyml/archive/refs/tags/v3.3.20260528.tar.gz` | `42451c46de7cd01f8ca67d657766acf5b02f61027127bdda87efe3cdb422b297` | сборка → `phyml`, `phyml-mpi` | +| windows PhyML-MPI | `https://github.com/adrobi/phymlGUI/releases/download/v1.2/phymlGUI-1.2-win64.zip` | `4258578f2772fe5958513275cd7a64b6230d90795477b55ab156487bf0b08459` | `phymlGUI-1.2/phyml-mpi.exe` (SHA256 файла `4d1f57dd24ddc5718dd20b70dd2367688fa1fd5a8cf701a8ea7dafc6cb6107f7`) | +| windows RAxML-NG (исходники) | `https://github.com/amkozlov/raxml-ng/releases/download/2.0.3/raxml-ng_v2.0.3_source.zip` | `7cd3fa6b1de373777d688032c9ec6731078b67e6a812d7a1d779295d016843d2` | сборка по спайку → `raxml-ng.exe` | +| windows IQ-TREE, MUSCLE | как сейчас в `third_party.json` | как сейчас | как сейчас | + +## Review Focus + +1. **AppImage на машине без OpenMPI** — включённый MPI даёт понятную ошибку до старта, последовательный режим работает. Тест: Task 2 (`test_validate_mpirun_missing_on_linux`). +2. **Конфиг, перенесённый с Windows на Linux** (`mpirun_path: "mpiexec"`, пути `C:\...`) — окно открывается, `mpiexec` → `mpirun`, неверные пути дают ошибку «не найден», а не падение. Тест: Task 2 (`test_windows_config_loads_on_linux`). +3. **Только-чтение папки приложения в AppImage** — настройки уходят в `~/.config/phymlGUI` (или `$XDG_CONFIG_HOME`). Тест: Task 2 (`test_detect_falls_back_to_xdg_on_linux`). +4. **Пути с пробелами и кириллицей в Linux** (`/home/user/Мои данные/`). Тест: Task 3 — существующий `test_run_in_cyrillic_dir_with_spaces` должен проходить на ubuntu. +5. **Тег не того формата / повторный запуск по тегу** — workflow падает до сборки, черновик не дублируется. Тест: Task 8 (`test_release_tag_validation` для `packaging/release_meta.py`). + +--- + +## Файловая структура + +| Файл | Ответственность | +|---|---| +| `phyml_core/utils.py` | `exe_name`, `IS_WINDOWS`, `default_mpirun()` | +| `phyml_core/paths.py` | XDG-запасной вариант, `which` в `find_tool` | +| `phyml_ui/main_window.py`, `phyml_ui/themes.py` | «Открыть папку», тема на Linux | +| `packaging/third_party.json` | манифест по платформам | +| `packaging/build_phyml_linux.sh`, `packaging/build_raxml_windows.sh` | сборочные рецепты | +| `packaging/patches/raxml-ng-2.0.3-windows.patch` | копия patch'а из спайка (LF) | +| `packaging/licenses/` | тексты лицензий | +| `scripts/fetch_third_party.py` | `--platform`, шаг `build` | +| `packaging/phymlgui.spec` | PyInstaller onedir | +| `packaging/package.py` | сборка zip/AppDir, подстановка версии | +| `packaging/appimage/` | `AppRun`, `phymlgui.desktop` | +| `packaging/smoke_test.py` | дымовой тест готового пакета | +| `packaging/raxml_parity.py` | сверка RAxML-NG Windows vs Linux | +| `packaging/release_meta.py` | проверка тега, `SHA256SUMS`, текст релиза | +| `.github/workflows/tests.yml`, `.github/workflows/release.yml` | CI и релиз | + +--- + +### Task 1 (Linux, без субагентов): рецепт сборки PhyML под Linux + +**Files:** Create `packaging/build_phyml_linux.sh`. + +**Interfaces:** Produces: `bash packaging/build_phyml_linux.sh ` → `/phyml`, `/phyml-mpi` (исполняемые). Требует `autoconf automake libtool pkg-config libopenmpi-dev openmpi-bin`. + +- [ ] **Step 1:** Написать скрипт: распаковка во временную папку; `./autogen.sh`; `./configure --enable-phyml && make -j && cp src/phyml`; `make clean`; `./configure --enable-phyml-mpi && make -j && cp src/phyml-mpi` (без `--enable-native`, чтобы бинарник был переносимым). +- [ ] **Step 2: Проверить в WSL Ubuntu** (`wsl -d Ubuntu-26.04`, при необходимости `sudo apt install` — пароль вводит пользователь в своём терминале): оба бинарника собираются; `phyml --version` выводит версию; `mpirun -np 2 phyml-mpi -i tests/data/...phy -b 4` завершается с кодом 0 на PHYLIP из `tests/data` (сконвертировать `cytb` FASTA через `phyml_core.alignment.write_phylip`). +- [ ] **Step 3:** Если сборка требует правок исходников — остановиться и сообщить пользователю (риск из спецификации §8). +- [ ] **Step 4: Коммит** — `git commit -m "Add a Linux build recipe for PhyML and PhyML-MPI"` + +### Task 2 (Linux, без субагентов): кроссплатформенность приложения + +**Files:** Modify `phyml_core/utils.py`, `phyml_core/paths.py`, `phyml_core/settings.py`, `phyml_core/engines/{phyml,iqtree}.py`, `phyml_core/runner.py`, `phyml_ui/main_window.py`, `phyml_ui/themes.py`. Test: `tests/unit/test_platform.py`, дополнения в `tests/unit/test_paths.py`, `tests/unit/test_engine_phyml.py`, `tests/gui/test_main_window.py`. + +**Interfaces:** +- Produces: `utils.IS_WINDOWS: bool` (`os.name == 'nt'`); `utils.exe_name(base: str) -> str`; `utils.default_mpirun() -> str` (`'mpiexec'` на Windows, `'mpirun'` иначе); `AppPaths.find_tool` — после `bin/` пробует `shutil.which(name)`; `AppPaths.detect(..., platform: str | None = None)` — запасной вариант `APPDATA/phymlGUI` (win) или `$XDG_CONFIG_HOME/phymlGUI` → `~/.config/phymlGUI` (иначе). +- Движки: `PhyML.EXECUTABLE_NAMES` и `IqTree.EXECUTABLE_NAMES`, `runner.MUSCLE_NAMES` строятся через `exe_name`. Значение `mpirun_path` `'mpiexec'` на не-Windows при отсутствии `mpiexec` в PATH заменяется на `default_mpirun()` в `settings.from_disk`. + +- [ ] **Step 1: Падающие тесты** — `test_exe_name_per_platform` (monkeypatch `utils.IS_WINDOWS`), `test_find_tool_falls_back_to_path`, `test_detect_falls_back_to_xdg_on_linux` (`platform='linux'`, `env={'XDG_CONFIG_HOME': tmp}` → `tmp/phymlGUI`; без переменной → `~/.config/phymlGUI` с `HOME=tmp`), `test_validate_mpirun_missing_on_linux` (`use_mpi=True`, `mpirun_path='mpirun'`, `which` → None → `Issue('error','val_no_mpiexec',('mpirun',))`), `test_windows_config_loads_on_linux` (конфиг с `mpirun_path: "mpiexec"`, `phyml_path: "C:\\x\\phyml-mpi.exe"` → `from_disk` на linux даёт `mpirun`, `validate` даёт `val_no_exe` без исключений), `test_open_output_dir_uses_qdesktopservices_off_windows` (GUI, monkeypatch `QDesktopServices.openUrl`), `test_system_theme_without_winreg` (возвращает `'light'`/`'dark'` по палитре). +- [ ] **Step 2:** Запуск — FAIL. +- [ ] **Step 3:** Реализация по Interfaces; `themes.system_theme()` на не-Windows: `QGuiApplication.palette().window().color().lightness() < 128` → `'dark'` (если приложения ещё нет — `'light'`). +- [ ] **Step 4:** `python -m pytest -q -rs` на Windows — всё зелёное; тот же набор — в WSL Ubuntu (Task 3 даёт окружение). +- [ ] **Step 5: Коммит** — `git commit -m "Make the app portable to Linux: tool names, data dir, mpirun, open folder, theme"` + +### Task 3 (Linux, без субагентов): тесты на ubuntu-22.04 + +**Files:** Modify `.github/workflows/tests.yml`, `tests/conftest.py` (имена бинарников через `exe_name`), README (en/ru) — раздел про Linux. + +- [ ] **Step 1:** Матрица `os: [windows-latest, ubuntu-22.04] × python: ['3.11','3.13']`; на ubuntu — `sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3 libfontconfig1 openmpi-bin` и `python scripts/fetch_third_party.py --platform linux --only iqtree,muscle --dest bin`; `QT_QPA_PLATFORM=offscreen`. +- [ ] **Step 2:** Прогнать весь набор локально в WSL Ubuntu (venv, `pip install -r requirements.txt -r requirements-dev.txt`) — Expected: всё зелёное, пропуски только `needs_phyml`/`needs_mpi`. +- [ ] **Step 3: Коммит** — `git commit -m "Run the test suite on ubuntu-22.04 in CI"` + +### Task 4: манифест по платформам и сборочные шаги + +**Files:** Modify `packaging/third_party.json`, `scripts/fetch_third_party.py`, `tests/unit/test_fetch_third_party.py`. Create `packaging/build_raxml_windows.sh`, `packaging/patches/raxml-ng-2.0.3-windows.patch` (копия из `docs/superpowers/spikes/...`, LF), `packaging/licenses/{PhyML,IQ-TREE,MUSCLE}-GPL-3.0.txt`, `RAxML-NG-AGPL-3.0.txt`, `README.md` (что и откуда). + +**Interfaces:** +- `third_party.json`: `{"windows": {...}, "linux": {...}}`; у записи поля `version`, `url`, `sha256` и одно из `extract` (zip/tar.gz → {член: имя}), `save_as`, `build` (`{"script": "packaging/build_….sh"}`, скрипт получает путь к скачанному архиву и `dest`); `mode: "755"` для Linux-файлов. +- `fetch(name, spec, dest) -> list[str]` — как сейчас + tar.gz + `build` + `mode`; `main(argv)` получает `--platform {windows,linux}` (по умолчанию — текущая). +- `build_raxml_windows.sh ` — рецепт спайка (UCRT64, 4 флага CMake, `git apply` patch'а) → `/raxml-ng.exe`. + +- [ ] **Step 1: Падающие тесты** — `test_fetch_extracts_tar_gz_member`, `test_fetch_runs_build_script` (скрипт-заглушка пишет файл в dest), `test_fetch_sets_mode_on_posix` (skip на Windows), `test_manifest_has_both_platforms_and_valid_hashes` (каждая запись: 64 hex, https-URL). +- [ ] **Step 2:** FAIL → реализация → PASS. +- [ ] **Step 3: Проверка рецепта RAxML-NG** локально в MSYS2: `bash packaging/build_raxml_windows.sh /tmp/out` → `raxml-ng.exe --version` выводит `2.0.3`. +- [ ] **Step 4: Коммит** — `git commit -m "Describe third-party tools per platform and add build steps"` + +### Task 5: PyInstaller и Windows-zip + +**Files:** Create `packaging/phymlgui.spec`, `packaging/package.py`, `packaging/smoke_test.py`; Modify `.gitignore` (убрать `phymlgui.spec`), `requirements-dev.txt` (`pyinstaller>=6`). Test: `tests/unit/test_package.py`. + +**Interfaces:** +- `package.py`: `version_from_tag(tag: str) -> str` (`v2.0.0` → `2.0.0`, `v2.0.0-rc1` → `2.0.0-rc1`, иначе `ValueError`); `stamp_version(version, init_path)` — переписывает `__version__` во временной копии для сборки; `build_windows(version, bin_dir, out_dir) -> str` (путь к zip `phymlGUI-{version}-windows-x64.zip`, раскладка из спецификации §4); `build_appdir(version, bin_dir, out_dir) -> str` (Task 6). +- `smoke_test.py`: `main(argv)` — `--package ` распаковывает во временную папку и выполняет: `--version` содержит версию; CLI `--file ` с `engine=phyml` (последовательный, `support_method=-4`) и с `engine=iqtree` → exit 0 и файл дерева существует; offscreen-запуск окна (`--smoke-gui`, открыть и закрыть через `QTimer`) → exit 0; `--mpi` дополнительно запускает PhyML-MPI (только Linux). +- В приложение добавляется `--version` (CLI печатает `phymlGUI X.Y.Z`) и скрытый `--smoke-gui`. + +- [ ] **Step 1: Падающие тесты** — `test_version_from_tag` (три случая выше + `'2.0.0'` без `v` → `ValueError`), `test_stamp_version_does_not_touch_repo_file`, `test_cli_version_flag`. +- [ ] **Step 2:** FAIL → реализация → PASS. +- [ ] **Step 3:** Локально: `python scripts/fetch_third_party.py --platform windows --dest bin` → `python packaging/package.py windows --version 0.0.0-dev --bin bin --out dist` → `python packaging/smoke_test.py --package dist/phymlGUI-0.0.0-dev-windows-x64.zip` — Expected: все проверки OK. +- [ ] **Step 4: Коммит** — `git commit -m "Package the Windows zip with PyInstaller and smoke-test it"` + +### Task 6 (Linux, без субагентов): AppImage + +**Files:** Create `packaging/appimage/AppRun`, `packaging/appimage/phymlgui.desktop`; Modify `packaging/package.py` (`build_appdir`, `build_appimage(version, bin_dir, out_dir, appimagetool) -> str`), `packaging/smoke_test.py` (AppImage: `--appimage-extract-and-run`). + +- [ ] **Step 0:** Закрепить `appimagetool`: взять последний **тегированный** (не `continuous`) релиз `AppImage/appimagetool` x86_64 через GitHub API, скачать, посчитать SHA256 и записать в `third_party.json` → `build_tools.appimagetool` (`url`, `sha256`, `mode: "755"`). +- [ ] **Step 1:** `AppRun`: `exec "$APPDIR/usr/bin/phymlgui" "$@"` с `HERE`-определением; `.desktop`: `Name=phymlGUI`, `Exec=phymlgui`, `Icon=phymlgui`, `Categories=Science;Biology;`. +- [ ] **Step 2:** В WSL Ubuntu: `fetch --platform linux`, PyInstaller, `build_appimage` (appimagetool, закреплённый по SHA256 в `third_party.json` секции `build_tools`), затем `smoke_test.py --package dist/phymlGUI-0.0.0-dev-x86_64.AppImage --mpi` — Expected: все проверки OK. +- [ ] **Step 3:** Проверка в чистом контейнере `ubuntu:22.04` (в CI, Task 8) — локально, если в WSL есть docker; иначе отметить, что проверяется в CI. +- [ ] **Step 4: Коммит** — `git commit -m "Build and smoke-test the Linux AppImage"` + +### Task 7: сверка RAxML-NG + +**Files:** Create `packaging/raxml_parity.py`; Test: `tests/unit/test_raxml_parity.py`. + +**Interfaces:** `compare(win_dir: str, lin_dir: str) -> list[str]` — список расхождений (пустой = совпало) по правилам спайка: lnL `|Δ| < 1e-3`, RF лучших деревьев = 0, бутстреп-реплики одинаковы, lnL на фиксированном дереве совпадает до 6 знаков; `main(argv)` — `--win --linux --data tests/data` запускает оба на одинаковых входах (`--seed 42`), возвращает 1 при расхождениях. + +- [ ] **Step 1: Падающие тесты** `compare` на синтетических файлах вывода (совпадают → `[]`; другой bestTree → 1 расхождение с именем файла). +- [ ] **Step 2:** FAIL → реализация → PASS. Локальная проверка: Windows-сборка из Task 4 против Linux-бинарника в WSL — `[]`. +- [ ] **Step 3: Коммит** — `git commit -m "Add the RAxML-NG Windows vs Linux parity check"` + +### Task 8: release.yml и черновик релиза + +**Files:** Create `.github/workflows/release.yml`, `packaging/release_meta.py`; Test: `tests/unit/test_release_meta.py`. + +**Interfaces:** `release_meta.py`: `check_tag(tag: str) -> str` (через `version_from_tag`); `write_sha256sums(files: list[str], out: str) -> None` (формат `sha256␠␠имя`); `release_notes(version: str, manifest: dict) -> str` (список вложенных инструментов с версиями, требование MS-MPI/OpenMPI для MPI). + +- [ ] **Step 1: Падающие тесты** — `test_release_tag_validation` (`v2.0.0` ok; `release-1`, `v2`, `2.0.0` → ошибка), `test_sha256sums_format`, `test_release_notes_lists_tools`. +- [ ] **Step 2:** FAIL → реализация → PASS. +- [ ] **Step 3:** `release.yml` по спецификации §5: `on: push: tags: ['v*']` и `workflow_dispatch`; задания `tests` (`uses: ./.github/workflows/tests.yml`, для этого добавить `on: workflow_call` в tests.yml), `tools-windows`, `tools-linux` (ubuntu-22.04), `raxml-parity` (needs both; скачивает артефакты; Linux-бинарник запускается на ubuntu, Windows — на windows, вывод сравнивается в третьем шаге), `package-windows`, `package-linux` (+ шаг `docker run --rm -v ... ubuntu:22.04` с `--appimage-extract-and-run`), `release` (`if: startsWith(github.ref, 'refs/tags/v')`, `gh release create "$TAG" --draft --title ... --notes-file ...` + файлы + `SHA256SUMS` + `raxml-ng-2.0.3-source+patch.tar.gz`; если черновик для тега уже есть — `gh release upload --clobber` вместо create); `permissions: contents: write` только у `release`; `concurrency: release-${{ github.ref }}`; кэш инструментов по `hashFiles('packaging/third_party.json')`; у всех заданий `timeout-minutes`. +- [ ] **Step 4:** Локально: `python -m pytest -q -rs` — зелёный. +- [ ] **Step 5: Коммит** — `git commit -m "Add the release workflow: tools, packages, smoke tests, draft release"` +- [ ] **Step 6: Только после «да» пользователя** — push ветки `release`, ручной запуск `workflow_dispatch` (Expected: все задания зелёные, черновика нет); затем, по отдельному «да», тег `v2.0.0-rc1` → черновик релиза с zip, AppImage, `SHA256SUMS`, исходниками RAxML-NG (критерий 3). From b898ed7355504f0d713afb71f9d442aed264b703 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:10:42 +0300 Subject: [PATCH 03/25] Add a Linux build recipe for PhyML and PhyML-MPI Built and verified in Ubuntu: both binaries build from the v3.3.20260528 sources, a serial aLRT run and a 2-process MPI bootstrap run finish with exit 0. Single-threaded make: parallel builds crashed GCC with an internal compiler error in evolve.c. *.sh files are kept LF for Linux runners. Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 1 + packaging/build_phyml_linux.sh | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 packaging/build_phyml_linux.sh diff --git a/.gitattributes b/.gitattributes index 721c5e1..d9b8307 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ # patches are applied to upstream LF sources: never convert their line endings *.patch text eol=lf +*.sh text eol=lf diff --git a/packaging/build_phyml_linux.sh b/packaging/build_phyml_linux.sh new file mode 100644 index 0000000..ab4fbcd --- /dev/null +++ b/packaging/build_phyml_linux.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Build PhyML (serial) and PhyML-MPI (OpenMPI) from a source tarball. +# Usage: build_phyml_linux.sh +# Needs: build-essential autoconf automake libtool pkg-config libopenmpi-dev +set -euo pipefail + +src_archive=$(readlink -f "$1") +dest=$(mkdir -p "$2" && readlink -f "$2") +work=$(mktemp -d) +trap 'rm -rf "$work"' EXIT + +tar -xzf "$src_archive" -C "$work" +cd "$work"/phyml-* + +# the release tarball ships a stale configured tree: regenerate from scratch +make distclean >/dev/null 2>&1 || true +sh ./autogen.sh + +# no --enable-native: the binaries must run on any x86-64 CPU. +# Single-threaded make: parallel builds crashed GCC (internal compiler error +# in evolve.c) on Ubuntu 26.04; -j1 is reliable everywhere. +./configure --enable-phyml +make -j1 +install -m 755 src/phyml "$dest/phyml" + +make distclean >/dev/null +./configure --enable-phyml-mpi +make -j1 +install -m 755 src/phyml-mpi "$dest/phyml-mpi" + +echo "built: $dest/phyml $dest/phyml-mpi" From 2d964fcc98a782369b200de1c32edc5510533291 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:14:39 +0300 Subject: [PATCH 04/25] Make the app portable to Linux: tool names, data dir, mpirun, open folder, theme Co-Authored-By: Claude Opus 5.5 --- phyml_core/engines/iqtree.py | 5 +-- phyml_core/engines/phyml.py | 10 +++--- phyml_core/paths.py | 21 ++++++++--- phyml_core/runner.py | 6 ++-- phyml_core/settings.py | 5 +++ phyml_core/utils.py | 13 +++++++ phyml_ui/main_window.py | 11 +++--- phyml_ui/themes.py | 15 +++++++- tests/gui/test_main_window.py | 14 ++++++++ tests/gui/test_themes.py | 19 ++++++++++ tests/unit/test_platform.py | 68 +++++++++++++++++++++++++++++++++++ 11 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 tests/unit/test_platform.py diff --git a/phyml_core/engines/iqtree.py b/phyml_core/engines/iqtree.py index c800561..b4e8d21 100644 --- a/phyml_core/engines/iqtree.py +++ b/phyml_core/engines/iqtree.py @@ -5,12 +5,13 @@ from ..launchers import Mpi, Native from ..paths import AppPaths +from ..utils import exe_name from .base import Engine, EngineOutputs, Issue, param_text, positive_int NT_MODELS = ("MFP", "GTR+F+G4", "HKY+F+G4", "TIM2+F+G4", "TVM+F+G4") AA_MODELS = ("MFP", "LG+G4", "WAG+G4", "JTT+G4", "mtREV+G4") -EXECUTABLE_NAMES = ('iqtree2.exe',) +EXECUTABLE_BASES = ('iqtree2',) UFBOOT_MIN_REPLICATES = 1000 @@ -87,7 +88,7 @@ def normalize(self, params: dict) -> Tuple[dict, List[Issue]]: return normalized, notes def executable(self, params: dict, paths: AppPaths) -> str: - return paths.find_tool(params.get('iqtree_path', ''), EXECUTABLE_NAMES) + return paths.find_tool(params.get('iqtree_path', ''), tuple(exe_name(b) for b in EXECUTABLE_BASES)) def command(self, exe: str, phylip: str, params: dict) -> List[str]: argv = [exe, '-s', phylip, '--prefix', _prefix(phylip), '-redo', diff --git a/phyml_core/engines/phyml.py b/phyml_core/engines/phyml.py index 67dcae1..4b054c3 100644 --- a/phyml_core/engines/phyml.py +++ b/phyml_core/engines/phyml.py @@ -6,7 +6,7 @@ from ..launchers import Mpi, Native from ..paths import AppPaths -from ..utils import is_mpi_binary +from ..utils import default_mpirun, exe_name, is_mpi_binary from .base import (Engine, EngineOutputs, Issue, param_text, parse_decimal, positive_int, positive_number) @@ -14,7 +14,7 @@ AA_MODELS = ("LG", "WAG", "JTT", "MtREV", "Dayhoff", "DCMut", "RtREV", "CPREV", "VT", "Blosum62", "MtMam", "MtArt", "HIVw", "HIVb", "custom") -EXECUTABLE_NAMES = ('phyml-mpi.exe', 'phyml.exe') +EXECUTABLE_BASES = ('phyml-mpi', 'phyml') def parse_phyml_stats(stats_path: str) -> dict: @@ -73,7 +73,7 @@ def validate(self, params: dict, paths: AppPaths) -> List[Issue]: issues.append(Issue('error', 'mpi_boot_msg')) if use_mpi: - mpiexec = param_text(params, 'mpirun_path', 'mpiexec') or 'mpiexec' + mpiexec = param_text(params, 'mpirun_path', default_mpirun()) or default_mpirun() if not _mpiexec_found(mpiexec): issues.append(Issue('error', 'val_no_mpiexec', (mpiexec,))) @@ -102,7 +102,7 @@ def normalize(self, params: dict) -> Tuple[dict, List[Issue]]: return dict(params), [] def executable(self, params: dict, paths: AppPaths) -> str: - return paths.find_tool(params.get('phyml_path', ''), EXECUTABLE_NAMES) + return paths.find_tool(params.get('phyml_path', ''), tuple(exe_name(b) for b in EXECUTABLE_BASES)) def command(self, exe: str, phylip: str, params: dict) -> List[str]: argv = [exe, '-i', phylip, @@ -135,5 +135,5 @@ def launcher(self, params: dict) -> Union[Native, Mpi]: """Call validate() first: a bad mpi_np raises ValueError here.""" if not params.get('use_mpi', False): return Native() - mpiexec = param_text(params, 'mpirun_path', 'mpiexec') or 'mpiexec' + mpiexec = param_text(params, 'mpirun_path', default_mpirun()) or default_mpirun() return Mpi((mpiexec and shutil.which(mpiexec)) or mpiexec, int(param_text(params, 'mpi_np', '2'))) diff --git a/phyml_core/paths.py b/phyml_core/paths.py index 5ffd95a..1caefd1 100644 --- a/phyml_core/paths.py +++ b/phyml_core/paths.py @@ -1,5 +1,6 @@ """Where phymlGUI keeps its program files and its user data (no Qt, no cwd dependence).""" import os +import shutil import sys import tempfile from dataclasses import dataclass @@ -82,7 +83,8 @@ def from_stored(self, stored: str) -> str: def find_tool(self, stored: str, names: tuple) -> str: """The configured tool if it exists, else the first of names in bin/, else the - configured path again (so the error message names what the user set).""" + first of names on PATH, else the configured path again (so the error message + names what the user set).""" configured = self.from_stored(stored) if configured and os.path.isfile(configured): return configured @@ -90,15 +92,22 @@ def find_tool(self, stored: str, names: tuple) -> str: candidate = os.path.join(self.bin_dir, name) if os.path.isfile(candidate): return candidate + for name in names: + found = shutil.which(name) + if found: + return found return configured @classmethod def detect(cls, env: Optional[Mapping[str, str]] = None, is_writable: Optional[Callable[[str], bool]] = None, - app_dir: Optional[str] = None) -> 'AppPaths': + app_dir: Optional[str] = None, + platform: Optional[str] = None) -> 'AppPaths': """Pick the data folder: $PHYMLGUI_DATA_DIR, then app_dir if writable, then - %APPDATA%\\phymlGUI. The chosen folder is created.""" + %APPDATA%\\phymlGUI on Windows or $XDG_CONFIG_HOME/phymlGUI (~/.config/phymlGUI) + elsewhere, e.g. inside a read-only AppImage. The chosen folder is created.""" env = os.environ if env is None else env + platform = os.name if platform is None else platform is_writable = is_writable or _dir_is_writable app = default_app_dir() if app_dir is None else app_dir override = env.get(DATA_DIR_ENV) @@ -106,8 +115,12 @@ def detect(cls, env: Optional[Mapping[str, str]] = None, data = override elif is_writable(app): data = app - else: + elif platform == 'nt': base = env.get('APPDATA') or os.path.join(os.path.expanduser('~'), 'AppData', 'Roaming') data = os.path.join(base, APPDATA_SUBDIR) + else: + home = env.get('HOME') or os.path.expanduser('~') + base = env.get('XDG_CONFIG_HOME') or os.path.join(home, '.config') + data = os.path.join(base, APPDATA_SUBDIR) os.makedirs(data, exist_ok=True) return cls(app_dir=app, data_dir=data) diff --git a/phyml_core/runner.py b/phyml_core/runner.py index ca48122..6587cba 100644 --- a/phyml_core/runner.py +++ b/phyml_core/runner.py @@ -13,7 +13,7 @@ from dataclasses import dataclass, field from typing import Callable, List, Literal, Mapping, Optional, Tuple -from . import alignment +from . import alignment, utils from .alignment import AlignmentError from .engines import ENGINES from .engines.base import Engine, format_issue, param_text @@ -29,7 +29,7 @@ LEVELS = ('error', 'success', 'system', 'out') STATUSES = ('pending', 'running', 'ok', 'fail', 'cancelled') STAT_KEYS = ('model', 'taxa', 'lnL', 'gamma', 'tstv', 'time') -MUSCLE_NAMES = ('muscle.exe',) +MUSCLE_BASES = ('muscle',) KILL_TIMEOUT = 3.0 # seconds between terminate and kill _CREATION_FLAGS = subprocess.CREATE_NO_WINDOW if os.name == 'nt' else 0 @@ -218,7 +218,7 @@ def _process(self, fasta: str) -> Tuple[str, dict]: def _align(self, fasta: str) -> str: """Run MUSCLE (version 5 syntax, then version 3); returns the aligned file.""" - muscle = self._paths.find_tool(self._params.get('muscle_path') or '', MUSCLE_NAMES) + muscle = self._paths.find_tool(self._params.get('muscle_path') or '', tuple(utils.exe_name(b) for b in MUSCLE_BASES)) if not muscle or not os.path.isfile(muscle): raise _FileFailed(_t('err_muscle')) aligned = alignment.aligned_path(fasta) diff --git a/phyml_core/settings.py b/phyml_core/settings.py index 88289a2..3915ab1 100644 --- a/phyml_core/settings.py +++ b/phyml_core/settings.py @@ -8,6 +8,7 @@ from .i18n import _t from .paths import CONFIG_NAME, HISTORY_NAME, AppPaths +from . import utils from .utils import detect_cores SCHEMA_VERSION = 2 @@ -153,6 +154,10 @@ def from_disk(cfg: dict, paths: AppPaths) -> dict: out[key] = paths.from_stored(value) if isinstance(out.get('recent'), list): out['recent'] = [paths.from_stored(p) if isinstance(p, str) else p for p in out['recent']] + # a config carried over from Windows names MS-MPI's mpiexec; OpenMPI ships mpirun + if (not utils.IS_WINDOWS and out.get('mpirun_path') == 'mpiexec' + and shutil.which('mpiexec') is None): + out['mpirun_path'] = utils.default_mpirun() return out diff --git a/phyml_core/utils.py b/phyml_core/utils.py index f219d00..580bb65 100644 --- a/phyml_core/utils.py +++ b/phyml_core/utils.py @@ -9,6 +9,19 @@ psutil = None +IS_WINDOWS = os.name == 'nt' + + +def exe_name(base): + """Platform file name of a tool: 'muscle' -> 'muscle.exe' on Windows.""" + return base + '.exe' if IS_WINDOWS else base + + +def default_mpirun(): + """The MPI launcher looked up through PATH: MS-MPI's mpiexec or OpenMPI's mpirun.""" + return 'mpiexec' if IS_WINDOWS else 'mpirun' + + def resource_path(relative_path): """Absolute path to a bundled resource: inside the PyInstaller bundle when frozen, otherwise next to the program (never relative to the current working folder).""" diff --git a/phyml_ui/main_window.py b/phyml_ui/main_window.py index 5f62231..13643ea 100644 --- a/phyml_ui/main_window.py +++ b/phyml_ui/main_window.py @@ -6,10 +6,10 @@ from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QComboBox, QLineEdit, QPushButton, QMessageBox, QCheckBox, QSplitter, QScrollArea, QInputDialog, QApplication) -from PySide6.QtCore import Qt -from PySide6.QtGui import QIcon +from PySide6.QtCore import Qt, QUrl +from PySide6.QtGui import QDesktopServices, QIcon -from phyml_core import __version__, presets, report, settings +from phyml_core import __version__, presets, report, settings, utils from phyml_core.engines import ENGINES from phyml_core.engines.base import format_issue from phyml_core.history import HistoryStore, best_tree, new_record @@ -391,7 +391,10 @@ def _retry_failed(self): def _open_output_dir(self): if self._last_out_dir and os.path.isdir(self._last_out_dir): - os.startfile(self._last_out_dir) + if utils.IS_WINDOWS: + os.startfile(self._last_out_dir) + else: # xdg-open, also from inside an AppImage + QDesktopServices.openUrl(QUrl.fromLocalFile(self._last_out_dir)) # ---------- history ---------- diff --git a/phyml_ui/themes.py b/phyml_ui/themes.py index f55f885..14f191e 100644 --- a/phyml_ui/themes.py +++ b/phyml_ui/themes.py @@ -31,7 +31,20 @@ def system_theme(): return 'dark' if value == 0 else 'light' except OSError: pass - return 'light' + return 'light' + return _palette_theme() + + +def _palette_theme(): + """'dark' when the desktop's Qt palette has a dark window colour (Linux).""" + try: + from PySide6.QtGui import QGuiApplication + except ImportError: + return 'light' + app = QGuiApplication.instance() + if app is None: + return 'light' + return 'dark' if app.palette().window().color().lightness() < 128 else 'light' def system_accent(): diff --git a/tests/gui/test_main_window.py b/tests/gui/test_main_window.py index 917f65c..4e1fac0 100644 --- a/tests/gui/test_main_window.py +++ b/tests/gui/test_main_window.py @@ -1,4 +1,6 @@ """GUI behaviour of PhyMLApp that needs no analysis binaries.""" +import os + import pytest from PySide6.QtWidgets import QSizePolicy @@ -394,3 +396,15 @@ def cancel(): assert threading.main_thread() in callers, 'close() left the kill to a daemon thread' alive = [p.pid for p in procs if p.is_running()] assert alive == [], f'processes left after close: {alive}' + + +def test_open_output_dir_uses_qdesktopservices_off_windows(window, tmp_path, monkeypatch): + from PySide6.QtGui import QDesktopServices + from phyml_core import utils + opened = [] + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + monkeypatch.setattr(QDesktopServices, 'openUrl', staticmethod(lambda url: opened.append(url) or True)) + window._last_out_dir = str(tmp_path) + window._open_output_dir() + assert len(opened) == 1 + assert os.path.normcase(os.path.abspath(opened[0].toLocalFile())) == os.path.normcase(str(tmp_path)) diff --git a/tests/gui/test_themes.py b/tests/gui/test_themes.py index ddcc339..248e6b4 100644 --- a/tests/gui/test_themes.py +++ b/tests/gui/test_themes.py @@ -8,3 +8,22 @@ def test_resolve_qss_and_role_colors(): assert accent in qss and 'QPushButton#btn_run' in qss assert role_colors(theme, accent)['out'] == '#E6E8EB' assert system_theme() in ('light', 'dark') + + +def test_system_theme_without_winreg(qapp, monkeypatch): + """Off Windows the system theme follows the lightness of the Qt palette.""" + from PySide6.QtGui import QColor, QPalette + from phyml_ui import themes + monkeypatch.setattr(themes, 'winreg', None) + saved = qapp.palette() + try: + dark = QPalette(saved) + dark.setColor(QPalette.Window, QColor('#202124')) + qapp.setPalette(dark) + assert themes.system_theme() == 'dark' + light = QPalette(saved) + light.setColor(QPalette.Window, QColor('#F5F5F5')) + qapp.setPalette(light) + assert themes.system_theme() == 'light' + finally: + qapp.setPalette(saved) diff --git a/tests/unit/test_platform.py b/tests/unit/test_platform.py new file mode 100644 index 0000000..4b3b06c --- /dev/null +++ b/tests/unit/test_platform.py @@ -0,0 +1,68 @@ +"""Linux portability of the core: tool names, PATH lookup, data dir, mpirun.""" +import json +import os +import shutil + +from phyml_core import settings, utils +from phyml_core.engines.base import Issue +from phyml_core.engines.phyml import PhyML +from phyml_core.paths import AppPaths + + +def test_exe_name_per_platform(monkeypatch): + monkeypatch.setattr(utils, 'IS_WINDOWS', True) + assert utils.exe_name('muscle') == 'muscle.exe' + assert utils.default_mpirun() == 'mpiexec' + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + assert utils.exe_name('muscle') == 'muscle' + assert utils.default_mpirun() == 'mpirun' + + +def test_find_tool_falls_back_to_path(tmp_path, monkeypatch): + p = AppPaths(app_dir=str(tmp_path / 'app'), data_dir=str(tmp_path)) + on_path = str(tmp_path / 'usr' / 'muscle') + monkeypatch.setattr(shutil, 'which', lambda name, *a, **k: on_path if name == 'muscle' else None) + assert p.find_tool('', ('muscle',)) == on_path + # bin/ still wins over PATH + os.makedirs(p.bin_dir) + bundled = os.path.join(p.bin_dir, 'muscle') + open(bundled, 'w').close() + assert p.find_tool('', ('muscle',)) == bundled + + +def test_detect_falls_back_to_xdg_on_linux(tmp_path): + xdg = tmp_path / 'xdg' + p = AppPaths.detect(env={'XDG_CONFIG_HOME': str(xdg)}, is_writable=lambda d: False, + app_dir=str(tmp_path / 'app'), platform='posix') + assert p.data_dir == str(xdg / 'phymlGUI') and os.path.isdir(p.data_dir) + home = tmp_path / 'home' + p = AppPaths.detect(env={'HOME': str(home)}, is_writable=lambda d: False, + app_dir=str(tmp_path / 'app'), platform='posix') + assert p.data_dir == str(home / '.config' / 'phymlGUI') + + +def test_validate_mpirun_missing_on_linux(tmp_path, monkeypatch): + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + monkeypatch.setattr(shutil, 'which', lambda *a, **k: None) + exe = tmp_path / 'phyml-mpi' + exe.write_text('') + paths = AppPaths(app_dir=str(tmp_path), data_dir=str(tmp_path)) + params = dict(settings.DEFAULTS, phyml_path=str(exe), use_mpi=True, mpi_np='2', + mpirun_path='mpirun', support_method='bootstrap') + assert PhyML().validate(params, paths) == [Issue('error', 'val_no_mpiexec', ('mpirun',))] + # an empty field falls back to the platform default, mpirun + assert PhyML().validate(dict(params, mpirun_path=''), paths) == [ + Issue('error', 'val_no_mpiexec', ('mpirun',))] + + +def test_windows_config_loads_on_linux(tmp_path, monkeypatch): + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + monkeypatch.setattr(shutil, 'which', lambda *a, **k: None) + cfg_file = tmp_path / 'phyml_config.json' + cfg_file.write_text(json.dumps({'mpirun_path': 'mpiexec', + 'phyml_path': 'C:\\x\\phyml-mpi.exe'}), 'utf-8') + paths = AppPaths(app_dir=str(tmp_path / 'app'), data_dir=str(tmp_path)) + cfg = settings.from_disk(settings.load(str(cfg_file)), paths) + assert cfg['mpirun_path'] == 'mpirun' + issues = PhyML().validate(dict(cfg, mpi_np='2'), paths) + assert issues and issues[0].key == 'val_no_exe' From baa19e4288985e1738b83756c1e404c0b8eee648 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:30:17 +0300 Subject: [PATCH 05/25] Make the test suite pass on Linux and document Linux use The full suite (558 tests, incl. real PhyML/OpenMPI, IQ-TREE, MUSCLE runs) passes on Ubuntu as on Windows: conftest finds tools by platform name and on PATH, Windows-only test fakes got POSIX variants, and tests that check Windows semantics pin the platform. Co-Authored-By: Claude Opus 5.5 --- README.md | 6 +++-- tests/conftest.py | 24 +++++++++++--------- tests/gui/test_main_window_storage.py | 2 ++ tests/unit/fakes.py | 7 ++++++ tests/unit/test_engine_iqtree.py | 7 +++--- tests/unit/test_engine_phyml.py | 32 ++++++++++++++------------- tests/unit/test_paths.py | 4 ++-- 7 files changed, 50 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 65b3a6a..101f548 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,8 @@ * **Executables:** `phyml.exe` (or MPI version) and `muscle.exe`. * **Python packages:** Python 3.11+ with `PySide6`, `matplotlib`, `biopython` and `psutil` (`pip install -r requirements.txt`). * **MPI Environment:** For parallel mode, **Microsoft MPI** is required (install `msmpisetup.exe` from the official Microsoft GitHub). -* **Settings and history:** stored next to the exe when that folder is writable, otherwise in `%APPDATA%\phymlGUI`. Set `PHYMLGUI_DATA_DIR` to use another folder. +* **Settings and history:** stored next to the exe when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Set `PHYMLGUI_DATA_DIR` to use another folder. +* **Linux:** the same app runs on Linux. Tool names have no `.exe`; tools are found in `bin/` next to the app, then on `PATH`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`) and uses `mpirun`. ### 🧪 Tests ``` @@ -58,7 +59,8 @@ Analysis binaries are looked up in `bin/` and in the variables `PHYMLGUI_PHYML`, * **Программные файлы:** `phyml.exe` (или MPI-версия) и `muscle.exe`. * **Python-зависимости:** Python 3.11+ с пакетами `PySide6`, `matplotlib`, `biopython` и `psutil` (`pip install -r requirements.txt`). * **Среда MPI:** Для работы в параллельном режиме требуется установленный **Microsoft MPI** (инсталлятор `msmpisetup.exe` можно найти на официальном GitHub Microsoft). -* **Настройки и история:** хранятся рядом с exe, если папка доступна для записи, иначе в `%APPDATA%\phymlGUI`. Другую папку можно задать переменной `PHYMLGUI_DATA_DIR`. +* **Настройки и история:** хранятся рядом с exe, если папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Другую папку можно задать переменной `PHYMLGUI_DATA_DIR`. +* **Linux:** то же приложение работает под Linux. Имена программ без `.exe`; они ищутся в `bin/` рядом с приложением, затем в `PATH`. Для MPI-режима нужен OpenMPI (`sudo apt install openmpi-bin`), используется `mpirun`. ### 🧪 Тесты ``` diff --git a/tests/conftest.py b/tests/conftest.py index 9effe55..c493e32 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,6 +2,7 @@ os.environ.setdefault('QT_QPA_PLATFORM', 'offscreen') import hashlib +import shutil import sys from pathlib import Path @@ -12,16 +13,17 @@ sys.path.insert(0, str(ROOT)) _BINARIES = { - # kind: (env var, bin/ file name, extra local locations) - 'phyml': ('PHYMLGUI_PHYML', 'phyml-mpi.exe', + # kind: (env var, tool base name, extra local locations); the base name gets + # '.exe' on Windows (utils.exe_name) and is also looked up on PATH + 'phyml': ('PHYMLGUI_PHYML', 'phyml-mpi', [ROOT / 'phymlgui v1.1' / 'phyml-mpi.exe']), - 'mpiexec': ('PHYMLGUI_MPIEXEC', 'mpiexec.exe', + 'mpiexec': ('PHYMLGUI_MPIEXEC', 'mpiexec' if os.name == 'nt' else 'mpirun', [Path(r'C:\Program Files\Microsoft MPI\Bin\mpiexec.exe')]), - 'iqtree': ('PHYMLGUI_IQTREE', 'iqtree2.exe', + 'iqtree': ('PHYMLGUI_IQTREE', 'iqtree2', [ROOT / 'tools' / 'iqtree2' / 'iqtree2.exe']), - 'muscle': ('PHYMLGUI_MUSCLE', 'muscle.exe', + 'muscle': ('PHYMLGUI_MUSCLE', 'muscle', [ROOT / 'tools' / 'muscle.exe']), - 'raxml': ('PHYMLGUI_RAXML', 'raxml-ng.exe', []), + 'raxml': ('PHYMLGUI_RAXML', 'raxml-ng', []), } # marker name -> binary kind (needs_mpi is satisfied by mpiexec) @@ -34,17 +36,19 @@ def find_binary(kind): - """Path to an analysis binary or None: env var, then ROOT/bin, then local installs.""" - env_var, bin_name, local = _BINARIES[kind] + """Path to an analysis binary or None: env var, then ROOT/bin, then local installs, + then PATH.""" + from phyml_core.utils import exe_name + env_var, base, local = _BINARIES[kind] candidates = [] if os.environ.get(env_var): candidates.append(Path(os.environ[env_var])) - candidates.append(ROOT / 'bin' / bin_name) + candidates.append(ROOT / 'bin' / exe_name(base)) candidates.extend(local) for path in candidates: if path.is_file(): return str(path) - return None + return shutil.which(exe_name(base)) def pytest_runtest_setup(item): diff --git a/tests/gui/test_main_window_storage.py b/tests/gui/test_main_window_storage.py index 823e204..9c0b1bc 100644 --- a/tests/gui/test_main_window_storage.py +++ b/tests/gui/test_main_window_storage.py @@ -206,6 +206,8 @@ def test_bare_mpiexec_is_resolved_through_path(data_dir, make_window, monkeypatc def test_bare_mpiexec_kept_when_not_found(data_dir, make_window, monkeypatch): + from phyml_core import utils + monkeypatch.setattr(utils, 'IS_WINDOWS', True) # Windows semantics: mpiexec stays monkeypatch.setattr(shutil, 'which', lambda name: None) w = make_window() assert w.mpirun_path_input.text() == 'mpiexec' diff --git a/tests/unit/fakes.py b/tests/unit/fakes.py index cd0d819..46d3910 100644 --- a/tests/unit/fakes.py +++ b/tests/unit/fakes.py @@ -63,6 +63,13 @@ def launcher(self, params: dict) -> Native: def fake_muscle(tmp_path, mode: str) -> str: """A muscle-.cmd in tmp_path that runs fake_tool.py in that MUSCLE mode.""" + if os.name != 'nt': # a POSIX shell script on Linux + script = os.path.join(str(tmp_path), f'muscle-{mode}') + with open(script, 'w', encoding='utf-8', newline='\n') as handle: + handle.write('#!/bin/sh\n') + handle.write(f'exec "{sys.executable}" "{FAKE_TOOL}" {mode} "$@"\n') + os.chmod(script, 0o755) + return script script = os.path.join(str(tmp_path), f'muscle-{mode}.cmd') with open(script, 'w', encoding='oem', newline='\r\n') as handle: handle.write('@echo off\n') diff --git a/tests/unit/test_engine_iqtree.py b/tests/unit/test_engine_iqtree.py index c9710f1..bc2f053 100644 --- a/tests/unit/test_engine_iqtree.py +++ b/tests/unit/test_engine_iqtree.py @@ -3,6 +3,7 @@ import shutil import pytest +from phyml_core.utils import default_mpirun, exe_name from conftest import DATA, ROOT from phyml_core.engines import ENGINES @@ -27,7 +28,7 @@ def paths(tmp_path): @pytest.fixture def exe(tmp_path): """An existing IQ-TREE-looking file outside bin/.""" - path = tmp_path / 'iqtree2.exe' + path = tmp_path / exe_name('iqtree2') path.write_bytes(b'') return str(path) @@ -166,7 +167,7 @@ def test_executable_prefers_the_configured_file(paths, exe): def test_executable_falls_back_to_bin(paths): - bin_exe = os.path.join(paths.bin_dir, 'iqtree2.exe') + bin_exe = os.path.join(paths.bin_dir, exe_name('iqtree2')) os.makedirs(paths.bin_dir) open(bin_exe, 'wb').close() assert IqTree().executable({'iqtree_path': ''}, paths) == bin_exe @@ -208,7 +209,7 @@ def test_validate_empty_path_without_bin_reports_the_missing_exe(paths): def test_validate_uses_the_bin_fallback(paths): os.makedirs(paths.bin_dir) - open(os.path.join(paths.bin_dir, 'iqtree2.exe'), 'wb').close() + open(os.path.join(paths.bin_dir, exe_name('iqtree2')), 'wb').close() assert IqTree().validate(dict(Q, iqtree_path=''), paths) == [] diff --git a/tests/unit/test_engine_phyml.py b/tests/unit/test_engine_phyml.py index 0cd1f30..0b483fa 100644 --- a/tests/unit/test_engine_phyml.py +++ b/tests/unit/test_engine_phyml.py @@ -3,6 +3,7 @@ import shutil import pytest +from phyml_core.utils import default_mpirun, exe_name from conftest import DATA, ROOT from phyml_core import settings @@ -30,7 +31,7 @@ def paths(tmp_path): @pytest.fixture def exe(tmp_path): """An existing PhyML-looking file outside bin/.""" - path = tmp_path / 'phyml.exe' + path = tmp_path / exe_name('phyml') path.write_bytes(b'') return str(path) @@ -232,7 +233,7 @@ def test_executable_prefers_the_configured_file(paths, exe): def test_executable_falls_back_to_bin(paths): - bin_exe = os.path.join(paths.bin_dir, 'phyml-mpi.exe') + bin_exe = os.path.join(paths.bin_dir, exe_name('phyml-mpi')) os.makedirs(paths.bin_dir) open(bin_exe, 'wb').close() assert PhyML().executable({'phyml_path': ''}, paths) == bin_exe @@ -241,16 +242,16 @@ def test_executable_falls_back_to_bin(paths): def test_executable_prefers_the_mpi_build_in_bin(paths): os.makedirs(paths.bin_dir) - for name in ('phyml.exe', 'phyml-mpi.exe'): + for name in (exe_name('phyml'), exe_name('phyml-mpi')): open(os.path.join(paths.bin_dir, name), 'wb').close() - assert PhyML().executable({}, paths) == os.path.join(paths.bin_dir, 'phyml-mpi.exe') + assert PhyML().executable({}, paths) == os.path.join(paths.bin_dir, exe_name('phyml-mpi')) def test_executable_resolves_a_stored_relative_path(paths): os.makedirs(os.path.join(paths.app_dir, 'tools')) - target = os.path.join(paths.app_dir, 'tools', 'phyml.exe') + target = os.path.join(paths.app_dir, 'tools', exe_name('phyml')) open(target, 'wb').close() - assert PhyML().executable({'phyml_path': os.path.join('tools', 'phyml.exe')}, paths) == target + assert PhyML().executable({'phyml_path': os.path.join('tools', exe_name('phyml'))}, paths) == target def test_executable_returns_the_configured_path_when_nothing_exists(paths, tmp_path): @@ -286,12 +287,12 @@ def test_validate_empty_path_without_bin_reports_the_missing_exe(paths): def test_validate_uses_the_bin_fallback(paths): os.makedirs(paths.bin_dir) - open(os.path.join(paths.bin_dir, 'phyml.exe'), 'wb').close() + open(os.path.join(paths.bin_dir, exe_name('phyml')), 'wb').close() assert PhyML().validate(dict(P, phyml_path=''), paths) == [] def test_validate_serial_bootstrap_on_mpi_build(paths, tmp_path): - mpi_exe = tmp_path / 'phyml-mpi.exe' + mpi_exe = tmp_path / exe_name('phyml-mpi') mpi_exe.write_bytes(b'') issues = PhyML().validate(dict(P, phyml_path=str(mpi_exe), use_mpi=False), paths) assert issues == [Issue('error', 'mpi_boot_msg')] @@ -299,24 +300,24 @@ def test_validate_serial_bootstrap_on_mpi_build(paths, tmp_path): def test_validate_mpi_build_is_fine_with_mpi_alrt_or_a_serial_build(paths, tmp_path, monkeypatch): monkeypatch.setattr(shutil, 'which', lambda *a, **k: 'C:/MS/mpiexec.exe') - mpi_exe = tmp_path / 'phyml-mpi.exe' + mpi_exe = tmp_path / exe_name('phyml-mpi') mpi_exe.write_bytes(b'') base = dict(P, phyml_path=str(mpi_exe), mpirun_path='mpiexec', mpi_np='2') assert PhyML().validate(dict(base, use_mpi=True), paths) == [] assert PhyML().validate(dict(base, use_mpi=False, support_method='-4'), paths) == [] - serial = tmp_path / 'phyml.exe' + serial = tmp_path / exe_name('phyml') serial.write_bytes(b'') assert PhyML().validate(dict(base, phyml_path=str(serial), use_mpi=False), paths) == [] def test_validate_serial_bootstrap_check_sees_the_bin_fallback(paths): os.makedirs(paths.bin_dir) - open(os.path.join(paths.bin_dir, 'phyml-mpi.exe'), 'wb').close() + open(os.path.join(paths.bin_dir, exe_name('phyml-mpi')), 'wb').close() assert keys(PhyML().validate(dict(P, phyml_path='', use_mpi=False), paths)) == ['mpi_boot_msg'] def test_validate_reports_only_the_missing_exe_not_a_guess_about_its_build(paths, tmp_path): - missing = str(tmp_path / 'phyml-mpi.exe') + missing = str(tmp_path / exe_name('phyml-mpi')) assert keys(PhyML().validate(dict(P, phyml_path=missing, use_mpi=False), paths)) == ['val_no_exe'] @@ -403,12 +404,13 @@ def test_validate_mpiexec_present_as_a_file_or_a_command_name(paths, exe, tmp_pa @pytest.mark.parametrize('blank', ['', ' ']) def test_blank_mpirun_path_falls_back_to_mpiexec(paths, exe, monkeypatch, blank): - monkeypatch.setattr(shutil, 'which', lambda name, *a, **k: 'C:/MS/mpiexec.exe' if name == 'mpiexec' else None) + launcher_name = default_mpirun() # mpiexec on Windows, mpirun elsewhere + monkeypatch.setattr(shutil, 'which', lambda name, *a, **k: '/x/' + name if name == launcher_name else None) params = dict(P, phyml_path=exe, use_mpi=True, mpirun_path=blank, mpi_np='3') assert PhyML().validate(params, paths) == [] - assert PhyML().launcher(params) == Mpi('C:/MS/mpiexec.exe', 3) + assert PhyML().launcher(params) == Mpi('/x/' + launcher_name, 3) monkeypatch.setattr(shutil, 'which', lambda *a, **k: None) - assert PhyML().validate(params, paths) == [Issue('error', 'val_no_mpiexec', ('mpiexec',))] + assert PhyML().validate(params, paths) == [Issue('error', 'val_no_mpiexec', (launcher_name,))] def test_validate_mpiexec_is_not_checked_when_mpi_is_off(paths, exe, monkeypatch): diff --git a/tests/unit/test_paths.py b/tests/unit/test_paths.py index aaef52a..47acc41 100644 --- a/tests/unit/test_paths.py +++ b/tests/unit/test_paths.py @@ -35,7 +35,7 @@ def test_detect_prefers_writable_app_dir(tmp_path): def test_detect_falls_back_to_appdata(tmp_path): p = AppPaths.detect(env={'APPDATA': str(tmp_path / 'ad')}, is_writable=lambda d: False, - app_dir=str(tmp_path / 'app')) + app_dir=str(tmp_path / 'app'), platform='nt') assert p.data_dir == str(tmp_path / 'ad' / 'phymlGUI') and os.path.isdir(p.data_dir) @@ -48,7 +48,7 @@ def test_detect_default_probe_creates_and_removes_temp_file(tmp_path): def test_detect_default_probe_rejects_missing_dir(tmp_path): missing = tmp_path / 'no-such-app' - p = AppPaths.detect(env={'APPDATA': str(tmp_path / 'ad')}, app_dir=str(missing)) + p = AppPaths.detect(env={'APPDATA': str(tmp_path / 'ad')}, app_dir=str(missing), platform='nt') assert p.data_dir == str(tmp_path / 'ad' / 'phymlGUI') assert not missing.exists() From ea60daa85ef6ded9a2847bc7c520f4a9b91e6bec Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:34:25 +0300 Subject: [PATCH 06/25] Describe third-party tools per platform and add build steps third_party.json gains windows/linux sections (PhyML-MPI from the v1.2 release, RAxML-NG built from source on Windows; IQ-TREE, MUSCLE, RAxML-NG official Linux builds and PhyML built from source on Linux). The fetch script handles tar.gz, build commands and POSIX modes. The RAxML-NG Windows recipe was verified in MSYS2 UCRT64. Upstream license texts are bundled. CI now also runs the suite on ubuntu-22.04 with PhyML/OpenMPI. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 25 +- packaging/build_raxml_windows.sh | 25 + packaging/licenses/IQ-TREE-LICENSE.txt | 340 +++++++++ packaging/licenses/MUSCLE-LICENSE.txt | 674 ++++++++++++++++++ packaging/licenses/PhyML-COPYING.txt | 674 ++++++++++++++++++ packaging/licenses/RAxML-NG-LICENSE.txt | 661 +++++++++++++++++ packaging/licenses/README.md | 17 + .../patches/raxml-ng-2.0.3-windows.patch | 470 ++++++++++++ packaging/third_party.json | 75 +- scripts/fetch_third_party.py | 83 ++- tests/unit/test_fetch_third_party.py | 81 +++ 11 files changed, 3088 insertions(+), 37 deletions(-) create mode 100644 packaging/build_raxml_windows.sh create mode 100644 packaging/licenses/IQ-TREE-LICENSE.txt create mode 100644 packaging/licenses/MUSCLE-LICENSE.txt create mode 100644 packaging/licenses/PhyML-COPYING.txt create mode 100644 packaging/licenses/RAxML-NG-LICENSE.txt create mode 100644 packaging/licenses/README.md create mode 100644 packaging/patches/raxml-ng-2.0.3-windows.patch diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2794238..63942da 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,14 +4,16 @@ on: push: branches: [master] pull_request: + workflow_call: jobs: test: - runs-on: windows-latest - timeout-minutes: 30 + runs-on: ${{ matrix.os }} + timeout-minutes: 40 strategy: fail-fast: false matrix: + os: [windows-latest, ubuntu-22.04] python-version: ['3.11', '3.13'] env: QT_QPA_PLATFORM: offscreen @@ -20,16 +22,25 @@ jobs: - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + - name: Install Qt runtime libraries, OpenMPI and build tools (Linux) + if: runner.os == 'Linux' + run: > + sudo apt-get update && sudo apt-get install -y + libegl1 libgl1 libxkbcommon0 libxkbcommon-x11-0 libdbus-1-3 libfontconfig1 libxcb-cursor0 + openmpi-bin libopenmpi-dev build-essential autoconf automake libtool pkg-config - name: Install dependencies run: pip install -r requirements.txt -r requirements-dev.txt - - name: Cache pinned IQ-TREE and MUSCLE + - name: Cache pinned third-party programs id: third-party uses: actions/cache@v4 with: path: bin - key: third-party-${{ hashFiles('packaging/third_party.json') }} - - name: Fetch pinned IQ-TREE and MUSCLE - if: steps.third-party.outputs.cache-hit != 'true' - run: python scripts/fetch_third_party.py --dest bin + key: third-party-${{ runner.os }}-${{ hashFiles('packaging/third_party.json', 'packaging/build_phyml_linux.sh') }} + - name: Fetch pinned IQ-TREE and MUSCLE (Windows) + if: runner.os == 'Windows' && steps.third-party.outputs.cache-hit != 'true' + run: python scripts/fetch_third_party.py --platform windows --only iqtree,muscle --dest bin + - name: Fetch IQ-TREE, MUSCLE and build PhyML (Linux) + if: runner.os == 'Linux' && steps.third-party.outputs.cache-hit != 'true' + run: python scripts/fetch_third_party.py --platform linux --only iqtree,muscle,phyml --dest bin - name: Tests run: python -m pytest -q -rs diff --git a/packaging/build_raxml_windows.sh b/packaging/build_raxml_windows.sh new file mode 100644 index 0000000..52fe61f --- /dev/null +++ b/packaging/build_raxml_windows.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Build a native, self-contained raxml-ng.exe (Windows x64) from the official +# source zip with the patch from docs/superpowers/spikes/2026-10-24-raxml-ng-windows. +# Run inside MSYS2 UCRT64 (mingw-w64-ucrt-x86_64-{gcc,cmake,ninja}). +# Usage: build_raxml_windows.sh +set -euo pipefail + +here=$(cd "$(dirname "$0")" && pwd) +src_archive=$(cygpath -u "$1" 2>/dev/null || echo "$1") +dest=$(cygpath -u "$2" 2>/dev/null || echo "$2") +mkdir -p "$dest" +work=$(mktemp -d) +trap 'rm -rf "$work"' EXIT + +unzip -q "$src_archive" -d "$work/src" +cd "$work/src" +git apply -p1 --whitespace=nowarn "$here/patches/raxml-ng-2.0.3-windows.patch" + +cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DSTATIC_BUILD=ON -DPORTABLE_BUILD=ON -DCORAX_BUILD_PORTABLE_ARCH=x86-64 \ + -DUSE_MPI=OFF "-DCMAKE_CXX_FLAGS=-D_USE_MATH_DEFINES -D_GNU_SOURCE" +cmake --build build -j + +install -m 755 build/bin/raxml-ng.exe "$dest/raxml-ng.exe" +echo "built: $dest/raxml-ng.exe" diff --git a/packaging/licenses/IQ-TREE-LICENSE.txt b/packaging/licenses/IQ-TREE-LICENSE.txt new file mode 100644 index 0000000..8cdb845 --- /dev/null +++ b/packaging/licenses/IQ-TREE-LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + diff --git a/packaging/licenses/MUSCLE-LICENSE.txt b/packaging/licenses/MUSCLE-LICENSE.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/packaging/licenses/MUSCLE-LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/packaging/licenses/PhyML-COPYING.txt b/packaging/licenses/PhyML-COPYING.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/packaging/licenses/PhyML-COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/packaging/licenses/RAxML-NG-LICENSE.txt b/packaging/licenses/RAxML-NG-LICENSE.txt new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/packaging/licenses/RAxML-NG-LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/packaging/licenses/README.md b/packaging/licenses/README.md new file mode 100644 index 0000000..9eed6bf --- /dev/null +++ b/packaging/licenses/README.md @@ -0,0 +1,17 @@ +# Third-party licenses + +The release packages bundle these programs unchanged, except RAxML-NG on +Windows, which is built from the official sources with +`packaging/patches/raxml-ng-2.0.3-windows.patch`. + +| Program | License | File | +|---|---|---| +| PhyML | GPL-3.0 | `PhyML-COPYING.txt` | +| IQ-TREE 2 | GPL-2.0 | `IQ-TREE-LICENSE.txt` | +| MUSCLE 5 | GPL-3.0 | `MUSCLE-LICENSE.txt` | +| RAxML-NG | AGPL-3.0 | `RAxML-NG-LICENSE.txt` | + +RAxML-NG is AGPL-3.0: every release attaches +`raxml-ng-2.0.3-source+patch.tar.gz` with the exact sources and the patch +used for the Windows build. Versions and download URLs are listed in +`packaging/third_party.json`. diff --git a/packaging/patches/raxml-ng-2.0.3-windows.patch b/packaging/patches/raxml-ng-2.0.3-windows.patch new file mode 100644 index 0000000..8d64993 --- /dev/null +++ b/packaging/patches/raxml-ng-2.0.3-windows.patch @@ -0,0 +1,470 @@ +Binary files pristine/bin/raxml-ng.exe and dl_src/bin/raxml-ng.exe differ +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/core/common.h dl_src/libs/coraxlib/src/corax/core/common.h +--- pristine/libs/coraxlib/src/corax/core/common.h 2025-10-31 18:41:19.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/core/common.h 2026-10-24 19:21:29.744785700 +0300 +@@ -44,7 +44,7 @@ + #include + #endif + +-#if (defined(__WIN32__) || defined(__WIN64__)) ++#if (defined(__WIN32__) || defined(__WIN64__)) && defined(CORAX_SHARED) + #define CORAX_EXPORT __declspec(dllexport) + #else + #define CORAX_EXPORT +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/core/partition.c dl_src/libs/coraxlib/src/corax/core/partition.c +--- pristine/libs/coraxlib/src/corax/core/partition.c 2025-10-31 18:41:19.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/core/partition.c 2026-10-24 22:38:25.828525000 +0300 +@@ -45,7 +45,7 @@ + + if (partition->tipchars) + for (i = 0; i < partition->tips; ++i) +- corax_aligned_free(partition->tipchars[i]); ++ free(partition->tipchars[i]); + free(partition->tipchars); + + if (partition->ttlookup) corax_aligned_free(partition->ttlookup); +@@ -114,7 +114,7 @@ + free(repeats->lookup_buffer); + free(repeats->toclean_buffer); + free(repeats->id_site_buffer); +- free(repeats->bclv_buffer); ++ corax_aligned_free(repeats->bclv_buffer); + free(repeats->charmap); + free(repeats); + } +@@ -236,7 +236,7 @@ + && CORAX_HAS_CPU_FEATURE(avx_present)) + return CORAX_SUCCESS; + +- free(partition->ttlookup); ++ corax_aligned_free(partition->ttlookup); + partition->ttlookup = + corax_aligned_alloc(alloc_size * sizeof(double), partition->alignment); + if (!partition->ttlookup) +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/core/repeats.c dl_src/libs/coraxlib/src/corax/core/repeats.c +--- pristine/libs/coraxlib/src/corax/core/repeats.c 2025-10-31 18:41:19.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/core/repeats.c 2026-10-24 22:37:42.855902200 +0300 +@@ -221,7 +221,7 @@ + } + unsigned int sizealloc = (ids + additional_sites) * partition->states_padded + * partition->rate_cats * sizeof(double); +- free(partition->clv[tip_index]); ++ corax_aligned_free(partition->clv[tip_index]); + + partition->clv[tip_index] = + corax_aligned_alloc(sizealloc, partition->alignment); +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/io/binary.c dl_src/libs/coraxlib/src/corax/io/binary.c +--- pristine/libs/coraxlib/src/corax/io/binary.c 2026-03-11 21:17:41.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/io/binary.c 2026-10-24 22:37:47.461549500 +0300 +@@ -1029,7 +1029,10 @@ + if (!bin_fread(data, *size, 1, bin_file)) + { + corax_set_error(CORAX_BIN_ERROR_BINARY_IO, "Error reading data."); +- free(data); ++ if (*attributes & CORAX_BIN_ATTRIB_ALIGNED) ++ corax_aligned_free(data); ++ else ++ free(data); + return CORAX_FAILURE; + } + +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/tree/treeinfo.c dl_src/libs/coraxlib/src/corax/tree/treeinfo.c +--- pristine/libs/coraxlib/src/corax/tree/treeinfo.c 2026-04-25 00:35:45.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/tree/treeinfo.c 2026-10-24 22:37:44.852293600 +0300 +@@ -791,7 +791,7 @@ + + if (treeinfo->deriv_precomp[partition_index]) + { +- free(treeinfo->deriv_precomp[partition_index]); ++ corax_aligned_free(treeinfo->deriv_precomp[partition_index]); + treeinfo->deriv_precomp[partition_index] = NULL; + } + +diff -ruN '--exclude=src.zip' pristine/libs/coraxlib/src/corax/util/stepwise.c dl_src/libs/coraxlib/src/corax/util/stepwise.c +--- pristine/libs/coraxlib/src/corax/util/stepwise.c 2026-03-11 21:17:41.000000000 +0300 ++++ dl_src/libs/coraxlib/src/corax/util/stepwise.c 2026-10-24 22:35:47.977481800 +0300 +@@ -85,7 +85,9 @@ + { + int rint; + corax_random_r(buf, &rint); +- double r = ((double)rint / RAND_MAX); ++ /* corax_random_r yields [0, 2^31-1] everywhere, while RAND_MAX is ++ only 32767 on Windows: normalize by the generator's own maximum */ ++ double r = ((double)rint / 2147483647.0); + j = (unsigned int)(r * (i + 1)); + + CORAX_SWAP(x[i], x[j]); +diff -ruN '--exclude=src.zip' pristine/src/adaptive/DifficultyPredictor.cpp dl_src/src/adaptive/DifficultyPredictor.cpp +--- pristine/src/adaptive/DifficultyPredictor.cpp 2026-09-03 19:23:46.000000000 +0300 ++++ dl_src/src/adaptive/DifficultyPredictor.cpp 2026-10-24 22:46:13.171567100 +0300 +@@ -76,7 +76,7 @@ + // init seeds + uintVector seeds(n_trees); + for (unsigned int i = 0; i < n_trees; ++i) +- seeds[i] = (unsigned int) rand(); ++ seeds[i] = (unsigned int) raxml_rand(); + + for (unsigned int i = 0; i < n_trees; ++i) + _pars_tree_list.emplace_back(Tree::buildParsimony(*_parsimony_msa_ptr, seeds[i], false, &score)); +diff -ruN '--exclude=src.zip' pristine/src/adaptive/StoppingCriterion.cpp dl_src/src/adaptive/StoppingCriterion.cpp +--- pristine/src/adaptive/StoppingCriterion.cpp 2026-09-03 19:23:46.000000000 +0300 ++++ dl_src/src/adaptive/StoppingCriterion.cpp 2026-10-24 22:46:13.163049200 +0300 +@@ -391,14 +391,14 @@ + + { + ParallelContext::UniqueLock lock; +- srand(seed); ++ raxml_srand(seed); + + for(exp = 0; exp < rell_size; exp++){ + + double rell_loglh = 0; + for (i = 0; i p = find_by_site_index(site_index); + assert(p.first >= 0 && p.second >= 0); + auto p_id = (unsigned int) p.first; +@@ -410,8 +410,8 @@ + } + + for(exp = 0; exp < rell_size; exp++){ +- auto ind1 = (unsigned int) rand() % rell_size; +- auto ind2 = (unsigned int) rand() % rell_size; ++ auto ind1 = (unsigned int) raxml_rand() % rell_size; ++ auto ind2 = (unsigned int) raxml_rand() % rell_size; + logl_diff_dist[exp] = fabs(rell_dist[ind1] - rell_dist[ind2]); + } + } +diff -ruN '--exclude=src.zip' pristine/src/common.h dl_src/src/common.h +--- pristine/src/common.h 2026-05-27 16:34:30.000000000 +0300 ++++ dl_src/src/common.h 2026-10-24 22:46:05.179337100 +0300 +@@ -15,6 +15,12 @@ + #include "log.hpp" + #include "util/SystemTimer.hpp" + ++/* rand()/srand() with glibc semantics on every platform: Windows' rand() is a ++ 15-bit LCG, so per-tree and per-replicate seeds drawn from it collide ++ (duplicate bootstrap replicates) and differ from Linux for the same --seed */ ++int raxml_rand(); ++void raxml_srand(unsigned int seed); ++ + /* used to suppress compiler warnings about unused args */ + #define RAXML_UNUSED(expr) (void)(expr) + +@@ -26,8 +32,8 @@ + + double sysutil_gettime(); + void sysutil_show_rusage(); +-unsigned long sysutil_get_memused(); +-unsigned long sysutil_get_memtotal(bool ignore_errors = true); ++unsigned long long sysutil_get_memused(); ++unsigned long long sysutil_get_memtotal(bool ignore_errors = true); + + std::string sysutil_get_cpu_model(); + unsigned int sysutil_get_cpu_cores(); +diff -ruN '--exclude=src.zip' pristine/src/main.cpp dl_src/src/main.cpp +--- pristine/src/main.cpp 2026-09-03 19:23:46.000000000 +0300 ++++ dl_src/src/main.cpp 2026-10-24 22:46:13.153672200 +0300 +@@ -1314,7 +1314,7 @@ + // temp workaround: since MSA pattern compression calls rand(), it will change all random + // numbers generated afterwards. so just reset seed to the initial value to ensure that + // starting trees, BS replicates etc. are the same regardless whether pat.comp is ON or OFF +- srand(opts.random_seed); ++ raxml_srand(opts.random_seed); + } + + // if (parted_msa.part_count() > 1) +@@ -1851,7 +1851,7 @@ + // init seeds + uintVector seeds(tree_count); + for (size_t i = 0; i < tree_count; ++i) +- seeds[i] = (unsigned int) rand(); ++ seeds[i] = (unsigned int) raxml_rand(); + + auto thread_fn = std::bind(thread_start_trees, + std::ref(instance), +@@ -1946,7 +1946,7 @@ + // init seeds + uintVector seeds(st_tree_count); + for (size_t i = 0; i < st_tree_count; ++i) +- seeds[i] = (unsigned int) rand(); ++ seeds[i] = (unsigned int) raxml_rand(); + + for (size_t i = 0; i < st_tree_count; ++i) + { +@@ -2178,7 +2178,7 @@ + auto& seeds = instance.bs_seeds; + seeds.resize(num_bsreps); + for (size_t i = 0; i < seeds.size(); ++i) +- seeds[i] = (unsigned int) rand(); ++ seeds[i] = (unsigned int) raxml_rand(); + + /* generate missing parsimony trees from the original MSA */ + if (instance.opts.num_pars_trees() > instance.pars_trees.size()) +@@ -2191,7 +2191,7 @@ + { + for (size_t i = 0; i < trees_to_generate; ++i) + { +- auto tree = generate_tree(instance, StartingTree::parsimony, (unsigned int) rand()); ++ auto tree = generate_tree(instance, StartingTree::parsimony, (unsigned int) raxml_rand()); + instance.pars_trees.emplace_back(std::move(tree)); + } + } +@@ -2378,7 +2378,7 @@ + /* no starting trees -> use a first tree from pars_trees, generate if needed */ + if (instance.pars_trees.empty()) + { +- auto tree = generate_tree(instance, StartingTree::parsimony, (unsigned int) rand()); ++ auto tree = generate_tree(instance, StartingTree::parsimony, (unsigned int) raxml_rand()); + instance.pars_trees.emplace_back(std::move(tree)); + } + } +@@ -2740,7 +2740,7 @@ + + if (bs_num % opts.bootstop_interval == 0 || bs_num == bs_trees.size()) + { +- converged = bootstop_checker->converged((unsigned int) rand()); ++ converged = bootstop_checker->converged((unsigned int) raxml_rand()); + + if (print) + { +@@ -3474,7 +3474,7 @@ + + // we need at least 2 doubles for each partition AND threads to perform parallel reduction, + // and even more with FreeRates in EM mode -> so resize the buffer accordingly +- auto doubles_per_thread_part = std::max(2UL, total_freerate_category_count); ++ auto doubles_per_thread_part = std::max(2, total_freerate_category_count); + const size_t reduce_buffer_size = std::max(1024u, doubles_per_thread_part * sizeof(double) * + parted_msa.part_count() * ParallelContext::num_threads()); + +@@ -4012,8 +4012,8 @@ + check_options(instance); + + /* init template tree */ +- srand(instance.opts.random_seed); +- instance.random_tree = generate_tree(instance, StartingTree::random, (unsigned int) rand()); ++ raxml_srand(instance.opts.random_seed); ++ instance.random_tree = generate_tree(instance, StartingTree::random, (unsigned int) raxml_rand()); + + // read start trees from file to avoid re-generation + // NOTE: doesn't work for OLD constrained tree search +@@ -4050,7 +4050,7 @@ + + // TEMP WORKAROUND: here we reset random seed once again to make sure that BS replicates + // are not affected by the number of ML search starting trees that has been generated before +- srand(instance.opts.random_seed); ++ raxml_srand(instance.opts.random_seed); + + /* generate bootstrap replicates */ + generate_bootstraps(instance, cm.checkp_file()); +@@ -4246,7 +4246,7 @@ + { + // make sure all MPI ranks use the same random seed + ParallelContext::mpi_broadcast(&opts.random_seed, sizeof(unsigned int)); +- srand(opts.random_seed); ++ raxml_srand(opts.random_seed); + + logger().log_level(instance.opts.log_level); + logger().precision(instance.opts.precision); +diff -ruN '--exclude=src.zip' pristine/src/util/sysutil.cpp dl_src/src/util/sysutil.cpp +--- pristine/src/util/sysutil.cpp 2026-09-03 19:23:46.000000000 +0300 ++++ dl_src/src/util/sysutil.cpp 2026-10-24 22:46:07.639509900 +0300 +@@ -1,8 +1,10 @@ +-#if (!defined(_WIN32) && !defined(__aarch64__)) ++#if ((!defined(_WIN32) || defined(__GNUC__)) && !defined(__aarch64__)) + #include + #endif + #include ++#ifndef _WIN32 + #include ++#endif + #include + #include + #if defined __APPLE__ +@@ -20,6 +22,55 @@ + + #include "../common.h" + ++#ifdef _WIN32 ++#ifndef WIN32_LEAN_AND_MEAN ++#define WIN32_LEAN_AND_MEAN ++#endif ++#ifndef NOMINMAX ++#define NOMINMAX ++#endif ++#include ++#include ++ ++static double filetime_to_sec(const FILETIME& ft) ++{ ++ return (double)(((ULONGLONG)ft.dwHighDateTime << 32) | ft.dwLowDateTime) * 1.0e-7; ++} ++ ++#include ++ ++static std::mutex rand_mutex; ++static struct corax_random_data rand_data; ++static char rand_state[128]; /* 128 bytes = glibc's default TYPE_3 state */ ++static bool rand_seeded = false; ++ ++static void rand_seed_locked(unsigned int seed) ++{ ++ memset(&rand_data, 0, sizeof(rand_data)); ++ corax_initstate_r(seed, rand_state, sizeof(rand_state), &rand_data); ++ rand_seeded = true; ++} ++ ++void raxml_srand(unsigned int seed) ++{ ++ std::lock_guard lock(rand_mutex); ++ rand_seed_locked(seed); ++} ++ ++int raxml_rand() ++{ ++ std::lock_guard lock(rand_mutex); ++ if (!rand_seeded) ++ rand_seed_locked(1); /* as in glibc: rand() before srand() == srand(1) */ ++ int32_t r; ++ corax_random_r(&rand_data, &r); ++ return r; ++} ++#else ++int raxml_rand() { return rand(); } ++void raxml_srand(unsigned int seed) { srand(seed); } ++#endif ++ + using namespace std; + + SystemTimer systimer; +@@ -55,8 +106,13 @@ + + void * xmemalign(size_t size, size_t alignment) + { ++#ifdef _WIN32 ++ void * t = _aligned_malloc(size, alignment); ++ int err = 0; ++#else + void * t = nullptr; + int err = posix_memalign(& t, alignment, size); ++#endif + + if (err || !t) + sysutil_fatal("Unable to allocate enough memory."); +@@ -85,11 +141,18 @@ + + void sysutil_show_rusage() + { ++#ifdef _WIN32 ++ FILETIME creation, exit_time, kernel, user; ++ GetProcessTimes(GetCurrentProcess(), &creation, &exit_time, &kernel, &user); ++ fprintf(stderr, "Time: %.3fs (user)", filetime_to_sec(user)); ++ fprintf(stderr, " %.3fs (sys)", filetime_to_sec(kernel)); ++ fprintf(stderr, " Memory: %.0fMB\n", sysutil_get_memused() * 1.0e-6); ++#else + struct rusage r_usage; + getrusage(RUSAGE_SELF, & r_usage); +- ++ + fprintf(stderr, +- "Time: %.3fs (user)", ++ "Time: %.3fs (user)", + r_usage.ru_utime.tv_sec * 1.0 + (double)r_usage.ru_utime.tv_usec * 1.0e-6); + fprintf(stderr, + " %.3fs (sys)", +@@ -102,10 +165,17 @@ + /* Linux: ru_maxrss gives the size in kilobytes */ + fprintf(stderr, " Memory: %.0fMB\n", r_usage.ru_maxrss * 1.0e-3); + #endif ++#endif + } + +-unsigned long sysutil_get_memused() ++unsigned long long sysutil_get_memused() + { ++#ifdef _WIN32 ++ PROCESS_MEMORY_COUNTERS pmc; ++ if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) ++ return (unsigned long long) pmc.PeakWorkingSetSize; ++ return 0; ++#else + struct rusage r_usage; + getrusage(RUSAGE_SELF, & r_usage); + +@@ -116,11 +186,25 @@ + /* Linux: ru_maxrss gives the size in kilobytes */ + return (unsigned long)r_usage.ru_maxrss * 1024; + #endif ++#endif + } + +-unsigned long sysutil_get_memtotal(bool ignore_errors) ++unsigned long long sysutil_get_memtotal(bool ignore_errors) + { +-#if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) ++#if defined(_WIN32) ++ ++ MEMORYSTATUSEX status; ++ status.dwLength = sizeof(status); ++ if (!GlobalMemoryStatusEx(&status)) ++ { ++ if (ignore_errors) ++ return 0; ++ else ++ throw runtime_error("Cannot determine amount of RAM"); ++ } ++ return status.ullTotalPhys; ++ ++#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) + + long phys_pages = sysconf(_SC_PHYS_PAGES); + long pagesize = sysconf(_SC_PAGESIZE); +@@ -178,7 +262,7 @@ + // not supported + RAXML_UNUSED(out); + RAXML_UNUSED(x); +-#elif defined(_WIN32) ++#elif defined(_WIN32) && !defined(__GNUC__) + __cpuid(out, x); + #else + __cpuid_count(x, 0, out[0], out[1], out[2], out[3]); +@@ -295,7 +379,11 @@ + + long sysutil_online_cpu_cores() + { ++#ifdef _WIN32 ++ return (long) std::thread::hardware_concurrency(); ++#else + return sysconf(_SC_NPROCESSORS_ONLN); ++#endif + } + + unsigned long sysutil_get_cpu_features() +@@ -314,7 +402,7 @@ + int32_t nIds = info[0]; + + get_cpuid(info, 0x80000000); +- u_int32_t nExIds = info[0]; ++ uint32_t nExIds = info[0]; + + // Detect Features + if (nIds >= 0x00000001) +@@ -463,7 +551,16 @@ + + std::string sysutil_realpath(const std::string& path) + { ++#ifdef _WIN32 ++ // _fullpath does not check existence: mimic realpath's ENOENT ++ char * real_path = nullptr; ++ if (sysutil_file_exists(path) || sysutil_dir_exists(path)) ++ real_path = _fullpath(nullptr, path.c_str(), 0); ++ else ++ errno = ENOENT; ++#else + char * real_path = realpath(path.c_str(), nullptr); ++#endif + if (real_path) + { + const string result(real_path); diff --git a/packaging/third_party.json b/packaging/third_party.json index b45d1d3..2dbb2d3 100644 --- a/packaging/third_party.json +++ b/packaging/third_party.json @@ -1,17 +1,68 @@ { - "iqtree": { - "version": "2.4.0", - "url": "https://github.com/iqtree/iqtree2/releases/download/v2.4.0/iqtree-2.4.0-Windows.zip", - "sha256": "93f488a6cfef96ef664b23fefe5be97c2c80ebcae9cd2031c0cac92b467278be", - "extract": { - "iqtree-2.4.0-Windows/bin/iqtree2.exe": "iqtree2.exe", - "iqtree-2.4.0-Windows/bin/libiomp5md.dll": "libiomp5md.dll" + "windows": { + "iqtree": { + "version": "2.4.0", + "url": "https://github.com/iqtree/iqtree2/releases/download/v2.4.0/iqtree-2.4.0-Windows.zip", + "sha256": "93f488a6cfef96ef664b23fefe5be97c2c80ebcae9cd2031c0cac92b467278be", + "extract": { + "iqtree-2.4.0-Windows/bin/iqtree2.exe": "iqtree2.exe", + "iqtree-2.4.0-Windows/bin/libiomp5md.dll": "libiomp5md.dll" + } + }, + "muscle": { + "version": "5.3", + "url": "https://github.com/rcedgar/muscle/releases/download/v5.3/muscle-win64.v5.3.exe", + "sha256": "a86637db99deb3efa1cb6762c4e3160ca33644608270eb167e4214f1f9409711", + "save_as": "muscle.exe" + }, + "phyml": { + "version": "3.3 (MS-MPI build from phymlGUI v1.2)", + "url": "https://github.com/adrobi/phymlGUI/releases/download/v1.2/phymlGUI-1.2-win64.zip", + "sha256": "4258578f2772fe5958513275cd7a64b6230d90795477b55ab156487bf0b08459", + "extract": { + "phymlGUI-1.2/phyml-mpi.exe": "phyml-mpi.exe" + } + }, + "raxml": { + "version": "2.0.3 (native build, packaging/patches/raxml-ng-2.0.3-windows.patch)", + "url": "https://github.com/amkozlov/raxml-ng/releases/download/2.0.3/raxml-ng_v2.0.3_source.zip", + "sha256": "7cd3fa6b1de373777d688032c9ec6731078b67e6a812d7a1d779295d016843d2", + "build": ["bash", "packaging/build_raxml_windows.sh"], + "outputs": ["raxml-ng.exe"] } }, - "muscle": { - "version": "5.3", - "url": "https://github.com/rcedgar/muscle/releases/download/v5.3/muscle-win64.v5.3.exe", - "sha256": "a86637db99deb3efa1cb6762c4e3160ca33644608270eb167e4214f1f9409711", - "save_as": "muscle.exe" + "linux": { + "iqtree": { + "version": "2.4.0", + "url": "https://github.com/iqtree/iqtree2/releases/download/v2.4.0/iqtree-2.4.0-Linux-intel.tar.gz", + "sha256": "49c58e26f192dd5e0045110cee0af151203dfa0bd79fa03d01fcfc3e44ca2f1b", + "extract": { + "iqtree-2.4.0-Linux-intel/bin/iqtree2": "iqtree2" + }, + "mode": "755" + }, + "muscle": { + "version": "5.3", + "url": "https://github.com/rcedgar/muscle/releases/download/v5.3/muscle-linux-x86.v5.3", + "sha256": "318abeb951d786a3e2532714cc81ad3b3d8f79a2b517dc31316eeb5b694db2bc", + "save_as": "muscle", + "mode": "755" + }, + "phyml": { + "version": "3.3.20260528", + "url": "https://github.com/stephaneguindon/phyml/archive/refs/tags/v3.3.20260528.tar.gz", + "sha256": "42451c46de7cd01f8ca67d657766acf5b02f61027127bdda87efe3cdb422b297", + "build": ["bash", "packaging/build_phyml_linux.sh"], + "outputs": ["phyml", "phyml-mpi"] + }, + "raxml": { + "version": "2.0.3", + "url": "https://github.com/amkozlov/raxml-ng/releases/download/2.0.3/raxml-ng_v2.0.3_linux_x86_64.zip", + "sha256": "d660cebe2a083de6c20d9354968803b8fd10be206f625be2393997d0abe98105", + "extract": { + "raxml-ng": "raxml-ng" + }, + "mode": "755" + } } } diff --git a/scripts/fetch_third_party.py b/scripts/fetch_third_party.py index 907e2df..225d614 100644 --- a/scripts/fetch_third_party.py +++ b/scripts/fetch_third_party.py @@ -1,14 +1,20 @@ -"""Download the pinned third-party binaries (IQ-TREE, MUSCLE) into a folder. +"""Download (or build) the pinned third-party programs into a folder. -Every download is verified against the SHA256 in packaging/third_party.json -before anything is written to the destination. +packaging/third_party.json has one section per platform ("windows", "linux", +and "build_tools" for packaging helpers). Every download is verified against +its SHA256 before anything is written to the destination. An entry then +either extracts listed members of a zip/tar.gz ("extract"), saves the file +under a new name ("save_as"), or runs a build command ("build": argv that +receives the downloaded archive and the destination) and checks "outputs". """ import argparse import hashlib import json import os import shutil +import subprocess import sys +import tarfile import tempfile import urllib.request import zipfile @@ -17,6 +23,10 @@ MANIFEST = os.path.join(ROOT, 'packaging', 'third_party.json') +def default_platform(): + return 'windows' if os.name == 'nt' else 'linux' + + def _download(url, target): sha = hashlib.sha256() with urllib.request.urlopen(url, timeout=120) as resp, open(target, 'wb') as out: @@ -29,6 +39,37 @@ def _download(url, target): return sha.hexdigest() +def _extract(archive, members, dest): + written = [] + if zipfile.is_zipfile(archive): + with zipfile.ZipFile(archive) as z: + for member, out_name in members.items(): + target = os.path.join(dest, out_name) + with z.open(member) as src, open(target, 'wb') as out: + shutil.copyfileobj(src, out) + written.append(target) + else: + with tarfile.open(archive) as t: + for member, out_name in members.items(): + src = t.extractfile(member) + if src is None: + raise KeyError(member) + target = os.path.join(dest, out_name) + with src, open(target, 'wb') as out: + shutil.copyfileobj(src, out) + written.append(target) + return written + + +def _build(spec, archive, dest): + subprocess.run([*spec['build'], archive, dest], check=True, cwd=ROOT) + written = [os.path.join(dest, name) for name in spec.get('outputs', [])] + missing = [p for p in written if not os.path.isfile(p)] + if missing: + raise ValueError(f'build did not produce: {", ".join(missing)}') + return written + + def fetch(name, spec, dest): """Download spec['url'], check SHA256, put the files into dest; return their paths.""" with tempfile.TemporaryDirectory(prefix='phymlgui_fetch_') as tmp: @@ -38,38 +79,44 @@ def fetch(name, spec, dest): if actual != expected: raise ValueError(f'{name}: SHA256 mismatch: expected {expected}, got {actual}') os.makedirs(dest, exist_ok=True) - written = [] - if 'extract' in spec: - with zipfile.ZipFile(archive) as z: - for member, out_name in spec['extract'].items(): - target = os.path.join(dest, out_name) - with z.open(member) as src, open(target, 'wb') as out: - shutil.copyfileobj(src, out) - written.append(target) + if 'build' in spec: + written = _build(spec, archive, os.path.abspath(dest)) + elif 'extract' in spec: + written = _extract(archive, spec['extract'], dest) else: target = os.path.join(dest, spec['save_as']) shutil.copyfile(archive, target) - written.append(target) + written = [target] + if spec.get('mode') and os.name != 'nt': + for path in written: + os.chmod(path, int(spec['mode'], 8)) return written def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--platform', default=default_platform(), + help='manifest section: windows, linux or build_tools') parser.add_argument('--dest', default='bin') - parser.add_argument('--only', action='append', choices=None, - help='fetch only this tool (repeatable)') + parser.add_argument('--only', action='append', + help='fetch only this tool (repeatable, comma lists allowed)') args = parser.parse_args(argv) with open(MANIFEST, encoding='utf-8') as f: manifest = json.load(f) - names = args.only or list(manifest) - unknown = [n for n in names if n not in manifest] + section = manifest.get(args.platform) + if section is None: + print(f'unknown platform section: {args.platform}', file=sys.stderr) + return 2 + names = [n for item in (args.only or []) for n in item.split(',') if n] or list(section) + unknown = [n for n in names if n not in section] if unknown: print(f'unknown tool(s): {", ".join(unknown)}', file=sys.stderr) return 2 for name in names: try: - paths = fetch(name, manifest[name], args.dest) - except (ValueError, OSError, KeyError, zipfile.BadZipFile) as exc: + paths = fetch(name, section[name], args.dest) + except (ValueError, OSError, KeyError, zipfile.BadZipFile, tarfile.TarError, + subprocess.CalledProcessError) as exc: print(f'{name}: {exc}', file=sys.stderr) return 1 for p in paths: diff --git a/tests/unit/test_fetch_third_party.py b/tests/unit/test_fetch_third_party.py index 4383cb9..50736dc 100644 --- a/tests/unit/test_fetch_third_party.py +++ b/tests/unit/test_fetch_third_party.py @@ -50,3 +50,84 @@ def test_fetch_extracts_listed_members(tmp_path): assert [Path(p) for p in paths] == [dest / 'tool.exe'] assert sorted(p.name for p in dest.iterdir()) == ['tool.exe'] assert (dest / 'tool.exe').read_bytes() == b'exe' + + +def test_fetch_extracts_tar_gz_member(tmp_path): + import tarfile + payload = tmp_path / 'iqtree2' + payload.write_bytes(b'elf') + archive = tmp_path / 'iq.tar.gz' + with tarfile.open(archive, 'w:gz') as t: + t.add(payload, arcname='iqtree-2.4.0-Linux-intel/bin/iqtree2') + t.add(payload, arcname='iqtree-2.4.0-Linux-intel/bin/other') + dest = tmp_path / 'bin' + spec = {'url': archive.as_uri(), 'sha256': _sha(archive), + 'extract': {'iqtree-2.4.0-Linux-intel/bin/iqtree2': 'iqtree2'}} + paths = fetch_mod.fetch('iqtree', spec, str(dest)) + assert [Path(p) for p in paths] == [dest / 'iqtree2'] + assert sorted(p.name for p in dest.iterdir()) == ['iqtree2'] + + +def test_fetch_runs_build_script(tmp_path): + import sys + src = tmp_path / 'src.tar.gz' + src.write_bytes(b'sources') + builder = tmp_path / 'builder.py' + builder.write_text( + 'import sys, pathlib\n' + 'archive, dest = sys.argv[1], pathlib.Path(sys.argv[2])\n' + 'dest.mkdir(parents=True, exist_ok=True)\n' + "(dest / 'phyml').write_bytes(pathlib.Path(archive).read_bytes())\n", 'utf-8') + dest = tmp_path / 'bin' + spec = {'url': src.as_uri(), 'sha256': _sha(src), + 'build': [sys.executable, str(builder)], 'outputs': ['phyml']} + paths = fetch_mod.fetch('phyml', spec, str(dest)) + assert [Path(p) for p in paths] == [dest / 'phyml'] + assert (dest / 'phyml').read_bytes() == b'sources' + + +def test_fetch_build_missing_output_fails(tmp_path): + import sys + src = tmp_path / 'src.tar.gz' + src.write_bytes(b'sources') + builder = tmp_path / 'builder.py' + builder.write_text('pass\n', 'utf-8') + spec = {'url': src.as_uri(), 'sha256': _sha(src), + 'build': [sys.executable, str(builder)], 'outputs': ['phyml']} + with pytest.raises(ValueError): + fetch_mod.fetch('phyml', spec, str(tmp_path / 'bin')) + + +@pytest.mark.skipif(__import__('os').name == 'nt', reason='POSIX file modes') +def test_fetch_sets_mode_on_posix(tmp_path): + import os, stat + src = tmp_path / 'muscle-linux' + src.write_bytes(b'elf') + spec = {'url': src.as_uri(), 'sha256': _sha(src), 'save_as': 'muscle', 'mode': '755'} + fetch_mod.fetch('muscle', spec, str(tmp_path / 'bin')) + assert stat.S_IMODE(os.stat(tmp_path / 'bin' / 'muscle').st_mode) == 0o755 + + +def test_manifest_has_both_platforms_and_valid_hashes(): + import json, re + manifest = json.loads((ROOT / 'packaging' / 'third_party.json').read_text('utf-8')) + assert {'windows', 'linux'} <= set(manifest) + for section in ('windows', 'linux'): + assert manifest[section], section + for name, spec in manifest[section].items(): + assert re.fullmatch(r'[0-9a-f]{64}', spec['sha256']), (section, name) + assert spec['url'].startswith('https://'), (section, name) + assert sum(k in spec for k in ('extract', 'save_as', 'build')) == 1, (section, name) + + +def test_main_selects_platform_section(tmp_path, monkeypatch): + import json + src = tmp_path / 'tool' + src.write_bytes(b'x') + manifest = {'windows': {'a': {'url': src.as_uri(), 'sha256': _sha(src), 'save_as': 'a.exe'}}, + 'linux': {'b': {'url': src.as_uri(), 'sha256': _sha(src), 'save_as': 'b'}}} + mpath = tmp_path / 'm.json' + mpath.write_text(json.dumps(manifest), 'utf-8') + monkeypatch.setattr(fetch_mod, 'MANIFEST', str(mpath)) + assert fetch_mod.main(['--platform', 'linux', '--dest', str(tmp_path / 'out')]) == 0 + assert sorted(p.name for p in (tmp_path / 'out').iterdir()) == ['b'] From 377331b5673c360aaf45f04fd4159baf8f8c730c Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:39:51 +0300 Subject: [PATCH 07/25] Package the Windows zip with PyInstaller and smoke-test it packaging/package.py stamps the version into a build copy and runs PyInstaller (one bundle, two executables on Windows: the windowed GUI and a console phymlgui-cli.exe, since a windowed exe has no stdout). The CLI gains --version and the entry point a --smoke-gui check. A local 0.0.0-dev zip with all bundled tools (incl. RAxML-NG built in MSYS2) passed the smoke test: --version, PhyML+MUSCLE and IQ-TREE runs, window open/close. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 3 +- packaging/build_raxml_windows.sh | 1 + packaging/package.py | 118 +++++++++++++++++++++++++++++++ packaging/phymlgui.spec | 31 ++++++++ packaging/smoke_test.py | 100 ++++++++++++++++++++++++++ phyml_core/cli.py | 2 + phymlgui.py | 6 +- requirements-dev.txt | 1 + scripts/fetch_third_party.py | 5 +- tests/unit/test_package.py | 42 +++++++++++ 10 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 packaging/package.py create mode 100644 packaging/phymlgui.spec create mode 100644 packaging/smoke_test.py create mode 100644 tests/unit/test_package.py diff --git a/.gitignore b/.gitignore index a73ddc5..02f5aad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ phyml-mpi.exe /build /dist -phymlgui.spec +/phymlgui.spec __pycache__/ phyml_config.json phymlgui v1.1/ @@ -14,3 +14,4 @@ release.json release_resp.json asset_resp.json /bin/ +/build-bin/ diff --git a/packaging/build_raxml_windows.sh b/packaging/build_raxml_windows.sh index 52fe61f..da20104 100644 --- a/packaging/build_raxml_windows.sh +++ b/packaging/build_raxml_windows.sh @@ -4,6 +4,7 @@ # Run inside MSYS2 UCRT64 (mingw-w64-ucrt-x86_64-{gcc,cmake,ninja}). # Usage: build_raxml_windows.sh set -euo pipefail +[ -d /ucrt64/bin ] && export PATH="/ucrt64/bin:/usr/bin:$PATH" here=$(cd "$(dirname "$0")" && pwd) src_archive=$(cygpath -u "$1" 2>/dev/null || echo "$1") diff --git a/packaging/package.py b/packaging/package.py new file mode 100644 index 0000000..55dc37a --- /dev/null +++ b/packaging/package.py @@ -0,0 +1,118 @@ +"""Build phymlGUI release packages: a Windows zip and a Linux AppDir/AppImage. + + python packaging/package.py windows --version 2.0.0 --bin bin --out dist + python packaging/package.py linux --version 2.0.0 --bin bin --out dist --appimagetool appimagetool + +The application sources are copied to a temporary folder, __version__ is stamped +there (the repository is never modified), PyInstaller builds an onedir bundle, and +the analysis programs from --bin plus packaging/licenses/ are added. +""" +import argparse +import os +import re +import shutil +import subprocess +import sys +import tempfile +import zipfile + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +APP_SOURCES = ('phymlgui.py', 'phyml_core', 'phyml_ui', 'locales.json', 'icon.png', 'icon.ico') +TAG_RE = re.compile(r'v(\d+\.\d+\.\d+(?:-[0-9A-Za-z][0-9A-Za-z.]*)?)') + +WINDOWS_README = """phymlGUI {version} + +Start phymlgui.exe. Command line: phymlgui-cli.exe --file data.fasta +(or --batch folder, --version). + +The analysis programs are in bin/; their licenses are in licenses/. +MPI mode of PhyML needs Microsoft MPI (msmpisetup.exe from Microsoft). +Settings are kept next to phymlgui.exe, or in %APPDATA%\\phymlGUI if this +folder is read-only. +""" + + +def version_from_tag(tag): + """'v2.0.0' -> '2.0.0', 'v2.0.0-rc1' -> '2.0.0-rc1'; anything else -> ValueError.""" + m = TAG_RE.fullmatch(tag) + if not m: + raise ValueError(f'not a release tag (vX.Y.Z[-suffix]): {tag!r}') + return m.group(1) + + +def stamp_version(version, init_path): + """Rewrite __version__ in phyml_core/__init__.py at init_path (a build copy).""" + with open(init_path, encoding='utf-8') as f: + text = f.read() + text, n = re.subn(r'__version__\s*=\s*["\'][^"\']*["\']', f'__version__ = "{version}"', text) + if n != 1: + raise ValueError(f'__version__ not found in {init_path}') + with open(init_path, 'w', encoding='utf-8', newline='') as f: + f.write(text) + + +def _pyinstaller_bundle(version, work): + """Copy the sources into work/src, stamp the version, run PyInstaller -> bundle dir.""" + src = os.path.join(work, 'src') + os.makedirs(src) + for name in APP_SOURCES: + path = os.path.join(ROOT, name) + if os.path.isdir(path): + shutil.copytree(path, os.path.join(src, name), + ignore=shutil.ignore_patterns('__pycache__')) + elif os.path.isfile(path): + shutil.copy2(path, src) + os.makedirs(os.path.join(src, 'packaging')) + shutil.copy2(os.path.join(ROOT, 'packaging', 'phymlgui.spec'), os.path.join(src, 'packaging')) + stamp_version(version, os.path.join(src, 'phyml_core', '__init__.py')) + subprocess.run([sys.executable, '-m', 'PyInstaller', '--noconfirm', '--clean', + '--distpath', os.path.join(work, 'dist'), + '--workpath', os.path.join(work, 'build'), + os.path.join(src, 'packaging', 'phymlgui.spec')], check=True) + return os.path.join(work, 'dist', 'phymlgui') + + +def _copy_tools(bin_dir, target): + os.makedirs(target, exist_ok=True) + for name in sorted(os.listdir(bin_dir)): + shutil.copy2(os.path.join(bin_dir, name), os.path.join(target, name)) + + +def build_windows(version, bin_dir, out_dir): + """phymlGUI--windows-x64.zip with phymlGUI/{exe, _internal, bin, licenses}.""" + os.makedirs(out_dir, exist_ok=True) + with tempfile.TemporaryDirectory(prefix='phymlgui_pkg_') as work: + bundle = _pyinstaller_bundle(version, work) + app = os.path.join(work, 'phymlGUI') + shutil.move(bundle, app) + _copy_tools(bin_dir, os.path.join(app, 'bin')) + shutil.copytree(os.path.join(ROOT, 'packaging', 'licenses'), os.path.join(app, 'licenses')) + with open(os.path.join(app, 'README.txt'), 'w', encoding='utf-8', newline='\r\n') as f: + f.write(WINDOWS_README.format(version=version)) + out = os.path.join(out_dir, f'phymlGUI-{version}-windows-x64.zip') + with zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED) as z: + for folder, _, files in os.walk(app): + for name in files: + path = os.path.join(folder, name) + z.write(path, os.path.relpath(path, work)) + return out + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('platform', choices=['windows', 'linux']) + parser.add_argument('--version', required=True) + parser.add_argument('--bin', required=True, help='folder with the analysis programs') + parser.add_argument('--out', default='dist') + parser.add_argument('--appimagetool', help='path to appimagetool (linux)') + args = parser.parse_args(argv) + if args.platform == 'windows': + out = build_windows(args.version, args.bin, args.out) + else: + out = build_appimage(args.version, args.bin, args.out, args.appimagetool) + print(out) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/packaging/phymlgui.spec b/packaging/phymlgui.spec new file mode 100644 index 0000000..3d1144d --- /dev/null +++ b/packaging/phymlgui.spec @@ -0,0 +1,31 @@ +# -*- mode: python ; coding: utf-8 -*- +# PyInstaller spec for phymlGUI release packages (onedir), run by packaging/package.py +# from a temporary copy of the sources (SPECPATH = /packaging). +# Windows gets two executables sharing one _internal/: phymlgui.exe (windowed GUI) +# and phymlgui-cli.exe (console, for --file/--batch/--version). Linux gets one. +import os +import sys + +src = os.path.dirname(SPECPATH) +windows = sys.platform == 'win32' +icon = os.path.join(src, 'icon.ico') if windows else None + +a = Analysis( + [os.path.join(src, 'phymlgui.py')], + pathex=[src], + datas=[(os.path.join(src, 'locales.json'), '.'), (os.path.join(src, 'icon.png'), '.')], + hiddenimports=['openpyxl'], + excludes=['tkinter', 'pytest'], + noarchive=False, +) +pyz = PYZ(a.pure) + +gui = EXE(pyz, a.scripts, [], exclude_binaries=True, name='phymlgui', + console=not windows, icon=icon, upx=False) +targets = [gui] +if windows: + cli = EXE(pyz, a.scripts, [], exclude_binaries=True, name='phymlgui-cli', + console=True, icon=icon, upx=False) + targets.append(cli) + +coll = COLLECT(*targets, a.binaries, a.datas, strip=False, upx=False, name='phymlgui') diff --git a/packaging/smoke_test.py b/packaging/smoke_test.py new file mode 100644 index 0000000..23206e2 --- /dev/null +++ b/packaging/smoke_test.py @@ -0,0 +1,100 @@ +"""Smoke-test a built phymlGUI package (Windows zip or Linux AppImage/AppDir). + + python packaging/smoke_test.py --package dist/phymlGUI-2.0.0-windows-x64.zip --version 2.0.0 + python packaging/smoke_test.py --package dist/phymlGUI-2.0.0-x86_64.AppImage --version 2.0.0 --mpi + +Checks: --version; a CLI run on unaligned FASTA with the bundled MUSCLE and serial +PhyML; a CLI run with IQ-TREE; optionally an MPI PhyML run (Linux, OpenMPI from +PATH); the window opens offscreen and closes. Settings go to a temporary folder. +""" +import argparse +import json +import os +import subprocess +import sys +import tempfile +import zipfile + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(ROOT, 'tests', 'e2e')) + + +def _launchers(package, work): + """(cli argv prefix, gui argv prefix) for the package.""" + if package.endswith('.zip'): + with zipfile.ZipFile(package) as z: + z.extractall(work) + app = os.path.join(work, 'phymlGUI') + return [os.path.join(app, 'phymlgui-cli.exe')], [os.path.join(app, 'phymlgui.exe')] + if package.endswith('.AppImage'): + os.chmod(package, 0o755) + argv = [os.path.abspath(package), '--appimage-extract-and-run'] + return argv, argv + run = [os.path.join(package, 'AppRun')] # an AppDir + return run, run + + +def _run(argv, env, timeout=600): + r = subprocess.run(argv, capture_output=True, text=True, env=env, timeout=timeout, + encoding='utf-8', errors='replace') + return r.returncode, r.stdout + r.stderr + + +def _analysis(cli, env, work, name, overlay): + from datasets import make_dataset, write_fasta + names, _, unaligned = make_dataset() + folder = os.path.join(work, name) + os.makedirs(folder) + fasta = os.path.join(folder, 'unaligned.fasta') + write_fasta(fasta, names, unaligned) + config = os.path.join(work, f'{name}.json') + with open(config, 'w', encoding='utf-8') as f: + json.dump(overlay, f) + code, out = _run([*cli, '--file', fasta, '--config', config], env) + trees = [f for f in os.listdir(folder) if f.endswith(('_phyml_tree.txt', '.treefile'))] + return code == 0 and bool(trees), out + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--package', required=True) + parser.add_argument('--version', required=True) + parser.add_argument('--mpi', action='store_true', help='also run PhyML-MPI (Linux)') + args = parser.parse_args(argv) + failures = [] + with tempfile.TemporaryDirectory(prefix='phymlgui_smoke_') as work: + cli, gui = _launchers(os.path.abspath(args.package), work) + env = dict(os.environ, PHYMLGUI_DATA_DIR=os.path.join(work, 'data'), + QT_QPA_PLATFORM='offscreen') + + code, out = _run([*cli, '--version'], env, timeout=120) + ok = code == 0 and out.strip().endswith(f'phymlGUI {args.version}') + print(f'{"OK " if ok else "FAIL"} --version: {out.strip()!r}') + failures += [] if ok else ['--version'] + + base = {'datatype': 'nt', 'model': 'HKY85', 'mpi_np': '2', 'use_mpi': False} + checks = [ + ('phyml', dict(base, engine='phyml', support_method='-4')), + ('iqtree', dict(base, engine='iqtree', model='MFP', support_method='-4')), + ] + if args.mpi: + checks.append(('phyml-mpi', dict(base, engine='phyml', use_mpi=True, + support_method='bootstrap', bootstrap_replicates='4'))) + for name, overlay in checks: + ok, out = _analysis(cli, env, work, name, overlay) + print(f'{"OK " if ok else "FAIL"} {name} run') + if not ok: + failures.append(name) + print(out[-2000:]) + + code, out = _run([*gui, '--smoke-gui'], env, timeout=120) + print(f'{"OK " if code == 0 else "FAIL"} window opens and closes') + if code != 0: + failures.append('gui') + print(out[-2000:]) + print('SMOKE TEST ' + ('PASSED' if not failures else f'FAILED: {", ".join(failures)}')) + return 0 if not failures else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/phyml_core/cli.py b/phyml_core/cli.py index 159e2b0..31cac0c 100644 --- a/phyml_core/cli.py +++ b/phyml_core/cli.py @@ -17,6 +17,7 @@ from . import settings from .i18n import _t +from . import __version__ from .paths import AppPaths from .runner import PipelineRunner @@ -94,6 +95,7 @@ def main(argv=None) -> int: parser.add_argument('--file', help='single FASTA file') parser.add_argument('--batch', help='folder with FASTA files') parser.add_argument('--config', help='JSON object laid over the saved settings') + parser.add_argument('--version', action='version', version=f'phymlGUI {__version__}') try: args = parser.parse_args(argv) if not args.file and not args.batch: diff --git a/phymlgui.py b/phymlgui.py index 52cc3c0..37b70ef 100644 --- a/phymlgui.py +++ b/phymlgui.py @@ -7,7 +7,8 @@ def main(): - if len(sys.argv) > 1: + smoke_gui = sys.argv[1:] == ['--smoke-gui'] # packaging check: open and close the window + if len(sys.argv) > 1 and not smoke_gui: from phyml_core.cli import main as cli_main sys.exit(cli_main()) from PySide6.QtWidgets import QApplication @@ -20,6 +21,9 @@ def main(): QMessageBox.critical(None, 'phymlGUI', str(e)) sys.exit(1) window.show() + if smoke_gui: + from PySide6.QtCore import QTimer + QTimer.singleShot(1500, window.close) sys.exit(app.exec()) diff --git a/requirements-dev.txt b/requirements-dev.txt index f6c9b3a..f0e01a6 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,2 +1,3 @@ pytest>=8 pytest-qt>=4.4 +pyinstaller>=6 diff --git a/scripts/fetch_third_party.py b/scripts/fetch_third_party.py index 225d614..e40c0d6 100644 --- a/scripts/fetch_third_party.py +++ b/scripts/fetch_third_party.py @@ -62,7 +62,10 @@ def _extract(archive, members, dest): def _build(spec, archive, dest): - subprocess.run([*spec['build'], archive, dest], check=True, cwd=ROOT) + command = list(spec['build']) + if command[0] == 'bash' and os.environ.get('PHYMLGUI_BASH'): + command[0] = os.environ['PHYMLGUI_BASH'] # e.g. MSYS2's bash on Windows + subprocess.run([*command, archive, dest], check=True, cwd=ROOT) written = [os.path.join(dest, name) for name in spec.get('outputs', [])] missing = [p for p in written if not os.path.isfile(p)] if missing: diff --git a/tests/unit/test_package.py b/tests/unit/test_package.py new file mode 100644 index 0000000..94c2312 --- /dev/null +++ b/tests/unit/test_package.py @@ -0,0 +1,42 @@ +"""Release packaging helpers (packaging/package.py) and the --version flag.""" +import importlib.util +import subprocess +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[2] +_spec = importlib.util.spec_from_file_location('package', ROOT / 'packaging' / 'package.py') +package = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(package) + + +@pytest.mark.parametrize('tag, version', [('v2.0.0', '2.0.0'), ('v2.0.0-rc1', '2.0.0-rc1'), + ('v10.11.12', '10.11.12')]) +def test_version_from_tag(tag, version): + assert package.version_from_tag(tag) == version + + +@pytest.mark.parametrize('tag', ['2.0.0', 'v2', 'v2.0', 'release-1', 'v2.0.0 ', 'v2.0.0-']) +def test_version_from_tag_rejects(tag): + with pytest.raises(ValueError): + package.version_from_tag(tag) + + +def test_stamp_version_does_not_touch_repo_file(tmp_path): + repo_init = ROOT / 'phyml_core' / '__init__.py' + before = repo_init.read_bytes() + copy = tmp_path / '__init__.py' + copy.write_bytes(before) + package.stamp_version('2.0.0-rc1', str(copy)) + assert '__version__ = "2.0.0-rc1"' in copy.read_text('utf-8') + assert repo_init.read_bytes() == before + + +def test_cli_version_flag(): + from phyml_core import __version__ + r = subprocess.run([sys.executable, str(ROOT / 'phymlgui.py'), '--version'], + capture_output=True, text=True, cwd=str(ROOT), timeout=60) + assert r.returncode == 0, r.stderr + assert r.stdout.strip() == f'phymlGUI {__version__}' From d39660c261749b2ab1db9bbc07407bd336cfb68c Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:43:55 +0300 Subject: [PATCH 08/25] Build and smoke-test the Linux AppImage package.py builds an AppDir (AppRun, .desktop, icon, PyInstaller bundle in usr/bin, tools in usr/bin/bin, licenses) and packs it with the pinned appimagetool 1.9.1 and type2 runtime 20251108 (--runtime-file, so nothing unpinned is downloaded at build time). Inside an AppImage the app folder is never used for settings: with --appimage-extract-and-run it is a throwaway temp copy. A local 0.0.0-dev AppImage passed the smoke test in Ubuntu incl. a PhyML-MPI run over OpenMPI. Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 2 ++ packaging/appimage/AppRun | 4 +++ packaging/appimage/phymlgui.desktop | 8 ++++++ packaging/package.py | 38 ++++++++++++++++++++++++++++- packaging/third_party.json | 34 +++++++++++++++++++++++--- phyml_core/paths.py | 2 +- tests/unit/test_platform.py | 9 +++++++ 7 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 packaging/appimage/AppRun create mode 100644 packaging/appimage/phymlgui.desktop diff --git a/.gitattributes b/.gitattributes index d9b8307..39a0aff 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ # patches are applied to upstream LF sources: never convert their line endings *.patch text eol=lf *.sh text eol=lf +packaging/appimage/AppRun text eol=lf +*.desktop text eol=lf diff --git a/packaging/appimage/AppRun b/packaging/appimage/AppRun new file mode 100644 index 0000000..e6dcdcb --- /dev/null +++ b/packaging/appimage/AppRun @@ -0,0 +1,4 @@ +#!/bin/sh +# AppImage entry point: run the bundled phymlGUI (GUI without arguments, CLI with them) +HERE="$(dirname "$(readlink -f "$0")")" +exec "$HERE/usr/bin/phymlgui" "$@" diff --git a/packaging/appimage/phymlgui.desktop b/packaging/appimage/phymlgui.desktop new file mode 100644 index 0000000..3863eeb --- /dev/null +++ b/packaging/appimage/phymlgui.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=phymlGUI +Comment=Maximum-likelihood phylogenetics with PhyML, IQ-TREE and RAxML-NG +Exec=phymlgui +Icon=phymlgui +Categories=Science;Biology; +Terminal=false diff --git a/packaging/package.py b/packaging/package.py index 55dc37a..6d41d64 100644 --- a/packaging/package.py +++ b/packaging/package.py @@ -98,6 +98,41 @@ def build_windows(version, bin_dir, out_dir): return out +def build_appdir(version, bin_dir, out_dir): + """An AppDir in out_dir: AppRun, .desktop, icon, usr/bin/{phymlgui, _internal, bin/}.""" + appdir = os.path.join(out_dir, 'phymlGUI.AppDir') + shutil.rmtree(appdir, ignore_errors=True) + os.makedirs(out_dir, exist_ok=True) + with tempfile.TemporaryDirectory(prefix='phymlgui_pkg_') as work: + bundle = _pyinstaller_bundle(version, work) + usr_bin = os.path.join(appdir, 'usr', 'bin') + shutil.copytree(bundle, usr_bin) + _copy_tools(bin_dir, os.path.join(usr_bin, 'bin')) + for name in os.listdir(os.path.join(usr_bin, 'bin')): + os.chmod(os.path.join(usr_bin, 'bin', name), 0o755) + shutil.copytree(os.path.join(ROOT, 'packaging', 'licenses'), + os.path.join(appdir, 'usr', 'share', 'licenses', 'phymlgui')) + apprun = os.path.join(appdir, 'AppRun') + shutil.copy2(os.path.join(ROOT, 'packaging', 'appimage', 'AppRun'), apprun) + os.chmod(apprun, 0o755) + shutil.copy2(os.path.join(ROOT, 'packaging', 'appimage', 'phymlgui.desktop'), appdir) + shutil.copy2(os.path.join(ROOT, 'icon.png'), os.path.join(appdir, 'phymlgui.png')) + return appdir + + +def build_appimage(version, bin_dir, out_dir, appimagetool, runtime=None): + """phymlGUI--x86_64.AppImage built by the pinned appimagetool (and runtime).""" + if not appimagetool: + raise ValueError('--appimagetool is required for linux') + appdir = build_appdir(version, bin_dir, out_dir) + out = os.path.join(out_dir, f'phymlGUI-{version}-x86_64.AppImage') + command = [appimagetool, '--appimage-extract-and-run'] # no FUSE needed on CI + if runtime: + command += ['--runtime-file', runtime] + subprocess.run([*command, appdir, out], check=True, env=dict(os.environ, ARCH='x86_64')) + return out + + def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('platform', choices=['windows', 'linux']) @@ -105,11 +140,12 @@ def main(argv=None): parser.add_argument('--bin', required=True, help='folder with the analysis programs') parser.add_argument('--out', default='dist') parser.add_argument('--appimagetool', help='path to appimagetool (linux)') + parser.add_argument('--runtime', help='path to the pinned AppImage runtime (linux)') args = parser.parse_args(argv) if args.platform == 'windows': out = build_windows(args.version, args.bin, args.out) else: - out = build_appimage(args.version, args.bin, args.out, args.appimagetool) + out = build_appimage(args.version, args.bin, args.out, args.appimagetool, args.runtime) print(out) return 0 diff --git a/packaging/third_party.json b/packaging/third_party.json index 2dbb2d3..42afec4 100644 --- a/packaging/third_party.json +++ b/packaging/third_party.json @@ -27,8 +27,13 @@ "version": "2.0.3 (native build, packaging/patches/raxml-ng-2.0.3-windows.patch)", "url": "https://github.com/amkozlov/raxml-ng/releases/download/2.0.3/raxml-ng_v2.0.3_source.zip", "sha256": "7cd3fa6b1de373777d688032c9ec6731078b67e6a812d7a1d779295d016843d2", - "build": ["bash", "packaging/build_raxml_windows.sh"], - "outputs": ["raxml-ng.exe"] + "build": [ + "bash", + "packaging/build_raxml_windows.sh" + ], + "outputs": [ + "raxml-ng.exe" + ] } }, "linux": { @@ -52,8 +57,14 @@ "version": "3.3.20260528", "url": "https://github.com/stephaneguindon/phyml/archive/refs/tags/v3.3.20260528.tar.gz", "sha256": "42451c46de7cd01f8ca67d657766acf5b02f61027127bdda87efe3cdb422b297", - "build": ["bash", "packaging/build_phyml_linux.sh"], - "outputs": ["phyml", "phyml-mpi"] + "build": [ + "bash", + "packaging/build_phyml_linux.sh" + ], + "outputs": [ + "phyml", + "phyml-mpi" + ] }, "raxml": { "version": "2.0.3", @@ -64,5 +75,20 @@ }, "mode": "755" } + }, + "build_tools": { + "appimagetool": { + "version": "1.9.1", + "url": "https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage", + "sha256": "ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0", + "save_as": "appimagetool", + "mode": "755" + }, + "appimage_runtime": { + "version": "20251108", + "url": "https://github.com/AppImage/type2-runtime/releases/download/20251108/runtime-x86_64", + "sha256": "2fca8b443c92510f1483a883f60061ad09b46b978b2631c807cd873a47ec260d", + "save_as": "runtime-x86_64" + } } } diff --git a/phyml_core/paths.py b/phyml_core/paths.py index 1caefd1..f720377 100644 --- a/phyml_core/paths.py +++ b/phyml_core/paths.py @@ -113,7 +113,7 @@ def detect(cls, env: Optional[Mapping[str, str]] = None, override = env.get(DATA_DIR_ENV) if override: data = override - elif is_writable(app): + elif not env.get('APPIMAGE') and is_writable(app): # an AppImage's folder is throwaway data = app elif platform == 'nt': base = env.get('APPDATA') or os.path.join(os.path.expanduser('~'), 'AppData', 'Roaming') diff --git a/tests/unit/test_platform.py b/tests/unit/test_platform.py index 4b3b06c..48d21a6 100644 --- a/tests/unit/test_platform.py +++ b/tests/unit/test_platform.py @@ -66,3 +66,12 @@ def test_windows_config_loads_on_linux(tmp_path, monkeypatch): assert cfg['mpirun_path'] == 'mpirun' issues = PhyML().validate(dict(cfg, mpi_np='2'), paths) assert issues and issues[0].key == 'val_no_exe' + + +def test_detect_never_uses_app_dir_inside_an_appimage(tmp_path): + """--appimage-extract-and-run unpacks into a writable temp folder; settings must + still go to ~/.config/phymlGUI, not into that throwaway folder.""" + p = AppPaths.detect(env={'APPIMAGE': '/home/u/phymlGUI.AppImage', 'HOME': str(tmp_path)}, + is_writable=lambda d: True, app_dir=str(tmp_path / 'squashfs-root' / 'usr' / 'bin'), + platform='posix') + assert p.data_dir == str(tmp_path / '.config' / 'phymlGUI') From d7007e106e181b5764e768bd4c739932de2b8a1e Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:45:49 +0300 Subject: [PATCH 09/25] Add the RAxML-NG Windows vs Linux parity check Two steps because the binaries run on different CI runners: 'run' executes an ML search, 50 bootstraps and a fixed-tree evaluation (seed 42) on a synthetic alignment; 'compare' requires RF 0 and |dlnL| < 1e-3 for the best tree, identical replicates and the same fixed-tree lnL to 6 decimals. The locally built raxml-ng.exe matches the official Linux binary. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 1 + packaging/raxml_parity.py | 143 ++++++++++++++++++++++++++++++++ tests/unit/test_raxml_parity.py | 54 ++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 packaging/raxml_parity.py create mode 100644 tests/unit/test_raxml_parity.py diff --git a/.gitignore b/.gitignore index 02f5aad..50ba777 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ release_resp.json asset_resp.json /bin/ /build-bin/ +/build-parity-*/ diff --git a/packaging/raxml_parity.py b/packaging/raxml_parity.py new file mode 100644 index 0000000..683895f --- /dev/null +++ b/packaging/raxml_parity.py @@ -0,0 +1,143 @@ +"""Check that our Windows RAxML-NG build matches the official Linux binary. + +The two binaries run on different machines in CI, so this has two steps: + + python packaging/raxml_parity.py run --exe raxml-ng.exe --out parity-windows + python packaging/raxml_parity.py run --exe ./raxml-ng --out parity-linux + python packaging/raxml_parity.py compare parity-windows parity-linux + +`run` builds a fixed synthetic alignment and runs, with --seed 42: an ML search, +50 bootstrap replicates, and a likelihood evaluation of a fixed tree under JC. +`compare` applies the rules from the RAxML-NG Windows spike: identical best tree +(RF 0) with |ΔlnL| < 1e-3, identical bootstrap replicates, and the same +fixed-tree likelihood to 6 decimals. +""" +import argparse +import io +import os +import re +import subprocess +import sys + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +LNL_TOLERANCE = 1e-3 +FIXED_TREE = ('(((A1_testsp:0.02,A2_testsp:0.02):0.02,(A3_testsp:0.02,A4_testsp:0.02):0.02):0.15,' + '((B1_testsp:0.02,B2_testsp:0.02):0.02,(B3_testsp:0.02,B4_testsp:0.02):0.02):0.15);') + + +def _read(folder, name): + with open(os.path.join(folder, name), encoding='utf-8', errors='replace') as f: + return f.read().replace('\r\n', '\n') + + +def _lnl(text): + m = re.search(r'Final LogLikelihood:\s*(-?[\d.]+)', text) + if not m: + raise ValueError('no "Final LogLikelihood" line') + return float(m.group(1)) + + +def _splits(newick): + from Bio import Phylo + tree = Phylo.read(io.StringIO(newick), 'newick') + names = {t.name for t in tree.get_terminals()} + anchor = min(names) + out = set() + for clade in tree.get_nonterminals(): + side = frozenset(t.name for t in clade.get_terminals()) + side = side if anchor not in side else frozenset(names - side) + if 1 < len(side) < len(names) - 1: + out.add(side) + return out + + +def compare(win_dir, lin_dir): + """Differences between the two output folders; an empty list means they match.""" + problems = [] + + def check(name, test): + try: + message = test(_read(win_dir, name), _read(lin_dir, name)) + except (OSError, ValueError) as e: + message = str(e) + if message: + problems.append(f'{name}: {message}') + + def best_tree(w, l): + if _splits(w.strip()) != _splits(l.strip()): + return 'best trees differ (RF > 0)' + + def search_lnl(w, l): + diff = abs(_lnl(w) - _lnl(l)) + if diff >= LNL_TOLERANCE: + return f'|ΔlnL| = {diff:.2e} >= {LNL_TOLERANCE:g}' + + def bootstraps(w, l): + win_trees = [t for t in w.splitlines() if t.strip()] + lin_trees = [t for t in l.splitlines() if t.strip()] + if len(win_trees) != len(lin_trees): + return f'{len(win_trees)} vs {len(lin_trees)} replicates' + differing = sum(_splits(a) != _splits(b) for a, b in zip(win_trees, lin_trees)) + if differing: + return f'{differing} of {len(win_trees)} replicate trees differ' + + def fixed(w, l): + if round(_lnl(w), 6) != round(_lnl(l), 6): + return f'fixed-tree lnL {_lnl(w)} vs {_lnl(l)}' + + check('search.raxml.bestTree', best_tree) + check('search.raxml.log', search_lnl) + check('boot.raxml.bootstraps', bootstraps) + check('eval.raxml.log', fixed) + return problems + + +def run(exe, out): + """Run the parity analyses with exe into out (inputs are generated here).""" + sys.path.insert(0, os.path.join(ROOT, 'tests', 'e2e')) + sys.path.insert(0, ROOT) + from datasets import make_dataset, write_fasta + from phyml_core import alignment + os.makedirs(out, exist_ok=True) + names, aligned, _ = make_dataset() + fasta = os.path.join(out, 'parity.fasta') + write_fasta(fasta, names, aligned) + phy = os.path.join(out, 'parity.phy') + alignment.write_phylip(alignment.read_fasta(fasta), phy) + with open(os.path.join(out, 'fixed.tree'), 'w') as f: + f.write(FIXED_TREE + '\n') + common = ['--msa', 'parity.phy', '--seed', '42', '--redo'] + runs = [ + ['--search', *common, '--model', 'GTR+G', '--threads', '1', '--prefix', 'search'], + ['--bootstrap', *common, '--model', 'GTR+G', '--threads', '2', '--bs-trees', '50', + '--prefix', 'boot'], + ['--evaluate', *common, '--model', 'JC', '--tree', 'fixed.tree', '--opt-model', 'off', + '--opt-branches', 'off', '--threads', '1', '--prefix', 'eval'], + ] + for args in runs: + subprocess.run([os.path.abspath(exe), *args], cwd=out, check=True, + stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest='command', required=True) + r = sub.add_parser('run') + r.add_argument('--exe', required=True) + r.add_argument('--out', required=True) + c = sub.add_parser('compare') + c.add_argument('win_dir') + c.add_argument('lin_dir') + args = parser.parse_args(argv) + if args.command == 'run': + run(args.exe, args.out) + return 0 + problems = compare(args.win_dir, args.lin_dir) + for p in problems: + print('DIFF', p) + print('RAxML-NG parity: ' + ('OK' if not problems else f'{len(problems)} difference(s)')) + return 1 if problems else 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tests/unit/test_raxml_parity.py b/tests/unit/test_raxml_parity.py new file mode 100644 index 0000000..d25f140 --- /dev/null +++ b/tests/unit/test_raxml_parity.py @@ -0,0 +1,54 @@ +"""RAxML-NG Windows vs Linux parity check (packaging/raxml_parity.py).""" +import importlib.util +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +_spec = importlib.util.spec_from_file_location('raxml_parity', ROOT / 'packaging' / 'raxml_parity.py') +parity = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(parity) + +TREE = '((A:0.1,B:0.2):0.05,(C:0.1,D:0.3):0.05,E:0.2);\n' +SWAPPED = '((A:0.1,C:0.2):0.05,(B:0.1,D:0.3):0.05,E:0.2);\n' + + +def _outputs(folder, best=TREE, boots=(TREE, SWAPPED), lnl='-1823.506511', fixed='-1900.123456'): + folder.mkdir(parents=True) + (folder / 'search.raxml.bestTree').write_text(best) + (folder / 'search.raxml.log').write_text(f'... Final LogLikelihood: {lnl}\n') + (folder / 'boot.raxml.bootstraps').write_text(''.join(boots)) + (folder / 'eval.raxml.log').write_text(f'Final LogLikelihood: {fixed}\n') + return str(folder) + + +def test_identical_outputs_match(tmp_path): + assert parity.compare(_outputs(tmp_path / 'w'), _outputs(tmp_path / 'l')) == [] + + +def test_crlf_and_tiny_lnl_difference_still_match(tmp_path): + win = _outputs(tmp_path / 'w', best=TREE.replace('\n', '\r\n'), lnl='-1823.5066') + assert parity.compare(win, _outputs(tmp_path / 'l')) == [] + + +def test_different_best_tree_is_reported(tmp_path): + problems = parity.compare(_outputs(tmp_path / 'w', best=SWAPPED), _outputs(tmp_path / 'l')) + assert len(problems) == 1 and 'search.raxml.bestTree' in problems[0] + + +def test_lnl_difference_is_reported(tmp_path): + problems = parity.compare(_outputs(tmp_path / 'w', lnl='-1823.40'), _outputs(tmp_path / 'l')) + assert len(problems) == 1 and 'search.raxml.log' in problems[0] + + +def test_bootstrap_and_fixed_tree_differences_are_reported(tmp_path): + win = _outputs(tmp_path / 'w', boots=(TREE, TREE), fixed='-1900.123999') + problems = parity.compare(win, _outputs(tmp_path / 'l')) + assert len(problems) == 2 + assert any('bootstraps' in p for p in problems) and any('eval.raxml.log' in p for p in problems) + + +def test_missing_file_is_reported(tmp_path): + lin = _outputs(tmp_path / 'l') + win = _outputs(tmp_path / 'w') + (Path(win) / 'boot.raxml.bootstraps').unlink() + problems = parity.compare(win, lin) + assert problems and 'boot.raxml.bootstraps' in problems[0] From 865c8563294c9202669e0fe9eb9d46390a0db82e Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 10:49:53 +0300 Subject: [PATCH 10/25] Add the release workflow: tools, packages, smoke tests, draft release Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release.yml | 261 ++++++++++++++++++++++++++++++++ packaging/release_meta.py | 106 +++++++++++++ tests/unit/test_release_meta.py | 61 ++++++++ 3 files changed, 428 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 packaging/release_meta.py create mode 100644 tests/unit/test_release_meta.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8c4ec53 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,261 @@ +name: release + +# A tag vX.Y.Z[-suffix] builds both packages and creates a DRAFT release (never +# published automatically). A manual run builds and tests everything but uploads +# nothing to Releases: the packages stay as workflow artifacts. +on: + push: + tags: ['v*'] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +env: + PYTHON_VERSION: '3.13' + +jobs: + version: + runs-on: ubuntu-22.04 + timeout-minutes: 5 + outputs: + version: ${{ steps.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + - name: Check the tag and derive the version + id: version + run: | + version=$(python3 packaging/release_meta.py version "$GITHUB_REF") + echo "version=$version" >> "$GITHUB_OUTPUT" + + tests: + needs: version + uses: ./.github/workflows/tests.yml + + tools-windows: + needs: version + runs-on: windows-latest + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - uses: msys2/setup-msys2@v2 + id: msys2 + with: + msystem: UCRT64 + update: true + install: >- + git unzip + mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja + - name: Cache Windows programs + id: cache + uses: actions/cache@v4 + with: + path: bin + key: release-bin-windows-${{ hashFiles('packaging/third_party.json', 'packaging/build_raxml_windows.sh', 'packaging/patches/**') }} + - name: Fetch programs and build RAxML-NG + if: steps.cache.outputs.cache-hit != 'true' + shell: pwsh + run: | + $env:PHYMLGUI_BASH = Join-Path '${{ steps.msys2.outputs.msys2-location }}' 'usr\bin\bash.exe' + python scripts/fetch_third_party.py --platform windows --dest bin + - name: Install dependencies + run: pip install -r requirements.txt + - name: RAxML-NG parity run (Windows build) + run: python packaging/raxml_parity.py run --exe bin/raxml-ng.exe --out parity-windows + - uses: actions/upload-artifact@v4 + with: + name: bin-windows + path: bin + - uses: actions/upload-artifact@v4 + with: + name: parity-windows + path: parity-windows + + tools-linux: + needs: version + runs-on: ubuntu-22.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Install build tools and OpenMPI + run: > + sudo apt-get update && sudo apt-get install -y + openmpi-bin libopenmpi-dev build-essential autoconf automake libtool pkg-config + - name: Cache Linux programs + id: cache + uses: actions/cache@v4 + with: + path: bin + key: release-bin-linux-${{ hashFiles('packaging/third_party.json', 'packaging/build_phyml_linux.sh') }} + - name: Fetch programs and build PhyML / PhyML-MPI + if: steps.cache.outputs.cache-hit != 'true' + run: python scripts/fetch_third_party.py --platform linux --dest bin + - name: Install dependencies + run: pip install -r requirements.txt + - name: RAxML-NG parity run (official Linux build) + run: python packaging/raxml_parity.py run --exe bin/raxml-ng --out parity-linux + # tar keeps the executable bits that upload-artifact would drop + - name: Pack programs + run: tar -czf bin-linux.tar.gz bin + - uses: actions/upload-artifact@v4 + with: + name: bin-linux + path: bin-linux.tar.gz + - uses: actions/upload-artifact@v4 + with: + name: parity-linux + path: parity-linux + + raxml-parity: + needs: [tools-windows, tools-linux] + runs-on: ubuntu-22.04 + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - run: pip install biopython + - uses: actions/download-artifact@v4 + with: + name: parity-windows + path: parity-windows + - uses: actions/download-artifact@v4 + with: + name: parity-linux + path: parity-linux + - name: Compare the Windows build with the official Linux build + run: python packaging/raxml_parity.py compare parity-windows parity-linux + + package-windows: + needs: [version, tests, raxml-parity] + runs-on: windows-latest + timeout-minutes: 40 + env: + VERSION: ${{ needs.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - run: pip install -r requirements.txt pyinstaller + - uses: actions/download-artifact@v4 + with: + name: bin-windows + path: bin + - name: Build the zip + run: python packaging/package.py windows --version "$env:VERSION" --bin bin --out dist + - name: Smoke test + run: python packaging/smoke_test.py --package "dist/phymlGUI-$env:VERSION-windows-x64.zip" --version "$env:VERSION" + - uses: actions/upload-artifact@v4 + with: + name: package-windows + path: dist/phymlGUI-*-windows-x64.zip + + package-linux: + needs: [version, tests, raxml-parity] + runs-on: ubuntu-22.04 + timeout-minutes: 40 + env: + VERSION: ${{ needs.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Install Qt runtime libraries and OpenMPI + run: > + sudo apt-get update && sudo apt-get install -y + libegl1 libgl1 libxkbcommon0 libxkbcommon-x11-0 libdbus-1-3 libfontconfig1 libxcb-cursor0 + openmpi-bin + - run: pip install -r requirements.txt pyinstaller + - uses: actions/download-artifact@v4 + with: + name: bin-linux + - run: tar -xzf bin-linux.tar.gz + - name: Fetch the pinned appimagetool and runtime + run: python scripts/fetch_third_party.py --platform build_tools --dest tools + - name: Build the AppImage + run: > + python packaging/package.py linux --version "$VERSION" --bin bin --out dist + --appimagetool tools/appimagetool --runtime tools/runtime-x86_64 + - name: Smoke test (with OpenMPI) + run: python packaging/smoke_test.py --package "dist/phymlGUI-$VERSION-x86_64.AppImage" --version "$VERSION" --mpi + - name: Run in a clean ubuntu:22.04 container + run: | + mkdir check + cp "dist/phymlGUI-$VERSION-x86_64.AppImage" check/phymlgui.AppImage + python - <<'EOF' + import json, sys + sys.path.insert(0, 'tests/e2e') + from datasets import make_dataset, write_fasta + names, _, unaligned = make_dataset() + write_fasta('check/unaligned.fasta', names, unaligned) + json.dump({'engine': 'phyml', 'datatype': 'nt', 'model': 'HKY85', + 'support_method': '-4', 'use_mpi': False}, open('check/config.json', 'w')) + EOF + docker run --rm -v "$PWD/check:/check" -w /check ubuntu:22.04 sh -c ' + set -e + ./phymlgui.AppImage --appimage-extract-and-run --version + ./phymlgui.AppImage --appimage-extract-and-run --file unaligned.fasta --config config.json + ls *_phyml_tree.txt' + - uses: actions/upload-artifact@v4 + with: + name: package-linux + path: dist/phymlGUI-*-x86_64.AppImage + + release: + if: startsWith(github.ref, 'refs/tags/v') + needs: [version, package-windows, package-linux] + runs-on: ubuntu-22.04 + timeout-minutes: 15 + permissions: + contents: write + env: + VERSION: ${{ needs.version.outputs.version }} + TAG: ${{ github.ref_name }} + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + pattern: package-* + path: out + merge-multiple: true + - name: RAxML-NG sources and the Windows patch (AGPL-3.0) + run: | + url=$(python3 -c "import json; print(json.load(open('packaging/third_party.json'))['windows']['raxml']['url'])") + sha=$(python3 -c "import json; print(json.load(open('packaging/third_party.json'))['windows']['raxml']['sha256'])") + mkdir src && curl -fsSL -o src/raxml-ng_v2.0.3_source.zip "$url" + echo "$sha src/raxml-ng_v2.0.3_source.zip" | sha256sum -c - + python3 packaging/release_meta.py raxml-source src/raxml-ng_v2.0.3_source.zip \ + packaging/patches/raxml-ng-2.0.3-windows.patch out/raxml-ng-2.0.3-source+patch.tar.gz + - name: Checksums and release notes + run: | + python3 packaging/release_meta.py sha256sums out/SHA256SUMS \ + out/phymlGUI-*-windows-x64.zip out/phymlGUI-*-x86_64.AppImage out/raxml-ng-2.0.3-source+patch.tar.gz + python3 packaging/release_meta.py notes "$VERSION" notes.md + - name: Create or update the draft release + run: | + files=(out/phymlGUI-*-windows-x64.zip out/phymlGUI-*-x86_64.AppImage + out/raxml-ng-2.0.3-source+patch.tar.gz out/SHA256SUMS) + if draft=$(gh release view "$TAG" --json isDraft -q .isDraft 2>/dev/null); then + if [ "$draft" != "true" ]; then + echo "::error::release $TAG is already published; not touching it" + exit 1 + fi + gh release upload "$TAG" "${files[@]}" --clobber + else + gh release create "$TAG" --draft --verify-tag --title "phymlGUI $VERSION" \ + --notes-file notes.md "${files[@]}" + fi diff --git a/packaging/release_meta.py b/packaging/release_meta.py new file mode 100644 index 0000000..9a8be5f --- /dev/null +++ b/packaging/release_meta.py @@ -0,0 +1,106 @@ +"""Release metadata for the GitHub workflow: version, SHA256SUMS, notes, AGPL sources. + + python packaging/release_meta.py version "$GITHUB_REF" + python packaging/release_meta.py sha256sums out/SHA256SUMS out/*.zip out/*.AppImage + python packaging/release_meta.py notes 2.0.0 out/notes.md + python packaging/release_meta.py raxml-source +""" +import argparse +import hashlib +import importlib.util +import json +import os +import sys +import tarfile + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +MANIFEST = os.path.join(ROOT, 'packaging', 'third_party.json') +DEV_VERSION = '0.0.0-dev' + +_spec = importlib.util.spec_from_file_location('package', os.path.join(ROOT, 'packaging', 'package.py')) +_package = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_package) + +NOTES = """phymlGUI {version} + +Downloads: +- `phymlGUI-{version}-windows-x64.zip` - unpack and start `phymlgui.exe` + (command line: `phymlgui-cli.exe`). MPI mode of PhyML needs Microsoft MPI. +- `phymlGUI-{version}-x86_64.AppImage` - `chmod +x` and run; without FUSE use + `--appimage-extract-and-run`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`). +- `SHA256SUMS` - checksums of the files above. +- `raxml-ng-2.0.3-source+patch.tar.gz` - RAxML-NG sources and the patch used for the + Windows build (AGPL-3.0). + +Bundled programs: +{tools} +""" + + +def version_for_ref(ref): + """'refs/tags/vX.Y.Z[-s]' -> 'X.Y.Z[-s]' (ValueError for any other tag); + a branch ref (manual run) -> '0.0.0-dev'.""" + if ref.startswith('refs/tags/'): + return _package.version_from_tag(ref[len('refs/tags/'):]) + return DEV_VERSION + + +def write_sha256sums(files, out): + with open(out, 'w', encoding='utf-8', newline='\n') as f: + for path in files: + with open(path, 'rb') as src: + digest = hashlib.sha256(src.read()).hexdigest() + f.write(f'{digest} {os.path.basename(path)}\n') + + +def release_notes(version, manifest): + lines = [] + for section, label in (('windows', 'Windows'), ('linux', 'Linux')): + for name, spec in manifest[section].items(): + lines.append(f'- {label}: {name} {spec["version"]}') + return NOTES.format(version=version, tools='\n'.join(lines)) + + +def raxml_source_bundle(source_zip, patch, out): + """A tar.gz with the official RAxML-NG source zip and our Windows patch.""" + folder = 'raxml-ng-2.0.3-source+patch' + with tarfile.open(out, 'w:gz') as t: + t.add(source_zip, arcname=f'{folder}/{os.path.basename(source_zip)}') + t.add(patch, arcname=f'{folder}/raxml-ng-2.0.3-windows.patch') + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest='command', required=True) + sub.add_parser('version').add_argument('ref') + s = sub.add_parser('sha256sums') + s.add_argument('out') + s.add_argument('files', nargs='+') + n = sub.add_parser('notes') + n.add_argument('version') + n.add_argument('out') + r = sub.add_parser('raxml-source') + r.add_argument('source_zip') + r.add_argument('patch') + r.add_argument('out') + args = parser.parse_args(argv) + if args.command == 'version': + try: + print(version_for_ref(args.ref)) + except ValueError as e: + print(e, file=sys.stderr) + return 2 + elif args.command == 'sha256sums': + write_sha256sums(args.files, args.out) + elif args.command == 'notes': + with open(MANIFEST, encoding='utf-8') as f: + manifest = json.load(f) + with open(args.out, 'w', encoding='utf-8', newline='\n') as f: + f.write(release_notes(args.version, manifest)) + else: + raxml_source_bundle(args.source_zip, args.patch, args.out) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tests/unit/test_release_meta.py b/tests/unit/test_release_meta.py new file mode 100644 index 0000000..2e5af25 --- /dev/null +++ b/tests/unit/test_release_meta.py @@ -0,0 +1,61 @@ +"""Release metadata helpers (packaging/release_meta.py).""" +import hashlib +import importlib.util +import json +import tarfile +import zipfile +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[2] +_spec = importlib.util.spec_from_file_location('release_meta', ROOT / 'packaging' / 'release_meta.py') +meta = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(meta) + + +@pytest.mark.parametrize('ref, version', [('refs/tags/v2.0.0', '2.0.0'), + ('refs/tags/v2.0.0-rc1', '2.0.0-rc1'), + ('refs/heads/release', '0.0.0-dev')]) +def test_release_version_from_ref(ref, version): + assert meta.version_for_ref(ref) == version + + +@pytest.mark.parametrize('ref', ['refs/tags/release-1', 'refs/tags/v2', 'refs/tags/2.0.0']) +def test_release_tag_validation(ref): + with pytest.raises(ValueError): + meta.version_for_ref(ref) + + +def test_sha256sums_format(tmp_path): + a, b = tmp_path / 'a.zip', tmp_path / 'b.AppImage' + a.write_bytes(b'one') + b.write_bytes(b'two') + out = tmp_path / 'SHA256SUMS' + meta.write_sha256sums([str(a), str(b)], str(out)) + lines = out.read_text('utf-8').splitlines() + assert lines == [f'{hashlib.sha256(b"one").hexdigest()} a.zip', + f'{hashlib.sha256(b"two").hexdigest()} b.AppImage'] + + +def test_release_notes_lists_tools(): + manifest = json.loads((ROOT / 'packaging' / 'third_party.json').read_text('utf-8')) + notes = meta.release_notes('2.0.0', manifest) + assert 'phymlGUI 2.0.0' in notes + for section in ('windows', 'linux'): + for name, spec in manifest[section].items(): + assert spec['version'] in notes, (section, name) + assert 'Microsoft MPI' in notes and 'OpenMPI' in notes and 'SHA256SUMS' in notes + + +def test_raxml_source_bundle(tmp_path): + src = tmp_path / 'raxml-ng_v2.0.3_source.zip' + with zipfile.ZipFile(src, 'w') as z: + z.writestr('CMakeLists.txt', 'project(raxml)') + patch = tmp_path / 'windows.patch' + patch.write_text('--- a\n+++ b\n') + out = tmp_path / 'raxml-ng-2.0.3-source+patch.tar.gz' + meta.raxml_source_bundle(str(src), str(patch), str(out)) + with tarfile.open(out) as t: + assert sorted(t.getnames()) == ['raxml-ng-2.0.3-source+patch/raxml-ng-2.0.3-windows.patch', + 'raxml-ng-2.0.3-source+patch/raxml-ng_v2.0.3_source.zip'] From f191b4996ad7ded9231af9949f8af9d5de037b5b Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 11:05:46 +0300 Subject: [PATCH 11/25] Fix the release review findings: serial PhyML on Linux, pytest-free release scripts, child env, MS-MPI - pick phyml or phyml-mpi by the MPI mode (the AppImage bundles both) - move the synthetic dataset to tests/e2e/dataset_gen.py so release jobs need no pytest - start child programs without the PyInstaller LD_LIBRARY_PATH (runner, Open folder) - install pinned MS-MPI before the Windows smoke test; the bundled PhyML needs msmpi.dll - pin the RAxML-NG SIMD kernel in the parity runs; a manual run never creates a release - conftest uses its Windows .exe fallbacks only on Windows Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release.yml | 11 +++-- README.md | 4 +- packaging/package.py | 3 +- packaging/raxml_parity.py | 5 ++- packaging/release_meta.py | 3 +- packaging/smoke_test.py | 6 ++- packaging/third_party.json | 8 ++++ phyml_core/engines/phyml.py | 8 +++- phyml_core/runner.py | 1 + phyml_core/utils.py | 16 +++++++ phyml_ui/main_window.py | 12 ++++- tests/conftest.py | 3 +- tests/e2e/dataset_gen.py | 37 ++++++++++++++++ tests/e2e/datasets.py | 34 +------------- tests/gui/test_main_window.py | 16 +++++++ tests/unit/test_engine_phyml.py | 17 ++++++- tests/unit/test_platform.py | 36 +++++++++++++++ .../test_release_scripts_without_pytest.py | 44 +++++++++++++++++++ 18 files changed, 213 insertions(+), 51 deletions(-) create mode 100644 tests/e2e/dataset_gen.py create mode 100644 tests/unit/test_release_scripts_without_pytest.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8c4ec53..4dc7054 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -153,6 +153,10 @@ jobs: with: name: bin-windows path: bin + - name: Install Microsoft MPI (the bundled phyml-mpi.exe needs msmpi.dll) + run: | + python scripts/fetch_third_party.py --platform windows_runtime --dest mpi + Start-Process mpi/msmpisetup.exe -ArgumentList '-unattend' -Wait - name: Build the zip run: python packaging/package.py windows --version "$env:VERSION" --bin bin --out dist - name: Smoke test @@ -198,11 +202,12 @@ jobs: python - <<'EOF' import json, sys sys.path.insert(0, 'tests/e2e') - from datasets import make_dataset, write_fasta + from dataset_gen import make_dataset, write_fasta names, _, unaligned = make_dataset() write_fasta('check/unaligned.fasta', names, unaligned) json.dump({'engine': 'phyml', 'datatype': 'nt', 'model': 'HKY85', - 'support_method': '-4', 'use_mpi': False}, open('check/config.json', 'w')) + 'support_method': 'bootstrap', 'bootstrap_replicates': '4', + 'use_mpi': False}, open('check/config.json', 'w')) EOF docker run --rm -v "$PWD/check:/check" -w /check ubuntu:22.04 sh -c ' set -e @@ -215,7 +220,7 @@ jobs: path: dist/phymlGUI-*-x86_64.AppImage release: - if: startsWith(github.ref, 'refs/tags/v') + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') needs: [version, package-windows, package-linux] runs-on: ubuntu-22.04 timeout-minutes: 15 diff --git a/README.md b/README.md index 101f548..9ec7173 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ### ⚙️ Requirements * **Executables:** `phyml.exe` (or MPI version) and `muscle.exe`. * **Python packages:** Python 3.11+ with `PySide6`, `matplotlib`, `biopython` and `psutil` (`pip install -r requirements.txt`). -* **MPI Environment:** For parallel mode, **Microsoft MPI** is required (install `msmpisetup.exe` from the official Microsoft GitHub). +* **MPI Environment:** PhyML on Windows needs **Microsoft MPI** (install `msmpisetup.exe` from the official Microsoft GitHub), also for serial runs: the bundled PhyML is an MPI build. * **Settings and history:** stored next to the exe when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Set `PHYMLGUI_DATA_DIR` to use another folder. * **Linux:** the same app runs on Linux. Tool names have no `.exe`; tools are found in `bin/` next to the app, then on `PATH`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`) and uses `mpirun`. @@ -58,7 +58,7 @@ Analysis binaries are looked up in `bin/` and in the variables `PHYMLGUI_PHYML`, ### ⚙️ Требования * **Программные файлы:** `phyml.exe` (или MPI-версия) и `muscle.exe`. * **Python-зависимости:** Python 3.11+ с пакетами `PySide6`, `matplotlib`, `biopython` и `psutil` (`pip install -r requirements.txt`). -* **Среда MPI:** Для работы в параллельном режиме требуется установленный **Microsoft MPI** (инсталлятор `msmpisetup.exe` можно найти на официальном GitHub Microsoft). +* **Среда MPI:** PhyML под Windows требует установленный **Microsoft MPI** (инсталлятор `msmpisetup.exe` можно найти на официальном GitHub Microsoft), в том числе для последовательного режима: встроенный PhyML собран с MPI. * **Настройки и история:** хранятся рядом с exe, если папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Другую папку можно задать переменной `PHYMLGUI_DATA_DIR`. * **Linux:** то же приложение работает под Linux. Имена программ без `.exe`; они ищутся в `bin/` рядом с приложением, затем в `PATH`. Для MPI-режима нужен OpenMPI (`sudo apt install openmpi-bin`), используется `mpirun`. diff --git a/packaging/package.py b/packaging/package.py index 6d41d64..797e663 100644 --- a/packaging/package.py +++ b/packaging/package.py @@ -26,7 +26,8 @@ (or --batch folder, --version). The analysis programs are in bin/; their licenses are in licenses/. -MPI mode of PhyML needs Microsoft MPI (msmpisetup.exe from Microsoft). +PhyML needs Microsoft MPI (msmpisetup.exe from Microsoft), also for serial runs: +the bundled PhyML is an MPI build. Settings are kept next to phymlgui.exe, or in %APPDATA%\\phymlGUI if this folder is read-only. """ diff --git a/packaging/raxml_parity.py b/packaging/raxml_parity.py index 683895f..d8070d8 100644 --- a/packaging/raxml_parity.py +++ b/packaging/raxml_parity.py @@ -96,7 +96,7 @@ def run(exe, out): """Run the parity analyses with exe into out (inputs are generated here).""" sys.path.insert(0, os.path.join(ROOT, 'tests', 'e2e')) sys.path.insert(0, ROOT) - from datasets import make_dataset, write_fasta + from dataset_gen import make_dataset, write_fasta from phyml_core import alignment os.makedirs(out, exist_ok=True) names, aligned, _ = make_dataset() @@ -106,7 +106,8 @@ def run(exe, out): alignment.write_phylip(alignment.read_fasta(fasta), phy) with open(os.path.join(out, 'fixed.tree'), 'w') as f: f.write(FIXED_TREE + '\n') - common = ['--msa', 'parity.phy', '--seed', '42', '--redo'] + # the same SIMD kernel on both runners: RAxML-NG otherwise picks one per CPU + common = ['--msa', 'parity.phy', '--seed', '42', '--redo', '--simd', 'avx2'] runs = [ ['--search', *common, '--model', 'GTR+G', '--threads', '1', '--prefix', 'search'], ['--bootstrap', *common, '--model', 'GTR+G', '--threads', '2', '--bs-trees', '50', diff --git a/packaging/release_meta.py b/packaging/release_meta.py index 9a8be5f..320e97b 100644 --- a/packaging/release_meta.py +++ b/packaging/release_meta.py @@ -25,7 +25,8 @@ Downloads: - `phymlGUI-{version}-windows-x64.zip` - unpack and start `phymlgui.exe` - (command line: `phymlgui-cli.exe`). MPI mode of PhyML needs Microsoft MPI. + (command line: `phymlgui-cli.exe`). PhyML needs Microsoft MPI + (also for serial runs: the bundled PhyML is an MPI build). - `phymlGUI-{version}-x86_64.AppImage` - `chmod +x` and run; without FUSE use `--appimage-extract-and-run`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`). - `SHA256SUMS` - checksums of the files above. diff --git a/packaging/smoke_test.py b/packaging/smoke_test.py index 23206e2..c48ff17 100644 --- a/packaging/smoke_test.py +++ b/packaging/smoke_test.py @@ -41,7 +41,7 @@ def _run(argv, env, timeout=600): def _analysis(cli, env, work, name, overlay): - from datasets import make_dataset, write_fasta + from dataset_gen import make_dataset, write_fasta names, _, unaligned = make_dataset() folder = os.path.join(work, name) os.makedirs(folder) @@ -74,7 +74,9 @@ def main(argv=None): base = {'datatype': 'nt', 'model': 'HKY85', 'mpi_np': '2', 'use_mpi': False} checks = [ - ('phyml', dict(base, engine='phyml', support_method='-4')), + # bootstrap without MPI needs the serial build, which only the AppImage bundles + ('phyml', dict(base, engine='phyml', support_method='-4') if args.package.endswith('.zip') + else dict(base, engine='phyml', support_method='bootstrap', bootstrap_replicates='4')), ('iqtree', dict(base, engine='iqtree', model='MFP', support_method='-4')), ] if args.mpi: diff --git a/packaging/third_party.json b/packaging/third_party.json index 42afec4..5de00dc 100644 --- a/packaging/third_party.json +++ b/packaging/third_party.json @@ -90,5 +90,13 @@ "sha256": "2fca8b443c92510f1483a883f60061ad09b46b978b2631c807cd873a47ec260d", "save_as": "runtime-x86_64" } + }, + "windows_runtime": { + "msmpi": { + "version": "10.1.1 (the bundled phyml-mpi.exe links msmpi.dll even in serial mode)", + "url": "https://github.com/microsoft/Microsoft-MPI/releases/download/v10.1.1/msmpisetup.exe", + "sha256": "7308fd15e437d6829fd9c6ec5d801380faa3bff6e66e1dee3e8e005106fb6a68", + "save_as": "msmpisetup.exe" + } } } diff --git a/phyml_core/engines/phyml.py b/phyml_core/engines/phyml.py index 4b054c3..e9c911c 100644 --- a/phyml_core/engines/phyml.py +++ b/phyml_core/engines/phyml.py @@ -14,7 +14,10 @@ AA_MODELS = ("LG", "WAG", "JTT", "MtREV", "Dayhoff", "DCMut", "RtREV", "CPREV", "VT", "Blosum62", "MtMam", "MtArt", "HIVw", "HIVb", "custom") -EXECUTABLE_BASES = ('phyml-mpi', 'phyml') +# the build matching the MPI mode comes first; the other one is the fallback +# (the Windows zip ships only phyml-mpi.exe, the AppImage ships both) +EXECUTABLE_BASES = ('phyml', 'phyml-mpi') +MPI_EXECUTABLE_BASES = ('phyml-mpi', 'phyml') def parse_phyml_stats(stats_path: str) -> dict: @@ -102,7 +105,8 @@ def normalize(self, params: dict) -> Tuple[dict, List[Issue]]: return dict(params), [] def executable(self, params: dict, paths: AppPaths) -> str: - return paths.find_tool(params.get('phyml_path', ''), tuple(exe_name(b) for b in EXECUTABLE_BASES)) + bases = MPI_EXECUTABLE_BASES if params.get('use_mpi') else EXECUTABLE_BASES + return paths.find_tool(params.get('phyml_path', ''), tuple(exe_name(b) for b in bases)) def command(self, exe: str, phylip: str, params: dict) -> List[str]: argv = [exe, '-i', phylip, diff --git a/phyml_core/runner.py b/phyml_core/runner.py index 6587cba..2ad7503 100644 --- a/phyml_core/runner.py +++ b/phyml_core/runner.py @@ -282,6 +282,7 @@ def _execute(self, argv: List[str], cancel_key: str, show_output: bool) -> int: raise _Cancelled(cancel_key) proc = subprocess.Popen(argv, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, errors='replace', + env=utils.child_env(), creationflags=_CREATION_FLAGS) self._proc = proc try: diff --git a/phyml_core/utils.py b/phyml_core/utils.py index 580bb65..3812094 100644 --- a/phyml_core/utils.py +++ b/phyml_core/utils.py @@ -22,6 +22,22 @@ def default_mpirun(): return 'mpiexec' if IS_WINDOWS else 'mpirun' +def child_env(environ=None, frozen=None): + """Environment for programs started by the app. A frozen Linux build's bootloader + puts its _internal folder first on LD_LIBRARY_PATH (the user's value is kept in + LD_LIBRARY_PATH_ORIG); child programs must not load those bundled libraries.""" + env = dict(os.environ if environ is None else environ) + if frozen is None: + frozen = getattr(sys, 'frozen', False) + if frozen and not IS_WINDOWS: + original = env.pop('LD_LIBRARY_PATH_ORIG', None) + if original is None: + env.pop('LD_LIBRARY_PATH', None) + else: + env['LD_LIBRARY_PATH'] = original + return env + + def resource_path(relative_path): """Absolute path to a bundled resource: inside the PyInstaller bundle when frozen, otherwise next to the program (never relative to the current working folder).""" diff --git a/phyml_ui/main_window.py b/phyml_ui/main_window.py index 13643ea..7d9391f 100644 --- a/phyml_ui/main_window.py +++ b/phyml_ui/main_window.py @@ -393,8 +393,16 @@ def _open_output_dir(self): if self._last_out_dir and os.path.isdir(self._last_out_dir): if utils.IS_WINDOWS: os.startfile(self._last_out_dir) - else: # xdg-open, also from inside an AppImage - QDesktopServices.openUrl(QUrl.fromLocalFile(self._last_out_dir)) + else: # xdg-open, also from inside an AppImage: it inherits os.environ, + # so hand it the environment without the bundle's LD_LIBRARY_PATH + saved = dict(os.environ) + os.environ.clear() + os.environ.update(utils.child_env()) + try: + QDesktopServices.openUrl(QUrl.fromLocalFile(self._last_out_dir)) + finally: + os.environ.clear() + os.environ.update(saved) # ---------- history ---------- diff --git a/tests/conftest.py b/tests/conftest.py index c493e32..556d7d5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -44,7 +44,8 @@ def find_binary(kind): if os.environ.get(env_var): candidates.append(Path(os.environ[env_var])) candidates.append(ROOT / 'bin' / exe_name(base)) - candidates.extend(local) + if os.name == 'nt': # the extra local locations are Windows installs + candidates.extend(local) for path in candidates: if path.is_file(): return str(path) diff --git a/tests/e2e/dataset_gen.py b/tests/e2e/dataset_gen.py new file mode 100644 index 0000000..277a513 --- /dev/null +++ b/tests/e2e/dataset_gen.py @@ -0,0 +1,37 @@ +"""The synthetic two-clade dataset, without pytest (release scripts use it too). + +Two clades A=(A1..A4) and B=(B1..B4), so a finished run can be checked for the A|B split. +""" +import random + + +def evolve(seq, rate, rng): + bases = 'ACGT' + return ''.join(b if rng.random() > rate else rng.choice(bases) for b in seq) + + +def make_dataset(): + """(names, aligned sequences, unaligned sequences) of the two-clade dataset.""" + rng = random.Random(42) + ancestor = ''.join(rng.choice('ACGT') for _ in range(600)) + names, seqs_aligned, seqs_unaligned = [], [], [] + for clade, clade_rate in (('A', 0.16), ('B', 0.18)): + clade_consensus = evolve(ancestor, clade_rate, rng) + for i in range(1, 5): + s = evolve(clade_consensus, 0.03, rng) + name = f'{clade}{i}_testsp' + names.append(name) + seqs_aligned.append(s) + # unaligned variant: drop a random block from most sequences + if rng.random() < 0.8: + start = rng.randrange(50, 500) + ln = rng.randrange(8, 15) + s = s[:start] + s[start + ln:] + seqs_unaligned.append(s) + return names, seqs_aligned, seqs_unaligned + + +def write_fasta(path, names, seqs): + with open(path, 'w') as f: + for n, s in zip(names, seqs): + f.write(f'>{n}\n{s}\n') diff --git a/tests/e2e/datasets.py b/tests/e2e/datasets.py index 8fd7dfd..b0f861e 100644 --- a/tests/e2e/datasets.py +++ b/tests/e2e/datasets.py @@ -3,41 +3,9 @@ The dataset has a known topology: two clades A=(A1..A4) and B=(B1..B4), so a finished run can be checked for the A|B split. """ -import random - import pytest - -def evolve(seq, rate, rng): - bases = 'ACGT' - return ''.join(b if rng.random() > rate else rng.choice(bases) for b in seq) - - -def make_dataset(): - """(names, aligned sequences, unaligned sequences) of the two-clade dataset.""" - rng = random.Random(42) - ancestor = ''.join(rng.choice('ACGT') for _ in range(600)) - names, seqs_aligned, seqs_unaligned = [], [], [] - for clade, clade_rate in (('A', 0.16), ('B', 0.18)): - clade_consensus = evolve(ancestor, clade_rate, rng) - for i in range(1, 5): - s = evolve(clade_consensus, 0.03, rng) - name = f'{clade}{i}_testsp' - names.append(name) - seqs_aligned.append(s) - # unaligned variant: drop a random block from most sequences - if rng.random() < 0.8: - start = rng.randrange(50, 500) - ln = rng.randrange(8, 15) - s = s[:start] + s[start + ln:] - seqs_unaligned.append(s) - return names, seqs_aligned, seqs_unaligned - - -def write_fasta(path, names, seqs): - with open(path, 'w') as f: - for n, s in zip(names, seqs): - f.write(f'>{n}\n{s}\n') +from dataset_gen import evolve, make_dataset, write_fasta # noqa: F401 (re-exported) @pytest.fixture diff --git a/tests/gui/test_main_window.py b/tests/gui/test_main_window.py index 4e1fac0..b1ffae9 100644 --- a/tests/gui/test_main_window.py +++ b/tests/gui/test_main_window.py @@ -408,3 +408,19 @@ def test_open_output_dir_uses_qdesktopservices_off_windows(window, tmp_path, mon window._open_output_dir() assert len(opened) == 1 assert os.path.normcase(os.path.abspath(opened[0].toLocalFile())) == os.path.normcase(str(tmp_path)) + + +def test_open_output_dir_starts_xdg_open_with_the_child_env(window, tmp_path, monkeypatch): + """xdg-open inherits the process environment: it must not see the bundle's LD_LIBRARY_PATH.""" + from PySide6.QtGui import QDesktopServices + from phyml_core import utils + seen = [] + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + monkeypatch.setattr(utils, 'child_env', lambda: {'PHYMLGUI_CHILD': '1'}) + monkeypatch.setattr(QDesktopServices, 'openUrl', + staticmethod(lambda url: seen.append(dict(os.environ)) or True)) + before = dict(os.environ) + window._last_out_dir = str(tmp_path) + window._open_output_dir() + assert seen == [{'PHYMLGUI_CHILD': '1'}] + assert dict(os.environ) == before diff --git a/tests/unit/test_engine_phyml.py b/tests/unit/test_engine_phyml.py index 0b483fa..d9e5a67 100644 --- a/tests/unit/test_engine_phyml.py +++ b/tests/unit/test_engine_phyml.py @@ -240,11 +240,24 @@ def test_executable_falls_back_to_bin(paths): assert PhyML().executable({}, paths) == bin_exe -def test_executable_prefers_the_mpi_build_in_bin(paths): +def test_executable_picks_the_build_matching_the_mpi_mode(paths): os.makedirs(paths.bin_dir) for name in (exe_name('phyml'), exe_name('phyml-mpi')): open(os.path.join(paths.bin_dir, name), 'wb').close() - assert PhyML().executable({}, paths) == os.path.join(paths.bin_dir, exe_name('phyml-mpi')) + assert PhyML().executable({'use_mpi': True}, paths) == os.path.join(paths.bin_dir, exe_name('phyml-mpi')) + serial = os.path.join(paths.bin_dir, exe_name('phyml')) + assert PhyML().executable({'use_mpi': False}, paths) == serial + assert PhyML().executable({}, paths) == serial + + +def test_serial_bootstrap_is_valid_when_the_serial_build_is_bundled(paths): + """AppImage ships phyml and phyml-mpi: defaults (bootstrap, no MPI) must use phyml.""" + os.makedirs(paths.bin_dir) + for name in (exe_name('phyml'), exe_name('phyml-mpi')): + with open(os.path.join(paths.bin_dir, name), 'wb') as f: + f.write(b'MPI_Init' if name.startswith('phyml-mpi') else b'serial') + issues = PhyML().validate({'use_mpi': False, 'support_method': 'bootstrap'}, paths) + assert [i.key for i in issues] == [] def test_executable_resolves_a_stored_relative_path(paths): diff --git a/tests/unit/test_platform.py b/tests/unit/test_platform.py index 48d21a6..f116056 100644 --- a/tests/unit/test_platform.py +++ b/tests/unit/test_platform.py @@ -75,3 +75,39 @@ def test_detect_never_uses_app_dir_inside_an_appimage(tmp_path): is_writable=lambda d: True, app_dir=str(tmp_path / 'squashfs-root' / 'usr' / 'bin'), platform='posix') assert p.data_dir == str(tmp_path / '.config' / 'phymlGUI') + + +def test_child_env_undoes_the_pyinstaller_library_path(monkeypatch): + """The frozen Linux bootloader puts _internal first on LD_LIBRARY_PATH; mpirun, + phyml-mpi and xdg-open must get the user's own value back (or none).""" + monkeypatch.setattr(utils, 'IS_WINDOWS', False) + frozen = {'LD_LIBRARY_PATH': '/tmp/_internal:/opt/lib', 'LD_LIBRARY_PATH_ORIG': '/opt/lib', 'X': '1'} + assert utils.child_env(frozen, frozen=True) == {'LD_LIBRARY_PATH': '/opt/lib', 'X': '1'} + assert utils.child_env({'LD_LIBRARY_PATH': '/tmp/_internal', 'X': '1'}, frozen=True) == {'X': '1'} + plain = {'LD_LIBRARY_PATH': '/opt/lib', 'X': '1'} + assert utils.child_env(plain, frozen=False) == plain + monkeypatch.setattr(utils, 'IS_WINDOWS', True) + assert utils.child_env(frozen, frozen=True) == frozen + + +def test_runner_starts_programs_with_the_child_env(monkeypatch): + import subprocess + from phyml_core import runner + seen = {} + + class Stop(Exception): + pass + + def fake_popen(argv, **kwargs): + seen.update(kwargs) + raise Stop + monkeypatch.setattr(utils, 'child_env', lambda: {'MARK': 'child'}) + monkeypatch.setattr(subprocess, 'Popen', fake_popen) + r = runner.PipelineRunner.__new__(runner.PipelineRunner) + import threading + r._lock, r._cancelled = threading.Lock(), threading.Event() + try: + r._execute(['x'], 'cancel', False) + except Stop: + pass + assert seen.get('env') == {'MARK': 'child'} diff --git a/tests/unit/test_release_scripts_without_pytest.py b/tests/unit/test_release_scripts_without_pytest.py new file mode 100644 index 0000000..2a8671e --- /dev/null +++ b/tests/unit/test_release_scripts_without_pytest.py @@ -0,0 +1,44 @@ +"""Release jobs install only requirements.txt: their scripts must not need pytest.""" +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + +PRELUDE = f""" +import importlib.util, sys +sys.modules['pytest'] = None # import pytest -> ImportError, as on a release runner +def load(name): + spec = importlib.util.spec_from_file_location(name, {str(ROOT / 'packaging')!r} + '/' + name + '.py') + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module +""" + + +def _run(code, cwd): + return subprocess.run([sys.executable, '-c', PRELUDE + code], cwd=cwd, + capture_output=True, text=True, timeout=120) + + +def test_parity_inputs_are_generated_without_pytest(tmp_path): + r = _run(""" +try: + load('raxml_parity').run('no-such-raxml-ng', 'out') +except FileNotFoundError: + pass +""", tmp_path) + assert r.returncode == 0, r.stderr + assert (tmp_path / 'out' / 'parity.phy').is_file() + + +def test_smoke_dataset_is_generated_without_pytest(tmp_path): + r = _run(""" +import os +try: + load('smoke_test')._analysis(['no-such-phymlgui'], dict(os.environ), '.', 'phyml', {}) +except FileNotFoundError: + pass +""", tmp_path) + assert r.returncode == 0, r.stderr + assert (tmp_path / 'phyml' / 'unaligned.fasta').is_file() From 983cbd3f874aa0e19022e6101a99457de4e65641 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:05:02 +0300 Subject: [PATCH 12/25] Temporarily run the release workflow on pushes to the release branch A trial build before release.yml reaches master; the release job still runs only for tags. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4dc7054..8a76513 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,6 +6,7 @@ name: release on: push: tags: ['v*'] + branches: [release] # TEMPORARY: trial run before release.yml is on master; remove before merge workflow_dispatch: permissions: From 02bc59a882b34c5cb90b6d3eb9d581660dba6d20 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:12:06 +0300 Subject: [PATCH 13/25] Make the fake tool write bytes so Cyrillic paths survive a cp1252 pipe English Windows runners pipe child output as cp1252; the fake crashed printing a Cyrillic path. The Cyrillic-path test now forces cp1252 everywhere. Co-Authored-By: Claude Opus 5.5 --- tests/unit/fake_tool.py | 3 ++- tests/unit/test_runner.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/unit/fake_tool.py b/tests/unit/fake_tool.py index 69f705e..d6fcf21 100644 --- a/tests/unit/fake_tool.py +++ b/tests/unit/fake_tool.py @@ -27,7 +27,8 @@ def say(text): - sys.stdout.write(text + '\n') + # bytes, like real programs: a cp1252 pipe cannot encode a Cyrillic path + sys.stdout.buffer.write((text + '\n').encode('utf-8')) sys.stdout.flush() diff --git a/tests/unit/test_runner.py b/tests/unit/test_runner.py index b04ff38..bbd65d7 100644 --- a/tests/unit/test_runner.py +++ b/tests/unit/test_runner.py @@ -307,7 +307,9 @@ def test_undecodable_engine_output_is_replaced(tmp_path, paths): assert any(text.startswith('progress ') for text in rec.texts('out')) -def test_run_in_cyrillic_dir_with_spaces(tmp_path, paths): +def test_run_in_cyrillic_dir_with_spaces(tmp_path, paths, monkeypatch): + # an English Windows (CI) pipes child output as cp1252, which has no Cyrillic + monkeypatch.setenv('PYTHONIOENCODING', 'cp1252') folder = tmp_path / 'Мои данные' / 'проект 1' aligned = write_fasta(folder / 'выборка 1.fasta', ALIGNED) unaligned = write_fasta(folder / 'выборка 2.fasta', UNALIGNED) From 4aef719a4422cbce8d134c74f7ef0bfe302acd3d Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:15:18 +0300 Subject: [PATCH 14/25] TEMPORARY: find which test file crashes Python 3.11 on Linux at exit Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 63942da..4d3800a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,5 +42,16 @@ jobs: - name: Fetch IQ-TREE, MUSCLE and build PhyML (Linux) if: runner.os == 'Linux' && steps.third-party.outputs.cache-hit != 'true' run: python scripts/fetch_third_party.py --platform linux --only iqtree,muscle,phyml --dest bin + - name: TEMPORARY diagnosis - which test file crashes Python 3.11 at exit + if: runner.os == 'Linux' && matrix.python-version == '3.11' + continue-on-error: true + run: | + for f in $(find tests -name 'test_*.py' | sort); do + python -m pytest -q -p no:cacheprovider "$f" > /tmp/out.txt 2>&1 + code=$? + echo "exit=$code $f" + [ "$code" -gt 1 ] && grep -a -E "Fatal|passed|failed" /tmp/out.txt + done + true - name: Tests run: python -m pytest -q -rs From fbee051284e2b5bb073b53e187d715e03816f8f5 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:19:35 +0300 Subject: [PATCH 15/25] TEMPORARY: narrow down the Python 3.11 exit crash on Linux Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4d3800a..0c54780 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -46,12 +46,18 @@ jobs: if: runner.os == 'Linux' && matrix.python-version == '3.11' continue-on-error: true run: | - for f in $(find tests -name 'test_*.py' | sort); do - python -m pytest -q -p no:cacheprovider "$f" > /tmp/out.txt 2>&1 - code=$? - echo "exit=$code $f" - [ "$code" -gt 1 ] && grep -a -E "Fatal|passed|failed" /tmp/out.txt - done + set +e + try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } + try core 'python -c "import PySide6.QtCore"' + try widgets 'python -c "from PySide6.QtWidgets import QApplication; app = QApplication([])"' + try mpl 'python -c "import matplotlib; matplotlib.use(\"QtAgg\"); import matplotlib.pyplot"' + try pytest-empty 'python -m pytest -q -p no:cacheprovider tests/unit/test_release_meta.py' + try pytest-noqt 'python -m pytest -q -p no:cacheprovider -p no:pytest-qt tests/unit/test_release_meta.py' + try pytest-noqt-noconftest 'python -m pytest -q -p no:cacheprovider -p no:pytest-qt --noconftest tests/unit/test_release_meta.py' + try import-core 'python -c "import phyml_core.runner, phyml_core.engines.phyml"' + try import-ui 'python -c "import phyml_ui.main_window"' + try psutil 'python -c "import psutil; psutil.cpu_count(logical=False)"' + try bio 'python -c "from Bio import Phylo, SeqIO"' true - name: Tests run: python -m pytest -q -rs From cfe01fa9fa9f8a8e011939fd0951a0fe6055e89e Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:23:11 +0300 Subject: [PATCH 16/25] TEMPORARY: per-file and per-test runs for the Python 3.11 exit crash Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0c54780..c472615 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,16 +48,12 @@ jobs: run: | set +e try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } - try core 'python -c "import PySide6.QtCore"' - try widgets 'python -c "from PySide6.QtWidgets import QApplication; app = QApplication([])"' - try mpl 'python -c "import matplotlib; matplotlib.use(\"QtAgg\"); import matplotlib.pyplot"' - try pytest-empty 'python -m pytest -q -p no:cacheprovider tests/unit/test_release_meta.py' - try pytest-noqt 'python -m pytest -q -p no:cacheprovider -p no:pytest-qt tests/unit/test_release_meta.py' - try pytest-noqt-noconftest 'python -m pytest -q -p no:cacheprovider -p no:pytest-qt --noconftest tests/unit/test_release_meta.py' - try import-core 'python -c "import phyml_core.runner, phyml_core.engines.phyml"' - try import-ui 'python -c "import phyml_ui.main_window"' - try psutil 'python -c "import psutil; psutil.cpu_count(logical=False)"' - try bio 'python -c "from Bio import Phylo, SeqIO"' + for f in $(find tests -name 'test_*.py' | sort); do + try "$f" "python -m pytest -q -p no:cacheprovider $f" + done + for t in $(python -m pytest -q --co tests/e2e/test_batch.py 2>/dev/null | grep '::'); do + try "$t" "python -m pytest -q -p no:cacheprovider '$t'" + done true - name: Tests run: python -m pytest -q -rs From a8a56213a1224db4aad6bb606a87a0446df5f3ac Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:26:54 +0300 Subject: [PATCH 17/25] TEMPORARY: measure psutil True/False refcounts on Python 3.11 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c472615..6d0c526 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,12 +48,32 @@ jobs: run: | set +e try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } - for f in $(find tests -name 'test_*.py' | sort); do - try "$f" "python -m pytest -q -p no:cacheprovider $f" - done - for t in $(python -m pytest -q --co tests/e2e/test_batch.py 2>/dev/null | grep '::'); do - try "$t" "python -m pytest -q -p no:cacheprovider '$t'" - done + cat > /tmp/refs.py <<'EOF' + import os, subprocess, sys, time + import psutil + child = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(30)']) + me = psutil.Process(os.getpid()) + calls = { + 'cpu_percent()': lambda: psutil.cpu_percent(interval=None), + 'cpu_count(logical=False)': lambda: psutil.cpu_count(logical=False), + 'cpu_count(logical=True)': lambda: psutil.cpu_count(logical=True), + 'Process(pid)': lambda: psutil.Process(child.pid), + 'children(recursive)': lambda: me.children(recursive=True), + 'proc.cpu_percent': lambda: psutil.Process(child.pid).cpu_percent(interval=None), + 'is_running': lambda: psutil.Process(child.pid).is_running(), + 'status': lambda: psutil.Process(child.pid).status(), + 'pid_exists': lambda: psutil.pid_exists(child.pid), + 'wait_procs(0)': lambda: psutil.wait_procs([psutil.Process(child.pid)], timeout=0), + } + for name, call in calls.items(): + t0, f0 = sys.getrefcount(True), sys.getrefcount(False) + for _ in range(200): + call() + print(f'{name:28} dTrue={sys.getrefcount(True) - t0:+5} dFalse={sys.getrefcount(False) - f0:+5}') + child.kill() + EOF + sed -i 's/^ //' /tmp/refs.py + python /tmp/refs.py true - name: Tests run: python -m pytest -q -rs From caef407c74772a52ab9d2cd675df896d3c92994c Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:30:24 +0300 Subject: [PATCH 18/25] TEMPORARY: measure psutil wait refcounts on Python 3.11 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 42 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6d0c526..565c381 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -49,27 +49,35 @@ jobs: set +e try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } cat > /tmp/refs.py <<'EOF' - import os, subprocess, sys, time + import gc, os, subprocess, sys import psutil - child = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(30)']) - me = psutil.Process(os.getpid()) + print('psutil', psutil.__version__, sys.version) + gc.disable() + child = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(60)']) + proc = psutil.Process(child.pid) + def wait0(): + try: + proc.wait(timeout=0) + except psutil.TimeoutExpired: + pass + def wait_short(): + try: + proc.wait(timeout=0.001) + except psutil.TimeoutExpired: + pass calls = { - 'cpu_percent()': lambda: psutil.cpu_percent(interval=None), - 'cpu_count(logical=False)': lambda: psutil.cpu_count(logical=False), - 'cpu_count(logical=True)': lambda: psutil.cpu_count(logical=True), - 'Process(pid)': lambda: psutil.Process(child.pid), - 'children(recursive)': lambda: me.children(recursive=True), - 'proc.cpu_percent': lambda: psutil.Process(child.pid).cpu_percent(interval=None), - 'is_running': lambda: psutil.Process(child.pid).is_running(), - 'status': lambda: psutil.Process(child.pid).status(), - 'pid_exists': lambda: psutil.pid_exists(child.pid), - 'wait_procs(0)': lambda: psutil.wait_procs([psutil.Process(child.pid)], timeout=0), + 'Process.wait(timeout=0)': wait0, + 'Process.wait(timeout=0.001)': wait_short, + 'wait_procs([p], 0)': lambda: psutil.wait_procs([proc], timeout=0), + 'wait_procs([p], 0.001)': lambda: psutil.wait_procs([proc], timeout=0.001), + 'children(recursive)': lambda: psutil.Process(os.getpid()).children(recursive=True), } for name, call in calls.items(): - t0, f0 = sys.getrefcount(True), sys.getrefcount(False) - for _ in range(200): - call() - print(f'{name:28} dTrue={sys.getrefcount(True) - t0:+5} dFalse={sys.getrefcount(False) - f0:+5}') + for n in (100, 400): + t0, f0 = sys.getrefcount(True), sys.getrefcount(False) + for _ in range(n): + call() + print(f'{name:30} n={n:4} dTrue={sys.getrefcount(True) - t0:+6} dFalse={sys.getrefcount(False) - f0:+6}') child.kill() EOF sed -i 's/^ //' /tmp/refs.py From 7acd77a76ea70f972e8f17887077eb0a63ceb5b9 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:33:59 +0300 Subject: [PATCH 19/25] TEMPORARY: fix the refcount probe indentation Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 565c381..916b63f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -80,7 +80,6 @@ jobs: print(f'{name:30} n={n:4} dTrue={sys.getrefcount(True) - t0:+6} dFalse={sys.getrefcount(False) - f0:+6}') child.kill() EOF - sed -i 's/^ //' /tmp/refs.py python /tmp/refs.py true - name: Tests From 312ca14879af5840c2e909500bbceab4f430d738 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:37:36 +0300 Subject: [PATCH 20/25] TEMPORARY: per-test True/False refcount probe on Python 3.11 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 34 +--------------------------------- tests/refcount_probe.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 33 deletions(-) create mode 100644 tests/refcount_probe.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 916b63f..7fd770e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,39 +48,7 @@ jobs: run: | set +e try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } - cat > /tmp/refs.py <<'EOF' - import gc, os, subprocess, sys - import psutil - print('psutil', psutil.__version__, sys.version) - gc.disable() - child = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(60)']) - proc = psutil.Process(child.pid) - def wait0(): - try: - proc.wait(timeout=0) - except psutil.TimeoutExpired: - pass - def wait_short(): - try: - proc.wait(timeout=0.001) - except psutil.TimeoutExpired: - pass - calls = { - 'Process.wait(timeout=0)': wait0, - 'Process.wait(timeout=0.001)': wait_short, - 'wait_procs([p], 0)': lambda: psutil.wait_procs([proc], timeout=0), - 'wait_procs([p], 0.001)': lambda: psutil.wait_procs([proc], timeout=0.001), - 'children(recursive)': lambda: psutil.Process(os.getpid()).children(recursive=True), - } - for name, call in calls.items(): - for n in (100, 400): - t0, f0 = sys.getrefcount(True), sys.getrefcount(False) - for _ in range(n): - call() - print(f'{name:30} n={n:4} dTrue={sys.getrefcount(True) - t0:+6} dFalse={sys.getrefcount(False) - f0:+6}') - child.kill() - EOF - python /tmp/refs.py + PYTHONPATH=tests python -m pytest -q -s -p no:cacheprovider -p refcount_probe tests/gui/test_main_window.py tests/gui/test_main_window_smoke.py tests/e2e/test_cpu_monitor.py tests/gui/test_main_window_storage.py 2>&1 | grep -a -E 'REFPROBE|passed|failed|Fatal' true - name: Tests run: python -m pytest -q -rs diff --git a/tests/refcount_probe.py b/tests/refcount_probe.py new file mode 100644 index 0000000..2924693 --- /dev/null +++ b/tests/refcount_probe.py @@ -0,0 +1,32 @@ +"""TEMPORARY pytest plugin: report test phases that lower the refcount of True/False +(an over-decref in a C extension; fatal at exit on Python < 3.12).""" +import sys + +import pytest + + +def _counts(): + return sys.getrefcount(True), sys.getrefcount(False) + + +def _probe(item, phase): + t0, f0 = _counts() + yield + t1, f1 = _counts() + if t1 < t0 or f1 < f0: + print(f'\nREFPROBE {phase:8} dTrue={t1 - t0:+5} dFalse={f1 - f0:+5} {item.nodeid}', flush=True) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_setup(item): + yield from _probe(item, 'setup') + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_call(item): + yield from _probe(item, 'call') + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_teardown(item): + yield from _probe(item, 'teardown') From 6cfe48c5486116e4eddd70ffa085a6de3a8dc523 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 12:41:06 +0300 Subject: [PATCH 21/25] Remove the temporary Python 3.11 crash diagnostics Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 8 -------- tests/refcount_probe.py | 32 -------------------------------- 2 files changed, 40 deletions(-) delete mode 100644 tests/refcount_probe.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7fd770e..63942da 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,13 +42,5 @@ jobs: - name: Fetch IQ-TREE, MUSCLE and build PhyML (Linux) if: runner.os == 'Linux' && steps.third-party.outputs.cache-hit != 'true' run: python scripts/fetch_third_party.py --platform linux --only iqtree,muscle,phyml --dest bin - - name: TEMPORARY diagnosis - which test file crashes Python 3.11 at exit - if: runner.os == 'Linux' && matrix.python-version == '3.11' - continue-on-error: true - run: | - set +e - try() { echo "--- $1"; sh -c "$2" > /tmp/out.txt 2>&1; echo "exit=$?"; grep -a -E "Fatal|passed|failed|rror" /tmp/out.txt | head -3; } - PYTHONPATH=tests python -m pytest -q -s -p no:cacheprovider -p refcount_probe tests/gui/test_main_window.py tests/gui/test_main_window_smoke.py tests/e2e/test_cpu_monitor.py tests/gui/test_main_window_storage.py 2>&1 | grep -a -E 'REFPROBE|passed|failed|Fatal' - true - name: Tests run: python -m pytest -q -rs diff --git a/tests/refcount_probe.py b/tests/refcount_probe.py deleted file mode 100644 index 2924693..0000000 --- a/tests/refcount_probe.py +++ /dev/null @@ -1,32 +0,0 @@ -"""TEMPORARY pytest plugin: report test phases that lower the refcount of True/False -(an over-decref in a C extension; fatal at exit on Python < 3.12).""" -import sys - -import pytest - - -def _counts(): - return sys.getrefcount(True), sys.getrefcount(False) - - -def _probe(item, phase): - t0, f0 = _counts() - yield - t1, f1 = _counts() - if t1 < t0 or f1 < f0: - print(f'\nREFPROBE {phase:8} dTrue={t1 - t0:+5} dFalse={f1 - f0:+5} {item.nodeid}', flush=True) - - -@pytest.hookimpl(hookwrapper=True) -def pytest_runtest_setup(item): - yield from _probe(item, 'setup') - - -@pytest.hookimpl(hookwrapper=True) -def pytest_runtest_call(item): - yield from _probe(item, 'call') - - -@pytest.hookimpl(hookwrapper=True) -def pytest_runtest_teardown(item): - yield from _probe(item, 'teardown') From 0c2035bf20a8f41cbe0c7283fac3cc89ccbaa32b Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 13:17:29 +0300 Subject: [PATCH 22/25] Test Linux on Python 3.12 and 3.13; document Python 3.12+ for Linux source runs On Python 3.11 a C extension's True/False over-decref aborts the interpreter at exit on Linux (bool_dealloc) after all tests pass; 3.12+ makes those objects immortal. The packages bundle Python 3.13. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 9 +++++++-- README.md | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 63942da..e487a1e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,8 +13,13 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, ubuntu-22.04] - python-version: ['3.11', '3.13'] + # Linux starts at 3.12: on 3.11 a C extension's True/False over-decref aborts + # the interpreter at exit (bool_dealloc); 3.12+ makes those objects immortal + include: + - {os: windows-latest, python-version: '3.11'} + - {os: windows-latest, python-version: '3.13'} + - {os: ubuntu-22.04, python-version: '3.12'} + - {os: ubuntu-22.04, python-version: '3.13'} env: QT_QPA_PLATFORM: offscreen steps: diff --git a/README.md b/README.md index 9ec7173..aa1683c 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,10 @@ ### ⚙️ Requirements * **Executables:** `phyml.exe` (or MPI version) and `muscle.exe`. -* **Python packages:** Python 3.11+ with `PySide6`, `matplotlib`, `biopython` and `psutil` (`pip install -r requirements.txt`). +* **Python packages:** Python 3.11+ (3.12+ on Linux) with `PySide6`, `matplotlib`, `biopython` and `psutil` (`pip install -r requirements.txt`). * **MPI Environment:** PhyML on Windows needs **Microsoft MPI** (install `msmpisetup.exe` from the official Microsoft GitHub), also for serial runs: the bundled PhyML is an MPI build. * **Settings and history:** stored next to the exe when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Set `PHYMLGUI_DATA_DIR` to use another folder. -* **Linux:** the same app runs on Linux. Tool names have no `.exe`; tools are found in `bin/` next to the app, then on `PATH`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`) and uses `mpirun`. +* **Linux:** the same app runs on Linux. Tool names have no `.exe`; tools are found in `bin/` next to the app, then on `PATH`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`) and uses `mpirun`. Running from source on Linux needs Python 3.12+: with Python 3.11 the interpreter aborts on exit (`bool_dealloc`, a reference-count bug in a C extension that 3.12+ does not trip over). ### 🧪 Tests ``` @@ -57,10 +57,10 @@ Analysis binaries are looked up in `bin/` and in the variables `PHYMLGUI_PHYML`, ### ⚙️ Требования * **Программные файлы:** `phyml.exe` (или MPI-версия) и `muscle.exe`. -* **Python-зависимости:** Python 3.11+ с пакетами `PySide6`, `matplotlib`, `biopython` и `psutil` (`pip install -r requirements.txt`). +* **Python-зависимости:** Python 3.11+ (под Linux 3.12+) с пакетами `PySide6`, `matplotlib`, `biopython` и `psutil` (`pip install -r requirements.txt`). * **Среда MPI:** PhyML под Windows требует установленный **Microsoft MPI** (инсталлятор `msmpisetup.exe` можно найти на официальном GitHub Microsoft), в том числе для последовательного режима: встроенный PhyML собран с MPI. * **Настройки и история:** хранятся рядом с exe, если папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Другую папку можно задать переменной `PHYMLGUI_DATA_DIR`. -* **Linux:** то же приложение работает под Linux. Имена программ без `.exe`; они ищутся в `bin/` рядом с приложением, затем в `PATH`. Для MPI-режима нужен OpenMPI (`sudo apt install openmpi-bin`), используется `mpirun`. +* **Linux:** то же приложение работает под Linux. Имена программ без `.exe`; они ищутся в `bin/` рядом с приложением, затем в `PATH`. Для MPI-режима нужен OpenMPI (`sudo apt install openmpi-bin`), используется `mpirun`. Для запуска из исходников под Linux нужен Python 3.12+: с Python 3.11 интерпретатор аварийно завершается при выходе (`bool_dealloc`, ошибка счётчика ссылок в C-расширении, на которую 3.12+ не натыкается). ### 🧪 Тесты ``` From 4f24bc6347bce306cfda22fd4d59cf7304b76000 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 13:39:36 +0300 Subject: [PATCH 23/25] Mark suffixed versions as pre-releases; drop the temporary branch trigger Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8a76513..71d1ddb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,6 @@ name: release on: push: tags: ['v*'] - branches: [release] # TEMPORARY: trial run before release.yml is on master; remove before merge workflow_dispatch: permissions: @@ -253,6 +252,9 @@ jobs: python3 packaging/release_meta.py notes "$VERSION" notes.md - name: Create or update the draft release run: | + # vX.Y.Z-suffix (rc, beta) is a pre-release + prerelease=() + case "$VERSION" in *-*) prerelease=(--prerelease) ;; esac files=(out/phymlGUI-*-windows-x64.zip out/phymlGUI-*-x86_64.AppImage out/raxml-ng-2.0.3-source+patch.tar.gz out/SHA256SUMS) if draft=$(gh release view "$TAG" --json isDraft -q .isDraft 2>/dev/null); then @@ -261,7 +263,8 @@ jobs: exit 1 fi gh release upload "$TAG" "${files[@]}" --clobber + if [ ${#prerelease[@]} -gt 0 ]; then gh release edit "$TAG" "${prerelease[@]}"; fi else - gh release create "$TAG" --draft --verify-tag --title "phymlGUI $VERSION" \ + gh release create "$TAG" --draft "${prerelease[@]}" --verify-tag --title "phymlGUI $VERSION" \ --notes-file notes.md "${files[@]}" fi From fde5d99b57f6ca662f05028c0279464e57bcb113 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 14:02:46 +0300 Subject: [PATCH 24/25] README in the style of the other projects, CHANGELOG and bilingual release notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README.md and README.ru.md with screenshots of real runs (scripts/make_screenshots.py) - CHANGELOG.md in Keep a Changelog format - release notes in English and Russian, with per-version highlights from packaging/release_notes/[.ru].md - version 2.0.0 in the sources; drop the stale 'v1.4' panel labels; 'Наклонная' for the slanted tree layout Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 69 +++++++++++ README.md | 175 ++++++++++++++++------------ README.ru.md | 117 +++++++++++++++++++ docs/screenshots/dark.png | Bin 0 -> 115172 bytes docs/screenshots/dark_ru.png | Bin 0 -> 118207 bytes docs/screenshots/iqtree.png | Bin 0 -> 86888 bytes docs/screenshots/iqtree_ru.png | Bin 0 -> 91969 bytes docs/screenshots/main.png | Bin 0 -> 95329 bytes docs/screenshots/main_ru.png | Bin 0 -> 100690 bytes locales.json | 14 +-- packaging/release_meta.py | 72 +++++++++--- packaging/release_notes/2.0.0.md | 38 ++++++ packaging/release_notes/2.0.0.ru.md | 38 ++++++ phyml_core/__init__.py | 2 +- scripts/make_screenshots.py | 127 ++++++++++++++++++++ tests/unit/test_release_meta.py | 23 +++- 16 files changed, 571 insertions(+), 104 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 README.ru.md create mode 100644 docs/screenshots/dark.png create mode 100644 docs/screenshots/dark_ru.png create mode 100644 docs/screenshots/iqtree.png create mode 100644 docs/screenshots/iqtree_ru.png create mode 100644 docs/screenshots/main.png create mode 100644 docs/screenshots/main_ru.png create mode 100644 packaging/release_notes/2.0.0.md create mode 100644 packaging/release_notes/2.0.0.ru.md create mode 100644 scripts/make_screenshots.py diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2905a4b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,69 @@ +# Changelog + +All notable changes to phymlGUI are documented here. The format follows +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is +[SemVer](https://semver.org/). + +## [2.0.0] — 2026-10-31 + +A new window, a second engine, an interactive tree viewer and ready-to-run +packages for Windows and Linux with all analysis programs included. + +### Added +- IQ-TREE 2 engine: ModelFinder (`MFP`), ultrafast bootstrap with the + 1000-replicate minimum enforced, the chosen model and statistics in the window +- Tree viewer: rectangular, slanted and circular layouts, distance grid and + scale, support threshold highlighting, clade collapsing, rerooting on an + outgroup, majority-rule consensus from bootstrap trees, Robinson–Foulds + comparison, PNG/SVG/PDF export +- Run history (double click reopens a tree) and built-in and user parameter + presets +- Batch queue with per-file statuses, retry of the failed files and an Excel + (`.xlsx`) summary next to the CSV one +- Command line without the window: `--file`, `--batch`, `--config`, + `--version`, documented exit codes +- Linux support: XDG data folder, `mpirun` (OpenMPI), tools on `PATH` +- Release packages built by GitHub Actions: a Windows zip + (`phymlgui.exe` and `phymlgui-cli.exe`) and a Linux AppImage, each with + PhyML, IQ-TREE 2.4.0, MUSCLE 5.3 and RAxML-NG 2.0.3; `SHA256SUMS`; the + RAxML-NG sources and Windows patch attached to every release +- Native Windows build of RAxML-NG 2.0.3, checked against the official Linux + build (same best tree, likelihood, bootstrap replicates) +- Light and dark themes (following the system) with an accent colour + +### Changed +- Two-pane window: parameters, recent files, presets and history on the left; + the tree, log, statistics, summary and queue on the right +- Settings and history live in a data folder (next to the program when it is + writable, otherwise `%APPDATA%\phymlGUI` or `~/.config/phymlGUI`); settings + and history found in the working folder are copied there once +- All settings are checked before a run and every problem is listed at once +- The analysis core no longer depends on Qt; Cancel stops the whole process + tree, MPI ranks included + +### Fixed +- Crash when starting a run from an empty input +- IQ-TREE UFBoot and model errors +- Tree drawing: internal nodes at their own depth, non-overlapping supports, + circular layout of polytomies +- On Linux the serial PhyML is used when MPI is off, and child programs no + longer inherit the libraries of the package + +## [1.2] — 2026-10-24 + +### Added +- Batch mode for a folder of FASTA files with a CSV summary +- MPI autodetection, automatic core count and a live CPU monitor +- One-line statistics summary after each run + +### Changed +- Migrated the GUI from PyQt5 to PySide6 and split the code into modules + +## [1.1] — 2026-04-11 + +### Added +- MPI support, a single English/Russian program with `locales.json` + +## [1.0] — 2026-04-11 + +First release: a Windows GUI for the MUSCLE → PhyML pipeline. diff --git a/README.md b/README.md index aa1683c..1f56bc6 100644 --- a/README.md +++ b/README.md @@ -1,90 +1,117 @@ -# phymlGUI: Automated Pipeline for Phylogenetic Analysis +# phymlGUI -[English Version](#english) | [Русская версия](#russian) +English | [Русский](README.ru.md) ---- +Open-source desktop tool for building maximum-likelihood phylogenetic trees from FASTA files. It aligns unaligned sequences with MUSCLE, runs **PhyML** (serial or MPI) or **IQ-TREE** (ModelFinder, ultrafast bootstrap) and shows the tree in an interactive viewer. Single files or whole folders, with a run history and parameter presets. Ready-to-run packages for Windows and Linux with all analysis programs included. English/Russian interface, dark and light themes. - -## 🇺🇸 English Version - -**phymlGUI** is a graphical interface for Windows that automates the construction of phylogenetic trees using the Maximum Likelihood method. - -### 🛠 Core Capabilities -* **Two Engines:** **PhyML** (serial or MPI) and **IQ-TREE** (automatic model selection with ModelFinder, ultrafast bootstrap) — switchable in Settings. -* **Integrated Pipeline:** Automatically detects unaligned sequences and runs **MUSCLE** before passing data to the engine. -* **Parallel Computing (MPI):** Supports execution via `mpirun`/`mpiexec` for multi-core processing; MPI binaries are detected automatically and misconfigured bootstrap runs are blocked with an explanation. -* **Batch Mode:** Process a whole folder of FASTA files in one run — a live per-file queue with statuses, retry of failed files, an N/M summary and automatic `phymlgui_summary.csv` / `.xlsx` reports. -* **Hardware Awareness:** Physical/logical core detection (the `np` field is pre-filled), plus a live CPU status bar showing both system load and the utilization of the analysis process tree. -* **Tree Viewer:** Rectangular / slanted / circular layouts, support-value threshold highlighting, clade collapsing, outgroup rerooting, majority-rule consensus from bootstrap trees, Robinson–Foulds topology comparison and PNG/SVG/PDF export. -* **Run History and Presets:** every run is recorded (double-click reloads its tree); built-in and user parameter presets. -* **Headless CLI:** `python phymlgui.py --file data.fasta` / `--batch folder/` runs the same pipeline without the GUI. Settings come from the data folder (not from a `phyml_config.json` in the current directory); `--config preset.json` is a JSON object laid over them. Exit codes: 0 success, 1 a file failed or the run was cancelled, 2 usage or input problem. -* **Data Sanitization / Conversion:** cleans sequence IDs, converts `FASTA` to `PHYLIP-relaxed`. -* **Themes:** light/dark (can follow the Windows system theme) with a selectable accent color. - -### ⚙️ Requirements -* **Executables:** `phyml.exe` (or MPI version) and `muscle.exe`. -* **Python packages:** Python 3.11+ (3.12+ on Linux) with `PySide6`, `matplotlib`, `biopython` and `psutil` (`pip install -r requirements.txt`). -* **MPI Environment:** PhyML on Windows needs **Microsoft MPI** (install `msmpisetup.exe` from the official Microsoft GitHub), also for serial runs: the bundled PhyML is an MPI build. -* **Settings and history:** stored next to the exe when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Set `PHYMLGUI_DATA_DIR` to use another folder. -* **Linux:** the same app runs on Linux. Tool names have no `.exe`; tools are found in `bin/` next to the app, then on `PATH`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`) and uses `mpirun`. Running from source on Linux needs Python 3.12+: with Python 3.11 the interpreter aborts on exit (`bool_dealloc`, a reference-count bug in a C extension that 3.12+ does not trip over). - -### 🧪 Tests -``` -pip install -r requirements.txt -r requirements-dev.txt -python scripts/fetch_third_party.py --dest bin # pinned IQ-TREE and MUSCLE (SHA256-verified) -python -m pytest +![phymlGUI: PhyML with MPI bootstrap on mammalian cytochrome b](docs/screenshots/main.png) + +## Features + +### 1. Analysis pipeline +- **Two engines:** PhyML 3.3 (serial or parallel through MPI) and IQ-TREE 2 (automatic model selection with ModelFinder, ultrafast bootstrap), switchable in Settings. +- **Alignment on the fly:** unaligned FASTA is detected and aligned with MUSCLE before the analysis; aligned files go straight to the engine. +- **Input checks before the run:** IDs are cleaned and checked for collisions, FASTA is converted to relaxed PHYLIP, and invalid settings (a missing program, an MPI-only build without MPI, bad numbers) are listed together before anything starts. +- **Parallel computing:** MPI through `mpiexec` (Microsoft MPI, Windows) or `mpirun` (OpenMPI, Linux); the core count is pre-filled from the physical cores. +- **Live CPU monitor:** the status bar shows the system load and the load of the analysis process tree. +- **Safe cancel:** Cancel stops the whole process tree (`mpiexec` and every PhyML rank). + +### 2. Tree viewer +- **Layouts:** rectangular, slanted and circular, with a distance grid and a scale in substitutions per site. +- **Supports:** bootstrap / aLRT / UFBoot values on branches, highlighting by a threshold. +- **Editing the view:** clade collapsing, rerooting on an outgroup, zoom and pan. +- **Comparison:** majority-rule consensus from bootstrap trees and Robinson–Foulds distance between two topologies. +- **Export:** PNG, SVG and PDF. + +![Dark theme, slanted layout](docs/screenshots/dark.png) + +### 3. IQ-TREE with ModelFinder +- **Model selection:** `MFP` lets ModelFinder choose the substitution model; the chosen model, log-likelihood, gamma shape and run time appear in the Statistics tab. +- **Ultrafast bootstrap:** UFBoot supports on the tree; fewer than 1000 replicates (the UFBoot minimum) are raised to 1000 with a warning. + +![IQ-TREE run with the statistics of the chosen model](docs/screenshots/iqtree.png) + +### 4. Batch mode, history and presets +- **Batch mode:** a whole folder of FASTA files in one run, with a live per-file queue, statuses, retry of the failed files and an N/M summary. +- **Reports:** `phymlgui_summary.csv` and `phymlgui_summary.xlsx` with the model, taxa, log-likelihood, gamma, Ts/Tv and run time of every file. +- **Run history:** every run is recorded with its parameters; a double click reopens its tree. +- **Presets:** built-in and user parameter presets, stored together with the engine. + +### 5. Command line +The same pipeline without the window, for scripts and servers: + +```bash +phymlgui-cli.exe --file data.fasta # Windows package +./phymlGUI-2.0.0-x86_64.AppImage --batch folder/ # Linux package +python phymlgui.py --file data.fasta --config preset.json ``` -Analysis binaries are looked up in `bin/` and in the variables `PHYMLGUI_PHYML`, `PHYMLGUI_MPIEXEC`, `PHYMLGUI_IQTREE`, `PHYMLGUI_MUSCLE`, `PHYMLGUI_RAXML` (full path to the executable). Tests that need a missing binary are skipped. Markers: `needs_phyml`, `needs_mpi`, `needs_iqtree`, `needs_muscle`, `slow`; CI runs plain `python -m pytest -q -rs`; the tests whose binaries are not installed there are skipped. Tests never touch your real settings: they use an isolated data folder. + +Settings come from the data folder; `--config` is a JSON object laid over them. Exit codes: `0` success, `1` a file failed or the run was cancelled, `2` a usage or input problem. --- - -## 🇷🇺 Русская версия - -**phymlGUI** — графический интерфейс для Windows, автоматизирующий построение филогенетических деревьев методом максимального правдоподобия. - -### 🛠 Основные возможности -* **Два движка:** **PhyML** (последовательно или MPI) и **IQ-TREE** (автоподбор модели ModelFinder, ультрабыстрый бутстреп) — переключение в настройках. -* **Интегрированный пайплайн:** Автоматическое определение невыровненных последовательностей и запуск **MUSCLE** перед анализом. -* **Параллельные вычисления (MPI):** Запуск через `mpirun`/`mpiexec`; MPI-бинарники определяются автоматически, некорректная конфигурация бутстрепа блокируется с пояснением. -* **Пакетный режим:** Обработка папки FASTA-файлов — живая очередь со статусами, повтор неудавшихся, сводка N/M и автоматические отчёты `phymlgui_summary.csv` / `.xlsx`. -* **Аппаратная осведомлённость:** Определение физических/логических ядер и живая строка состояния с загрузкой CPU — системы и дерева процессов анализа. -* **Просмотрщик деревьев:** Прямоугольная/сланцевая/круговая раскладки, подсветка поддержек по порогу, сворачивание клад, рерутинг по outgroup, консенсус большинства из бутстреп-деревьев, сравнение топологий по Робинсону–Фаулдсу, экспорт PNG/SVG/PDF. -* **История и пресеты:** каждый запуск записывается (двойной клик загружает его дерево); встроенные и пользовательские пресеты параметров. -* **Консольный режим:** `python phymlgui.py --file data.fasta` / `--batch папка/` — тот же пайплайн без GUI. Настройки берутся из папки данных (а не из `phyml_config.json` в текущей папке); `--config preset.json` — JSON-объект, накладываемый поверх них. Коды выхода: 0 — успех, 1 — файл не обработан или запуск отменён, 2 — ошибка аргументов или входных данных. -* **Очистка и конвертация:** санитарная очистка ID, перевод `FASTA` → `PHYLIP-relaxed`. -* **Темы:** светлая/тёмная (могут следовать системной Windows) с выбором акцентного цвета. - -### ⚙️ Требования -* **Программные файлы:** `phyml.exe` (или MPI-версия) и `muscle.exe`. -* **Python-зависимости:** Python 3.11+ (под Linux 3.12+) с пакетами `PySide6`, `matplotlib`, `biopython` и `psutil` (`pip install -r requirements.txt`). -* **Среда MPI:** PhyML под Windows требует установленный **Microsoft MPI** (инсталлятор `msmpisetup.exe` можно найти на официальном GitHub Microsoft), в том числе для последовательного режима: встроенный PhyML собран с MPI. -* **Настройки и история:** хранятся рядом с exe, если папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Другую папку можно задать переменной `PHYMLGUI_DATA_DIR`. -* **Linux:** то же приложение работает под Linux. Имена программ без `.exe`; они ищутся в `bin/` рядом с приложением, затем в `PATH`. Для MPI-режима нужен OpenMPI (`sudo apt install openmpi-bin`), используется `mpirun`. Для запуска из исходников под Linux нужен Python 3.12+: с Python 3.11 интерпретатор аварийно завершается при выходе (`bool_dealloc`, ошибка счётчика ссылок в C-расширении, на которую 3.12+ не натыкается). - -### 🧪 Тесты +## Download + +Ready-to-run packages are on the [Releases](https://github.com/adrobi/phymlGUI/releases) page; Python is not required. + +- **Windows 10/11, 64-bit:** `phymlGUI--windows-x64.zip`. Unpack the whole archive and run `phymlgui.exe` (`phymlgui-cli.exe` for the command line). PhyML needs [Microsoft MPI](https://github.com/microsoft/Microsoft-MPI/releases) (`msmpisetup.exe`), also for serial runs: the bundled PhyML is an MPI build. +- **Linux x86_64:** `phymlGUI--x86_64.AppImage`. Run `chmod +x phymlGUI-*.AppImage` and start it; without FUSE add `--appimage-extract-and-run`. Built on Ubuntu 22.04 (glibc 2.35 or newer). MPI mode needs OpenMPI: `sudo apt install openmpi-bin`. +- **Checksums:** `SHA256SUMS`, verify with `sha256sum -c SHA256SUMS`. + +Bundled programs (in `bin/`, licences in `licenses/`): + +| Program | Windows | Linux | +| --- | --- | --- | +| [PhyML](https://github.com/stephaneguindon/phyml) | 3.3, MPI build | 3.3.20260528, serial and MPI builds | +| [IQ-TREE](https://github.com/iqtree/iqtree2) | 2.4.0 | 2.4.0 | +| [MUSCLE](https://github.com/rcedgar/muscle) | 5.3 | 5.3 | +| [RAxML-NG](https://github.com/amkozlov/raxml-ng) | 2.0.3, native build | 2.0.3 | + +RAxML-NG is included for use from the command line; an engine for it in the window is planned. The Windows build is made from the official sources with a small patch; the sources and the patch are attached to every release (AGPL-3.0). + +Settings and history are kept next to the program when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). `PHYMLGUI_DATA_DIR` selects another folder. + +## Installation & Quick Start (from source) + +Requires **Python 3.11+** (**3.12+** on Linux: with 3.11 the interpreter aborts on exit, `bool_dealloc`, because of a reference-count bug in a C extension). + +```bash +python -m venv .venv +source .venv/bin/activate # Windows: .venv\Scripts\activate +pip install -r requirements.txt +python scripts/fetch_third_party.py --dest bin # pinned, SHA256-verified programs +python phymlgui.py ``` -pip install -r requirements.txt -r requirements-dev.txt -python scripts/fetch_third_party.py --dest bin # закреплённые IQ-TREE и MUSCLE (проверка SHA256) + +Programs are looked up in `bin/` next to the app, then on `PATH`; paths can also be set in Settings. + +Run the tests: + +```bash +pip install -r requirements-dev.txt python -m pytest ``` -Бинарники анализа ищутся в `bin/` и в переменных `PHYMLGUI_PHYML`, `PHYMLGUI_MPIEXEC`, `PHYMLGUI_IQTREE`, `PHYMLGUI_MUSCLE`, `PHYMLGUI_RAXML` (полный путь к exe). Тесты, которым нужен отсутствующий бинарник, пропускаются. Маркеры: `needs_phyml`, `needs_mpi`, `needs_iqtree`, `needs_muscle`, `slow`; CI запускает просто `python -m pytest -q -rs`; тесты, для которых на CI нет бинарников, пропускаются. Тесты не трогают ваши настройки: они работают в изолированной папке данных. ---- +Tests that need a missing program are skipped; `PHYMLGUI_PHYML`, `PHYMLGUI_MPIEXEC`, `PHYMLGUI_IQTREE`, `PHYMLGUI_MUSCLE` and `PHYMLGUI_RAXML` point them to specific executables. The tests never touch your real settings. `scripts/make_screenshots.py` regenerates the screenshots from real runs. + +## Output files + +Next to each input file: + +- `*_aligned.fasta`: the MUSCLE alignment (for unaligned input) +- `*.phy`: the relaxed PHYLIP passed to the engine +- `*_phyml_tree.txt`, `*_phyml_stats.txt`, `*_phyml_boot_trees.txt`: PhyML results +- `*.treefile`, `*.iqtree`, `*.log`: IQ-TREE results +- `phymlgui_summary.csv`, `phymlgui_summary.xlsx`: one row per file -## 📂 Output Files / Выходные файлы +## Citation -* `*_aligned.fasta` — Aligned sequences / Выровненные последовательности. -* `*.phy` — Prepared PHYLIP format / Подготовленный формат PHYLIP. -* `*_phyml_tree.txt` — Resulting ML Tree (Newick) / Итоговое дерево (Newick). -* `*_phyml_stats.txt` — Analysis statistics / Статистика анализа. -* `phymlgui_summary.csv` — Per-file run summary (batch-friendly) / Сводка результатов по файлам. +If you use phymlGUI in published work, please cite the programs that did the analysis: -## Credits & Acknowledgments / Авторы и благодарности +- **PhyML:** Guindon S, Dufayard J-F, Lefort V, Anisimova M, Hordijk W, Gascuel O. New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0. *Systematic Biology* 59(3):307–321, 2010. +- **IQ-TREE 2:** Minh BQ, Schmidt HA, Chernomor O, et al. IQ-TREE 2: new models and efficient methods for phylogenetic inference in the genomic era. *Molecular Biology and Evolution* 37(5):1530–1534, 2020. +- **MUSCLE 5:** Edgar RC. Muscle5: high-accuracy alignment ensembles enable unbiased assessments of sequence homology and phylogeny. *Nature Communications* 13:6968, 2022. -* **PhyML:** The core phylogenetic analysis is powered by [PhyML](https://github.com/stephaneguindon/phyml), developed by Stephane Guindon and his team. - * *Citation:* Guindon S, et al. "New Algorithms and Methods to Estimate Maximum-Likelihood Phylogenies: Assessing the Performance of PhyML 3.0." Systematic Biology, 2010. -* **phymlGUI:** This wrapper/GUI was developed by Aleksey Drobin. +## License -### License -This project is licensed under the MIT License, but the included binaries (`phyml-mpi.exe`) are subject to their own respective licenses (GPL). \ No newline at end of file +MIT License — Copyright (c) 2026 Aleksey Drobin ([@adrobi](https://github.com/adrobi)). The bundled programs keep their own licences: PhyML and MUSCLE GPL-3.0, IQ-TREE GPL-2.0, RAxML-NG AGPL-3.0 (see `licenses/` in the packages). Changes are listed in [CHANGELOG.md](CHANGELOG.md). diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000..4655e6a --- /dev/null +++ b/README.ru.md @@ -0,0 +1,117 @@ +# phymlGUI + +[English](README.md) | Русский + +Открытое десктопное приложение для построения филогенетических деревьев методом максимального правдоподобия по FASTA-файлам. Выравнивает невыровненные последовательности программой MUSCLE, запускает **PhyML** (последовательно или через MPI) или **IQ-TREE** (ModelFinder, ультрабыстрый бутстреп) и показывает дерево в интерактивном просмотрщике. Отдельные файлы или целые папки, история запусков и пресеты параметров. Готовые пакеты для Windows и Linux со всеми программами анализа внутри. Русский и английский интерфейс, тёмная и светлая темы. + +![phymlGUI: PhyML с MPI-бутстрепом на цитохроме b млекопитающих](docs/screenshots/main_ru.png) + +## Возможности + +### 1. Пайплайн анализа +- **Два движка:** PhyML 3.3 (последовательно или параллельно через MPI) и IQ-TREE 2 (автоподбор модели ModelFinder, ультрабыстрый бутстреп), переключение в настройках. +- **Выравнивание по ходу дела:** невыровненный FASTA распознаётся и выравнивается MUSCLE перед анализом; выровненные файлы сразу идут в движок. +- **Проверка до запуска:** ID очищаются и проверяются на совпадения, FASTA переводится в relaxed PHYLIP, а ошибки настроек (нет программы, MPI-сборка без MPI, неверные числа) показываются списком до старта. +- **Параллельные вычисления:** MPI через `mpiexec` (Microsoft MPI, Windows) или `mpirun` (OpenMPI, Linux); число ядер подставляется по физическим ядрам. +- **Монитор CPU:** в строке состояния видна загрузка системы и дерева процессов анализа. +- **Аккуратная отмена:** «Прервать» останавливает всё дерево процессов (`mpiexec` и каждый ранг PhyML). + +### 2. Просмотрщик деревьев +- **Раскладки:** прямоугольная, наклонная и круговая, с сеткой расстояний и шкалой в заменах на сайт. +- **Поддержки:** значения bootstrap / aLRT / UFBoot на ветвях, подсветка по порогу. +- **Работа с видом:** сворачивание клад, укоренение по outgroup, масштаб и перемещение. +- **Сравнение:** консенсус большинства из бутстреп-деревьев и расстояние Робинсона–Фаулдса между двумя топологиями. +- **Экспорт:** PNG, SVG и PDF. + +![Тёмная тема, наклонная раскладка](docs/screenshots/dark_ru.png) + +### 3. IQ-TREE с ModelFinder +- **Подбор модели:** `MFP` поручает выбор модели замен ModelFinder; выбранная модель, лог-правдоподобие, параметр гаммы и время работы показываются на вкладке «Статистика». +- **Ультрабыстрый бутстреп:** поддержки UFBoot на дереве; меньше 1000 реплик (минимум UFBoot) поднимается до 1000 с предупреждением. + +![Запуск IQ-TREE со статистикой выбранной модели](docs/screenshots/iqtree_ru.png) + +### 4. Пакетный режим, история и пресеты +- **Пакетный режим:** целая папка FASTA-файлов за один запуск — живая очередь со статусами, повтор неудавшихся файлов и сводка N/M. +- **Отчёты:** `phymlgui_summary.csv` и `phymlgui_summary.xlsx` с моделью, числом таксонов, лог-правдоподобием, гаммой, Ts/Tv и временем по каждому файлу. +- **История запусков:** каждый запуск записывается вместе с параметрами; двойной клик открывает его дерево. +- **Пресеты:** встроенные и пользовательские пресеты параметров, сохраняются вместе с движком. + +### 5. Командная строка +Тот же пайплайн без окна — для скриптов и серверов: + +```bash +phymlgui-cli.exe --file data.fasta # пакет для Windows +./phymlGUI-2.0.0-x86_64.AppImage --batch folder/ # пакет для Linux +python phymlgui.py --file data.fasta --config preset.json +``` + +Настройки берутся из папки данных; `--config` — JSON-объект, накладываемый поверх них. Коды выхода: `0` — успех, `1` — файл не обработан или запуск отменён, `2` — ошибка аргументов или входных данных. + +--- + +## Скачать + +Готовые пакеты лежат на странице [Releases](https://github.com/adrobi/phymlGUI/releases); Python не нужен. + +- **Windows 10/11, 64 бит:** `phymlGUI-<версия>-windows-x64.zip`. Распакуйте архив целиком и запустите `phymlgui.exe` (`phymlgui-cli.exe` — для командной строки). PhyML требует [Microsoft MPI](https://github.com/microsoft/Microsoft-MPI/releases) (`msmpisetup.exe`), в том числе для последовательного режима: встроенный PhyML собран с MPI. +- **Linux x86_64:** `phymlGUI-<версия>-x86_64.AppImage`. Выполните `chmod +x phymlGUI-*.AppImage` и запустите; без FUSE добавьте `--appimage-extract-and-run`. Собран на Ubuntu 22.04 (нужен glibc 2.35 или новее). Для MPI-режима нужен OpenMPI: `sudo apt install openmpi-bin`. +- **Контрольные суммы:** `SHA256SUMS`, проверка — `sha256sum -c SHA256SUMS`. + +Программы в комплекте (в `bin/`, лицензии — в `licenses/`): + +| Программа | Windows | Linux | +| --- | --- | --- | +| [PhyML](https://github.com/stephaneguindon/phyml) | 3.3, MPI-сборка | 3.3.20260528, последовательная и MPI-сборки | +| [IQ-TREE](https://github.com/iqtree/iqtree2) | 2.4.0 | 2.4.0 | +| [MUSCLE](https://github.com/rcedgar/muscle) | 5.3 | 5.3 | +| [RAxML-NG](https://github.com/amkozlov/raxml-ng) | 2.0.3, нативная сборка | 2.0.3 | + +RAxML-NG входит в комплект для работы из командной строки; движок для него в окне программы запланирован. Сборка для Windows сделана из официальных исходников с небольшим патчем; исходники и патч прикладываются к каждому релизу (AGPL-3.0). + +Настройки и история хранятся рядом с программой, если эта папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux, `$XDG_CONFIG_HOME`). Другую папку задаёт переменная `PHYMLGUI_DATA_DIR`. + +## Установка и быстрый старт (из исходников) + +Нужен **Python 3.11+** (под Linux **3.12+**: с 3.11 интерпретатор аварийно завершается при выходе, `bool_dealloc`, из-за ошибки счётчика ссылок в C-расширении). + +```bash +python -m venv .venv +source .venv/bin/activate # Windows: .venv\Scripts\activate +pip install -r requirements.txt +python scripts/fetch_third_party.py --dest bin # закреплённые программы с проверкой SHA256 +python phymlgui.py +``` + +Программы ищутся в `bin/` рядом с приложением, затем в `PATH`; пути можно задать и в настройках. + +Запуск тестов: + +```bash +pip install -r requirements-dev.txt +python -m pytest +``` + +Тесты, которым нужна отсутствующая программа, пропускаются; переменные `PHYMLGUI_PHYML`, `PHYMLGUI_MPIEXEC`, `PHYMLGUI_IQTREE`, `PHYMLGUI_MUSCLE` и `PHYMLGUI_RAXML` указывают на конкретные исполняемые файлы. Тесты никогда не трогают ваши настоящие настройки. `scripts/make_screenshots.py` пересоздаёт скриншоты по настоящим запускам. + +## Выходные файлы + +Рядом с каждым входным файлом: + +- `*_aligned.fasta` — выравнивание MUSCLE (для невыровненного входа) +- `*.phy` — relaxed PHYLIP, переданный движку +- `*_phyml_tree.txt`, `*_phyml_stats.txt`, `*_phyml_boot_trees.txt` — результаты PhyML +- `*.treefile`, `*.iqtree`, `*.log` — результаты IQ-TREE +- `phymlgui_summary.csv`, `phymlgui_summary.xlsx` — по строке на файл + +## Цитирование + +Если вы используете phymlGUI в публикации, пожалуйста, цитируйте программы, которые выполнили анализ: + +- **PhyML:** Guindon S, Dufayard J-F, Lefort V, Anisimova M, Hordijk W, Gascuel O. New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0. *Systematic Biology* 59(3):307–321, 2010. +- **IQ-TREE 2:** Minh BQ, Schmidt HA, Chernomor O, et al. IQ-TREE 2: new models and efficient methods for phylogenetic inference in the genomic era. *Molecular Biology and Evolution* 37(5):1530–1534, 2020. +- **MUSCLE 5:** Edgar RC. Muscle5: high-accuracy alignment ensembles enable unbiased assessments of sequence homology and phylogeny. *Nature Communications* 13:6968, 2022. + +## Лицензия + +MIT License — Copyright (c) 2026 Aleksey Drobin ([@adrobi](https://github.com/adrobi)). Программы в комплекте распространяются по своим лицензиям: PhyML и MUSCLE — GPL-3.0, IQ-TREE — GPL-2.0, RAxML-NG — AGPL-3.0 (см. `licenses/` в пакетах). Изменения перечислены в [CHANGELOG.md](CHANGELOG.md). diff --git a/docs/screenshots/dark.png b/docs/screenshots/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0cdac169a755c2119645479020af154a19bcfe GIT binary patch literal 115172 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 LZxOX__*;JihZCQj literal 0 HcmV?d00001 diff --git a/docs/screenshots/dark_ru.png b/docs/screenshots/dark_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e4dcbca6581c7c7fc7980395c9d3dc42ac7909 GIT binary patch literal 118207 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 z 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�iIgueF;|U)cjBI7J!rnlY9>(b~UbEX((OrzM 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/iqtree_ru.png b/docs/screenshots/iqtree_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0f44e2f5a0586483f575ca6b0d852a181c84da GIT binary patch literal 91969 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Ⓢ+|@ps5JXH@K$e;q?OIS~32E$0qYt@eL zo&WM`UsAFDA&^K$rQMBbO9pbGTj$KJPmm#i^gMaChMyEnb4&MRrjI|blMs_(3MAJ% z9A4@!&-9w4ZN%CvN|yO_I_$USk0tW|VqJ>~Q)z?LDXQzhbCU z7>J=BUn#P!l-naPb2aKOBSKmGz_vohZ*&{vzdF2$`2>^HU7QZWD22+LMv=FzxCUJM(j;?4ruw)^4NR{@lgv~ zFa$s9goZBj5Jw2X*c^;0B41mreR%9h8Jw$x0* zRS7oK1*m&h0Tig8z^-Mf=zy zrE!HPp5K21(f#{@eA;UXV?9~5R}IR#MXR#je4`EBM8`xrNk7CGiiFxV=bzNaV)O8% zvIlP%{7Sn)&f%BWYGq~d!^&yRo5>vrwF(Oz5o?R+*9Czmm|! zw^8PK=C9OLdN#rH&mKLk(YR)!xty-vp;a7CH=mc6q#G&O2~YyHf!-xX8tm+~B=>L5 z6|Ei<1c*T4J+0F|+-H~MpNm{w)&F3k;ynl|WwCT?Vv6b68i#}CWJ0(pR0q;C7k`k5 zBFmgy#=6rf2+|L}q{HKGY1-)`ms*%gQFDU$H`W>4fQp#-X+rAmw)mL$Tk5kh!N^hW zEqwK5`hkTL?9h$L>J-m5%JV*+?DpZHX|jJP@7J>5d6DpU9Zk4m{Zvc)%hp>^gmVA? z5!|`G`~P_v53*)b>7UCx0YwymMg1Cts`k1Ko^OElHGBra5I_dZgZ;N4;KXJ96 zR$hwYIj^(p@}uY(5LbTxBaSSAMh9AqTu-ru3#t0Mu7X=^75<3WfDftTd#ET?ZaW&Y ztTIwYbO;}l{gOS*;+*r$9^Aus*dGa%n1-F74NJZPS@flY`fV4_Q=jM{g)p0#vS*w& zlw7-FT)Y(B&I}jf_#hNDUaGEpE@H)l6Af&9Yjw4>XK){r@Ta1Dj}(yWFJ?;17y(-U z+U=K{zd;3kv+{sMI6fgw)X`;K0;Ii`0pAG-n1D!eq^23bG0uSN&bt~?RlW1SG_y9z z%|3H8WH;8_#gsa>k~zeTu3@?x<`f4_fz-5jJf;3$c`OOenz0&4faZOWxn3XV)fkO4 zx1|SUge<-=Xh4p!C$hQ+5ilSLpHS{(oh1CgOL?qi@MuO15^ z2pg-Rv9S7~zW^dBJ)@kh(dr^vvVYTIx@w30STN$IWONLq>>fWVd|9L?`vFNl z2BuLla$i)+N0RM|?vD>=%pFKjJVwEA1Z&Pj#-UVhr=`8@&EJM9Fh1CS-#uKHQt#Y+ z^)qNny$0J_gIG7SwjRr((5h$%v)oi0llx1`U3+4wO@|Oo^?S$#R2cPWu#x|=vJ9o2 zk(o7F&}4tH7=PIw1DVOO=UqGas$UAzfYiM#SGEg&VWz^PGc+-@P5|knP66BcTUNWw z7F)nXx1TEc0Pzj9xzb%%2KUQDR)=9^F0Nm*g3-!_E>j$QhJjopUmoBZ9VC_O{#gcg zczhh%U0oQPub9rWya#~8V~@hVSVJ?)&HR>>Zi@!zV|*M)RfUwE8qgsV_uFDa*ACYc zHnppHGw2kn_(PwIkSE@}xO@SkJBg}|QILqUK<9PkSZb4o za6c|6o(w+xf$PiTqEm^}i!B!x41p4`XRL#QN#buSjjq&eSa`|rtI^H2SkfGVo} zZ&Ln0EtUJ<%zoc<>WYi=i+@wYP^bhcvcvuhJDg<%hA#@o2gVpK=+)Kk^_~JaK59t% zE=rpLxRebHcF(Z$71(Imk?llj6}m0|zi7n7rI7^~-czG78Swd@K>MG#a2Xg7H=yMD z|BD;{QNWITD_BGJe~%BYQoA}T=w7--bMTJ^S`!y_)qRMAI}?HjHFOB zXI%Vi=dr-(J_wBEVn9t<>>_7({(1q54RxL!&#A{+UoU1S_t^C+^F&%1(8~H;$}ojA zF30hb`plvm&Dq5{13RBAdC826xy9n$^PSd`()!~mb~|sqW&a&LY@fXS^A3nX>sIgl z{Mj)o71i!_=SdCw%zI?Tn)kw@F3W?z6p7r-7EjcMG@TC-5Ewuw653#zw|7Iyd2wt8 zi;Ig(X~k@Et2`IW@YxgFZCJeQ#h%?G*rsT?sYq}2x@-wMY`vb!L0$GY5IsFov@^Jf zQns1M^!h!8R`5zv!)9+H6Ka^;-Q?*7o{zn(_etsB(xn1eV!1@RybpH8<`~16%2SEh z>YY{y5(knfsrEO`YRPZ9w+-|J3aStH2cbKo4sH`*NA{Z;t?1EN`hf`cv!Q}rgPQj2 zsr#{JipdOIS=Lh}TBGvx4BCHtDEtu~m+kQJk=3-MWT=?>QTk2!@uJM$vaCrKyS~`z zg}(cdLF@aYRw;6aG%MV7pX;-_7b$U#F_SgNk5b} zq*%se-hJcR%ESv%jmU#N>3O>Hlq%24XZ$ii{vAwgFY%_{=BOf({~A6q?sGyPcC#dp z4}Yf^V&|;Yxp&LJp}Ubb6s!(!C&qAO+9@(z4XTHF`=+%=eQThRCQvkQN3)_Ct#5|S4C6`h+sNTz{( z@7e~rch#~4l}VL{P>cPhSt8pNEN9L3eBkcQ8kaLK&e^ZE-80Fa@^K&UNvN2++VEff ztf4yL#ONp<#A$KN^FA67exxDP=xOo6TH!ZNc@kP|RAJ=~t0FAOJD-jHfAS;Gu#vl< z`{NwKf3?jB20T%fc?P~cXL@w!MF8+y81z8OKdxDd)JlLL8nT4`_YL4()Jla(%}FU zsYG4qd5jCF+4cSCnPqEEU_E!m1;ha+|G(+Aa-{t&dovefjs{K z9JnoV^8+ktaPRH?wOjApwymZHPg&ae*2`Lu@y*q2-=mS3-=~0jUy)`QPmLiPdct<% zypgj1(@_Ka-jXGZq`c(J^K7*EyGI*raCqMz!HH-@+X+C z6B4bG#PUqMIu4aFwfW6dxK_rbZZO#H$MOiytqPF86Iy^Y`3<5deI+%U)~=~?bw`5# zlOV{K1?R}X(nKyqfdX8n44iTcl*YYs^jHf?;AzBel9zXnS(E4U%H1!=G3%7|7VC>= zbJn>l@?~JWLT~Y*N>#mC2F(>5*O=}eP;&Rnf@1IISJPy!tej7GEWP$$Pmdf&I6hds zJnZ>BV^Mi96g^F#f8CiiVZ-P7XBj8iNPs%;^b@}A`WprqbNNHjN_|8GWPGN1(keMo z;HbS>`T8BAbelwtZg$KOf?p)Aie)U~;h`*@!qy5!%nD^*c6If(2~@V;l+HLZBQ@;4 zZlT=&_A@q;E!s*~V8xSF7%lRt>g?|HlvE+4lM@4@PDE0?X3M|S_f zHZD^pSNQK4Owu~Oo5~wqBMI^z7T6B_7Bu(Vq%U1ih0n97`CyEMOT&6J!Am>C=Q@4@ zTiMa)d^us6TUE{{Mb=7R)U3g|_xAR!-!6KJDDsKLMO-zq1Zh@YjOSqQGb-_TE~NMJ z`4rf1%>MZ7GNG4PU<)e7ar_1Q{5}c>gJqQDc|0r$U)tS7nWo4>a3z#ZEB9i531-5rBRpoLV_F z$HKNy!jKjC1YfU*3Q9^EhnN-CTCe5wCe)hMtbx?5;UP7c#%;6Ko3V-`2^;H^)|RHL z4Fa{O`e$$vqS_RZemZ&sABpy~+K22B(cRA~vjVsaKsg&WB)hmc(H6A>ZFa#j*QUnX z-3xf{Qe&yC_&gT^BLk2VZcRGK?tp=r0Sx#)!_NXej~wj=3KB!S=zOjKBnf{H#siqs z%>s4vj*A3BRpz{kKELbrRx3dt^kLe%3&#b3fwuY?YH`LfMRxGhvDn*9Rh}8oe&gu# zuQdg{WS5Sa*j6`D;T(f)3|>gTo?g=R3r6&uxMwTvZ+9#EH6kX{Il(mIXjp!q*EhTd zP5lsdy*OZ%zg(t_@*)GnOVg>#RAj{=#_z7Q0)1QMwo92i|`c?`DR?37<4~7>K#ekN3L{;JB|Wr0&9t`91@wFoJCw=-jKpY4K&o|B`ogFUTbaoQPa4Lh+->phq1NyQ~AVZ;)>W+ASTd!8rFF zPXO_(df!I7`Yc^c5!ik^pX!*HJMECZhAf}$>NnRaF2jRb2+JrboOUf+cE@1=k6jeP z*r7&MH+pK=^H+&Ayc7BtEB)p26R`%3=Sc7-a`^jft>vV!xb-|%Y?;jvg|If9LR2gM zd?o@|+tlI&ku&qP$FGo>kTTKX1|d&zx&Ncw&f~&S%xz;Xs)xDXrr;I6&($RAKV@7Q>K*3x>h(a^(sqv=@@9DGk-*!{$4@Mbg| zjf!h?+~nqxe>%hSs!XWt6Sm8hm(K2p-K>M`z}*MFZ&&xH#U{Kx1)r{c6WVcD6GDo7 zQQTwPRr9wuCu%#Mv~LG{{7HI(#Sx-~FLGjedIn89d5MiX-`;J^5oF@^J3=j1)&9~b zgx*~9ElzOAIKQ{p{yYSqR#+d2 z%Un+W&}Z8D5}S&m!92m?D_U4WS<-n}q`|d=bfZ^GZKZ-18UPX0Q8(3=ldIK(ag(|= zTLsEZoRSq!#|r6p6wkev0@g+vZ3%IO$p~#!o9{(5`8`=$y+BQ<#zATCy-ManB1Id= z-Rse)1jW?Xbhy_|+y4O--;L9b%9qy{x{Tjkb~i4h>_RIpXUcqR=R^+1gG!HSBU(*Y z*4VEOC`6s2XHLIo&!D2Cw8dU!=!~AqYz-xI-C~BK6!3%JgZ%6EG+Cw=I4=FxN4HVf zo%G2PDWCJABN_&)UA*!HoLOm6`kB~U>ol4+ zUpA%HVzKnIS7Lk4&7^-e$ky%9vF@t%ct?b(=wOcGMjEF+g!{`L%p@>`2rouFg|6Un zn9BcX?5(5P>b`Yhs!*U%tU%G?4#k~P+$rwv?i6o<;!@n9#VJ76#`_LHh@9wG~)s{PpJ{GA& zYd3Yx8l%~5Im`YQH96yg<6xOWourD<^z=HR&~(gX?({*gyoXP-XHoC2hL@*BITu>C z@w_L&W5U>0UQ#&?0U4=2*G?PF{AZ=;AQ7)sWsB(#E|BB2hR6f!Peesr7AtM52`hNz zMKVb^smEPL$I0>8{`YSsB!l`%d94Ix30W-^;7()_mcw*bpWKa4Yd9{OXp#PMVqNk| zfpR|_K4?xjnKQZgFNqx8PKuP1Q(RA}W^}k%DZx~KuimdUMEAz}cANq}#&5$fzfUE% zZjswz-kX>;!SmEYKM*}HqzkN9=*34fZr7C{;{47Tco;dh1 z+6E^X4Yv^5%)Kt2E!PIu7VWep28N9Ck3SJ+r7k$0Elh~TpFQ#uN>u&9yV%_Z8K9e? zl7Q{!{-uWaS)%l1BOy(PD2b*e9^c+xdS=#}b+|zrmpe-RuV4%*l$2XUt8)%+w~%U3 zfaAcO=lsQ0Nz>NtxRU>3O8ir#uXO#aZOy*Sad)&*U_GP*X>}{5dni$nVYosagMP*( zo#!9VVa8fX@N|AsvYn!p4d;SnZ!0GW{YlZ4ayINC&FAGO&3;8ONim_6pZQikeUtIv zqYdat1(;^YiZ1!hXO)Org=yW)q-^Oz#d0?VRi_Pna1JGe`?z8f%4xkUQUk%ELLkmrJ6rcH>&CX4l z4%s9fwJFMdu1c$$eCUHHaaYxGoR=QnbAhZZ0(jaE<%DZ}O-^4P3~$EgyRc)TV^deP znCx)7(@ZMYtiIk%n=p?Klh4w*qA5RFbRNm4q{yv^@r@QQ4vqB3%H%k^)`c?1;=lD_ zY1c1a33q#`i(faFRcDD^!x;ZDoq`qv$!I8Ji7`;J(%*lhEj`EYbQg_C!y62=?bd1> z==ydmX&vtO_eWy8X2w`*r$Y|f-#e7Wf{Fp`g__cNxa)TQ1q{7-RzSK&mDbj3=nD+* z{Edu=)5vZWlvUtQL6cGCa(>Vg3X1&-KBK$ntl}2Q?!!Gf_)a0VLc(2#8ayD)rqn7l z*;6bhv0bKMQJa$f1Hsvhjf0QLX~Xip$JFUgn~j^;K`(A5mx_3^w!rE|g|vQI;zReBhHy0O!B zw2+b&D}`))zK#2p4#LvONvZi%x}86=I7r3SEZmH0!ylgLSY1&Sk6W^>Kw?2rv+4O6 zdHCzMrN%;Xid?mv(CQe;HOx;-zuoc&=sdt&uDXiZvh(>v*6va17|Gl;(23t1E&ONd z$W8g!kvz37QW$Ut`d9n;-aCA^O*sibq6Y0anm)IHefBq} zz%zuN?r|#eb&r@_LSloQz8$}oj^x;f%EVcQTsxmgZQ+Tua}WCgs@yUt2}1*1KEC|( z1u>U4;0i>3?HP;vl)eO6$yOAcwL-;ueZ{9^z)+N(l^*rd-kW0bhjr@KSOQlnWFQnL zrCLYgIE^V$qO1^SU|3YZDkM0l zI^044T~V2$^b}m@1?hj@t)4TtQ8lmiZe24gNU?GwLoXBoTj!7RB><_c=39_(w5OG< z9Z$2qo&Np^&$d92yb#dheIR{;bQ%32Hx&mf*Z3vU-&$_w%H-rH&k72qn;xX)WypiP z2Ch^~fddhI0=8FbNkp|54ey%R`_fxd;^E>bst9~x0wH@cWEzT17$5s=GQqsv z>dD5=dX{;cn2Aqy_^eg4Q?2ii4IbivA1f`LXw++w{;5xd9q!&Ba1@&=H58uzxKXaD z2xpJT$}1g-PB2-lBxJExX|S0s*QvAD4|mM!6jG?f#4l;l^=XzgD=Yk{>DE-H4Yv)E zNFf^ zB^TVz2`H;xpdB#KiL6T>^_W)#rkXTuWB8DhWRT0J{CofX@-%0}%o)uQkB5Y0cmz)s z$X=-k|J8Xi{8Cg!Er;W$%WcT1c zyJshLkPH=xYqmKW@X!-auT_%QvIA)yChW**>yd{}5N14Cp&<2`P(wDJYblj{#Q}&A zJH2B{Glkq`>7ji(m~^a6AkN1}2i`F?tu$k3u8Wd4WWAEyWv65?d;^<>hxutA?Audl z2YIgU_H3Z@H7q$}Ya&TX`e*YRo20nuQaYNE4Yl5)9u6L%gQ0_|pD9x<-rNJi6+BTk zIr$k;-T?HKbl#l1>^Y>bj(LS-w4Vy}2hI#z{P5v(jpeAx(aGtnyKYSSwB_*KDprwQ z`p{oHL6s^o^GXqQP}b>5xb*|gN{hk|gF>Qr)6FN->G;f!zt#5!gzv;JNIr6?f4nI& z4_N&6#2v-k$B4bl69d<+kVo%~J{+@Js#cKXDAzuGuijyQ6#LG?0Qd zJwv~3@p-C?(@Z>CC22`mNJ#P@RId-^kdQn}?qh(Z%zWvCI~$2c_W!uHhux;bbPA<}bex;UgHIIsurGOl%bS zTs_@4iKe5EsyVMDd0D~TspIdm*!uydn_)pdo%ua6fPt{}>a_@W#SScF@p+yu!LW{}MU{bERaDs(y@}uIk;2<4 zVJZx@`x=j%+|(O**SmvM+1W{wVwIOce$b*RJL~#4aX#xSFLMi*_HdJ{L#H^e7%(@t zdN!g2%jt0;jEpVnr49>BFd9#hAo3@%zk(~0J`D_OpgLj#ZhvEG7BCaxu^{6sY^1+# zllpmkBO01!SKgVAYnR9Oq8t`)l*sTkhp>yO zot>bWc}s?bk ztg>IiLUErdhLQPQ!4XD`!k z!S|mi$pk*CGVakDJ;U^D{gv4eM>igq0-P4M=O+}d{t{D$AUmeni?^1}ue*2!o$I0u zK49Pp=l~YcbXvTz6?6|WKj7c!w@F^Q-7sA`QbYfj3(*N?rWU#r7YD3stk3&9fq)Zn zwjdirQH9}o%&lE^pGK|aiO?{~@pR#b=}C@&gysk8KmU||+SHOsX^{@*thQPaTM)B* z6`!XTRE7hw@)%#mkmM=?_ePY_H(pSC!Neo@s-A? zFnOevbOHg-&9j`boK~*)ml$V27kJg8Xp3QWakEbrc6K1UChz@PEPD)&G{9_s$whjy zKgr=I^lWjTguyjIacUwl&V~*1mHo(&!|ZR}CYb8WEK|amIq79UIk+FNc?o7%>w9pd@Z&Z=*3M!fEnChUi@h4%1vj~nVMj$VhaM1qwO-_X=v+EN%>@T_;8lD zK^@CkZau@aO?k6=M#B93G*pMuV3=dPFr|sM;COrPPjQ(-bA#5Wr{z6XUf;UILCw)@ zx-0gxxHi-~UdQ_bmANEys^b|yw~|{Xye!ocw5cqPjvxcVSR-?I4V=2qb!Es$+2B8p z-erB$wJI4Mq_iINSl0?dl;#Bg-eZZvXT;u>D-#}X{R3I;GsjpUHbW-2O}~3JUcQ7|(i{-4XuYh@Dr*7_Yc^P+wl+ zXXwEhqsBUp=CDeWl(k#h5^iNun2v5!v0Q1X+Y@=^8lES-a@ zEFJ4X$(_nOdc5qM=Tw1yUo7fd6*k@a&VfyV?c7=7pRnka$Em%}`(ySD5ZwVGPo5DC zY#Xm94l9yjK3t32X4~KuW9gO5vDAp|bb%Vlr?X~nWqux2_+Y$?g%9#*Q>w;O)PelD z34@n8T7{_o`tEYCw`x`0V3(ehp*>RDn5KgvUKcjI!_Ek{SOc8v-Rps9<>cp=6PIjB z|9H65TRHTbi9pWEqX{{=^$b~Kj%?7rl;Neg$EYmp61;zQtoWmo>{X?MxKYiK`Gkd}@oCJf+V12X zaba}suA&kjvk!2C3(;u2(tvC5nTB%( zzm%efdhBlu=%KaFZiOdE7W|M<=ie?mk<{XeO&>Pf;-6hbKe{C9u?v;`=zvVLmJIpx zdhrS}N*EN_s&1==9VKbC8i&f%sG5^}0&MXGT|0}n*^PMe(L(mWGc_hxA^%`YOFQ+& zE;= z@eJCXCXp@=l%YsSdvu>)@@xH`a>_UlUiIlM!*ZoeFj~=BVYch|Mo`g#XwNCR95wuL6f>N%+B4 zE5ZdapnFQ^decvP@t)U%BSh#nbxCjPiNO@D7b8lU}j@>9ABwa3v_HwTo)Tjl--+RXRU4#!59U*Q(_eb5&M*y4YtIp^x9wTr;fi%Qz+Pt z-jXf2A=J&2KsuY_j*|WH{T~P31Kr`+Uch*CH2cHucN`52bK3M+p7&0I7V6%e7C8R@btaui2vE+lx|#)bIPbKxlxf9C;A?{7nq!tlgFWVqbN2 z^lE_dDnNa4E@-rEMz7|aQK=9t6?&)KQD$~@YD>?Z zcgfN}##R|C$r)!Etg0|%0EtIMT@Z}}*ld$AbBq{ZcxaR_O=tM2{>Lg+b%Fc%CD9n- z{rsg5ppzOaf3)9))&BK?OJ_n<)3h?T-MK>VB$_t-a6U$qu9SD4?YCD{*;d=eCX~G_Xm`B@4RdrQ6eM;zUzo%+Inrbi zfEAf`-{USIBZTxzOYY%*?}tV`HNx}K-iov{$)Pp+e^{6MOp*y#bZGY)S+MRY($E`0{DS!`89e#y4V<>NY%`d2PuSH~+9fZBNU zhX~Q9i;v=SyTkt|CF9Dyq9h)0R~apGhl9nXnZ!kl z-+E8>Kz9f22xvVHP|PAB%)!Y>zj0j7ZWoE!1q8P3^h!kV{T=kgaPxl8P=oWqut+Sq zY0I^y=qB%l;qtxG#Sxr6FK0XA#1d1E`!w=x!4zL)r7tXo^wDF|Gd9?Uk zDm+?GyV~P6^jU?Pg2QNpuNUWdScKak-z%lE_%9O-twfsG_-Q=`c{&;ntY4&j={$Hi zjXhrxPJeo&Cv@KA~IGz^cZBiZ&Q;hKuQpAN=J2mNt{Hb^{am3(tRU{mRG9EA zPcDfOU*eyqaPzx>mxVP&nhh14H}<4}iu45g5A&4&)OM)-v2ES|JFGnkCizisKwWdM zs-eSB?%m6)Hgfn;d z+fGEl+4Z_=H+-8B@o=v605i@te}PwdcX87c8D3!!>D`*|a(uKR@Zc=^KnA`VwX7FH z7H*4&Z3N7AT$m*vyk}wY^dvSs+trMZcX7qDyuXc`27$hr=CEjX!1Krio3_qZ?{1w$ zu)?>baUT}uNi#TRR$PdIc=2pu2txzQgkHh3KS=WX4G5w%`O2%{F2 z?yQFoNJJiD5w@J3qF7gN+#{1ox6z*M^mf*0+LM85^&%DZN)nkfeGaD9uCOR_1$f3` zL}TDEop|rnX9#LJ3Yy)qx^bn9kvO?yIXP99@LKeDV-f0KF3z?~U8&<2QeQ-xNR7TN z(kEPel@e{G*cEuG&BL6mD=zL?p~d96flo8iW_ks3GPW~_KkGz3l1rDm4gW|%_F^Km z-1}ZBygp3cy`raO)BHC~ttF;v2x4|f>aAKiKaZDPRt_l~Cm=!{hT(zA()rB~n}<9o zhV*q8T=KKR1{MJSLE4szA`kxN6jC}Mt9#-89oSt9?HK*Z?OfG06&l(_^9Qidc`|RX z4#AEjscARXclQV-ePcNOoa7B@ifj$Ot zh9-K`TbCuR)d-_tQV0^M2J_h5LjtZ&b^rO^mGY7Ya zc2~Wz7Udu|6g~g8@;KH|pls3%e&bJhx9g5pHCQ>`vyPR!HnRKv*k$DYFgkXPcRVR{ z6f_1D(Xlb)I=9<(i`Bi(RaFS#Ydpf}sD%_irV+iHlUtOz_hVxo?y&NqI~~-?z^KYH z{vv@PwCah7%%U3X0z}!+l`MsRvzv9GG?f%Z#Ql`1VFVjspwOiA`kk2$4amn9R!!=P z^Hk`OM2G2I6l@e-9>2xEqKk4^Y4!>=F);;+gv&Nsit4EW8L)bRROvJ{(8-A67jpQ0 z;*!0riIUR`ySpS5&Hj5`qkNI^sz>3`5m6C_{^P#Q{Jvg--jmfYCTlFEnB~KYCQIjo zbFy59eZ8nWCIbm_o3Le|yW7L9(yAFdwgYX%K-8=8f&G=1NN?0jta}|25z6b zyt&z64c8ltC^+}JiS)(&m=a)k4~_LHL+G?inuRrf8C-{j&NT@W^OSFlst{srS1?og z<-~<89oP;w$I&%3kG+eEW1PD1lVo{Q<1Yjw3>%n`irM3_vxet~EydR6t0!(_JBw1V z{OJbm>Ydr>qQ-ne#gdISL@&DYN=n+^8G2qiu0-W&|9;WMnIWDMUwdz^D}lxRR7=&O zM0|)GjQb6s&m|tg0S}v!a@hpHNKJu7LN29(zS2qY@5KnJ-Je5iv7T$pAos-9n1=0?H7q>w%yi&4Sjs;=2rJ@nj_2a4(8EdOP2BpGoK zB?efrH`y8hJ@!0(Y^DUDfz3j`sW1qNNJ~GzIRU_ljJ}fYM((U>N$ct^=bz=0k1&N@ zw5XGM-VAXX&*n!2Xa&WM&0`qN$b;xD!lrt7a3~9QXtXm{7Pp27`%Lw%x#fs{s%_;} zgXI?=>91E4_KyN@=DQkB(5CoPG?gI5(9mWJwhn-=uon(j*uX+>H8yqB&OWnnXjU^#czjNx0NtuMOLAffX*ADjsdiLu+;r%j zolJ}PdW=S(^dAM1eV+skG>JDjfGJ$`#a(ZbuWljuqdff%v9U^TBo;+dxgvQ=EZi>M zPL>f-;^5-oA1wHv?~Dq#okJ~Y$Cm2FSFxD72To2D-rao)*g!i7(cLK>-rTf&Wsc9R z$4!xovPZF(c3(PA^Hx%)0u*D&EfN@p9lynMtzejWza_tQTfn~9W#yBL)deVmYaY15 zt8zX+Hpo$%B;++fcaX5og2486&_yU_nE=$_F)D=NUvF_qcm2rNN{|(hxKYU-Ur!xDx%mH}hc{fIEcc+S!_G5!o*jCLSh4cLfIOWf9 zF~!(*JAH+N>YpVbU<0%JG8ngl5SEEfEoL%tmhB5hPm5@IVc*!m&z^Cd-7{kUKd!Gh z6@=F(@g_ay&d>6!PE^p)U&3~4^j|@`O&rwP}BRYp!4%TD;gF{G-sqlRV>=6I*@z~+60dhNb=L*h~ogs%f-OsK&OFzqP zA?S}g9K%D4vc*TEDVjfY>AK^R;7Q=N=v^sai_JaI<4e6F_B%Y=o?M_t2>-E}eO9U= z^k*MjP=(W-GC~pS30JGvKBqdTtk7Y48=00LnXd{t`KtUw^<+~X$CbbaMZ}>D>V4iDBrpE^f~+YGqaq|i6XrWxh7jQnBSq_ zbyuCR@GMn%7yOSgScPIoG6OCP#)&vUrA_;eg1Dj?*}oZ@@SM8)cs%^}2fMsi;S%;{ z`XP}4NU(L98%9Gfv9!8yaFzhINoulQ&0qDTRM0^8JgT9pRP+)IOA zAZ4}rhx`1ZmHMNp{AbTk(>CS48IaZ3u%dAheR`Zz`VqjXyr4!Ev&45+B`s_A_Ug!# zBOU*hmsN=AR%^lK8E(X##i?zqzsWXJ=6b!Jbt4MC(L{51PjqodI6XpdfBA#z3vsCE zRcMJ1p@+4Kw`s)lphLzbyB-08j_tHiH1^cgXsA8kimRocz=FBOtQGbu<$QAs_7S+N zyhomcNvNmVki*W;j4OaTeVjICurA#{pZ>zn65Hkt;+SUhjB%(yvYiwlh*Y)KEQT@{ z9{P&V=7g>b@*8bw10L?_<97;KXmWQ`z1((crXiKm_+uRw?VO6ZTs-@5JU>LgSjD-9 z-DRlw=}xY^?{$$#^uU}sm0VdsQ^6kQp#S-5zanVFSB-pU?L&XqO-&6x^me5ZXP0rj zB8r@Xe;#hwui_6OPgTJxTAKDZM&sE+wf72u(OSyHTFG2CeWMZvs{6jZ4LdAQbahK5T8w(_qZ1}h zn|k>pefho*?lClqSJsZNIJZ=7L9*+&cuU_sQ&1-iODG$s;F|sI_VQ?cZzB_X<=Ygy zO|g;^6L{hyvYh%mFc7X-{xcu?u{~nh;;t^B_{zwdl4nmWr4r8zsfbG3!GRs1&FGx# zdM2!X9LK)_T0W0`9Xh4t3y`My_zy2VwN1qSZhtzwxLmedh=SAIwG+&AgHd4}VX>7+ zb8cyGz!k2>SFR^%!8RJmw+3N;Y4z5G3X~S6wSi>LuTFLa}NononIWh5Jl}h>hxy? zze%gJu#`wf!2e*HL!i`CgYY|ISlFn85ddxqoG*8dWvNr{NYZpRx0oQjC?pxZq=EL3 zzy|r@csM8yFMWN`eciyuyHCQQ@al#nKZ;u1~%|1V$?7{B{D21n7$2ng$cslyr zc2x%4zD0QC7afUQ$=OdmRIon8Z>~tr;WP7*RL|X)tr7*?kDrBnqcte=?>h}$xGcpl z#bg0udb;MLTgAtS{ja{iWdOsb667j!E>btwI`Iwo++YXe^Z4}PVHLOASv+vRzis7v zjN^#`JgySK_7CNV+lFPSgt&%{&pYr~rAyAgJ1rbG!W>Rxk2pxEg~Uj>!4E1!QjRmP z2Xe$%Ucq@qfHS=;T)DdEv@e$~R~Mof;E`N*%-76eL(1;=!Pj+T3_8%*OOF8KxZdWby}^HbWUmlkATx-TYq(#K)g{cmz9G5 zP2T)&KCN%m4%B~Pdrf?^ixa1`a(vZvw-Wm58`_Y(ZV*6J6d|_;phY&=zvAA?0Vc8~$(74cx@E4?^~R zYCt@*Aex#o%@54$EdRa=!`+*e_HKL)yloRUj_;uCM)$khiQcM4bF@!yxw%bJw`GTVa3%_sl5nlkpS4^q;I%{uVDlRPa`{os0zN+)Xvl^4$ZqY+Y&eio;$oZ zn^LB+ zi%&(L+#kwr6PCt44U$g>@+2OIYWn@LBoL4=5=(Usp+8P)vg?s23}L;i^n*Pxg1#g1 z#BYU8b?d)O4RI-j3Aac5SDKm1TUOaOs6$K!iEDoRPXeg_&6Wc2a(Ql67LUbviKFEd zW^GQ^u~3N9lxm?I(481HR-Ki@DJGbAQ$a!v>{G0nwil|7-S5JMRPLN!$E$5__5u)$fteW<7PU0>E0yu_G=Q(Cb(ZVtXDk#30iu`JpP zEPp{vN>1V6kGHK0+j4L98^3t%MxN(AJs$sOdcG2F0z@EMO6coC)?^j~UXkq6CCfhO z*QEIT;f9K+mA zvgrA4oi0wEDC;Irt-_?j?Wi>=p6Ya4u2f?viMF;d+ z?f86-x)yl5{;jFWL5v_y6L1S9jC-F8&^;(E|5=dWcbjRzrucWfv3p#Fe@F0>!2f>T z`0LMqIs*d#`A9(iKlqQRd87c}Ph{6F|9RJl5vEAK+hU-m$$vM*ClK$YXWv5qxazL7uXI0laa z!j!_2Hg4FOdB5hj&Vu$=-c`jhm4nvAIFOUVq?sk4iHo1##cylB4(pd(4|*}BRBItY z{*&jEz#{@Tzq2{fA{cf8?thJ=L*aeOsPw&x0Jt%*^&+EzpEMzXjj5BQ@2}3g^@+cx zZFcpp4}>ium~`G81zu9y9D$0PT&?GzXelEIro?7nevbVCtjfI$4BjX5&X!|_b{$_B zKm|Z(cz|C3h9?k~gtX>R`{gvS2Er2Df{Vm4w1}4SmPs1Llm02Cus^uz9Dk)@JfGhs z*e2p9`o}lXzy#XP#z&r0COhFj%KDL{Dh0*X-p+0Z35&7Sg zQpJTFzvF?+{u$FR{vX!&|0oVlp8H>}s-z6=O&6+jj78JnvgXD?&MwFdjLTv`S5^xx z_kTX15H08EhhN*BhloxIlO3D4wA7Yrz)K7Q6ePp`;aL0I-mi$|qOVV)udAfmhwdCT zLr?r~8BQLu?xw0XS^bzVw{h1#(3w6`Nb>jmn;cU0zXmxQbSf*yUaQ$0CP7UaG#OSZ zyg<}id-vZ&p6ZgAxIgo0x{~nhC`2>Z2HIQR->sjOwzb~X?D>1x=|ZK5h)_>Gf$*+~ z`UthL2Ji=7#}ccWBa<%>T{sZ9RQR>TBZrSKuwm5zuL$L+*ALGP~3WGy^re725M`tN3hu9dLv5rA1HqCt&Hmam%j?Z^kob=XDs4ELobO|-65s}QKY|C8;iHHn`anNhWVrDL9DP&t2aQ0%+( z+G{zs7PrE^Ne3Vbl7=WFA~+#Jj7dJYb8vh5r0*4B!dUw+t?@!(-fj0zFJ^_0H~HAP z1p}<^)=%za2Fr!@eywi)nuw|~wObH#*X!7d;pP@xZE)Yu<_99PYSr`G>#EB;9>+t& z0}U+&d+Yhzwq>9W_ybEDEaqDn`mvzrHQxbH$#R|N*)fOy7w2W`U4gX1)GPcQ_;q{v z+_~N_)`k$GCB{R@suxI8%kmJno-Q#Kv2Ni0%rvJfT_LO5Bg^)A&w{d+qI)12a)#!! zx2t8>*~~7#789}mx^+9wEL=t#PG<6@WuX{b4$Y=Tt(Vc3n{Z9n=Vesi#U)ZWA z?|oZo5RYx)=5{~#{YLDZ7tierg{&6nDO0p*#3)&SS)}XTK#ueeE#<_t zf`TS^EXXwCFlneO1RnCKU(zQGaL8SVtucdJkoD31Xzf2o1Ex9c4ak3Tb9-Ajqt9q% ztl%K=+ntDb0wt^%DAtAF+8RyR1yFY%TJe za_+SqQT^L&!F;Y}Qo3XdKjw1HK|Mx|#iP+H0MK9<*4;Hbapm?MsWIK9JYp@>6ZLy}WOD3L@dT->^JGl-qQbVZ;DNJTo|-~dU#940@MO&O zSfq)Xm1!GL^!Qyj@;3@Um-TbkvU>#n?p~8oyu#P%TlY@R$bqR)6LQZYEnpD!LkuSMJuUHp%Y256S9nU&ha-o3`YvQK(iP zy4|)gEMGOMI(Ephk_p_e6RqB^V3z+%{)XTNdTks(>@S>R#*zf2#oUfHTlNo&g#0efv71JL>29;F8cqp}mf%&o=*oTT1rCN8-a#*k+9;Y*!BtGcLoUkGLW9=7{;=I!ha z0?EVotSm@#LP-(A$H~^O>i7a~GTe$Kpnql5r5cGYI~R(SYU<(+nofM%AF-?EPe+J^ zeLWKd=LRA;*`?rYKxdv|7;jGGC6t|g90S4gRbUv^%jfPF%+Vwn9ZCLGh)8Rt-Xfx0 z4bm&C#}qPf5{j@kw^;@wa(vNh%z#`C6u4jEgdghzOWZP@M<{gDDi9X8U~lPAcb>%@ z>%%AE>P&+9R+X;67Xs-I zfJIY|^Y#YuFRdEF+5$#tHgdV8_*-A&mS2Mz_suA-m*#VRPWL^b*q?yDKakAbQZQHI z_1N(^NpVu{TPU&&m@qJu!>h0S=-{sZi_$7pWBt;mmdskFCgd%^{+Pu&wYZgnZ2Fo> zw5^AYdr1paO4N=%qm1yoZfz5bHrS8r>ke!uwajUJGR*<|ui)>m+%65exSESsPub`` zIkZN#t*lh{zG~>5@T@MF;|^EyO-okJ5U@{4a&SjGxz;6Fclf(pV5}7Bh%b~f{Ku8h zSHO@8G<_-5S^unKC}vo=6sLMTrp%2oi7{!&J#?<4qDzkMACJpq3>|M(g7XGCG4SV^6TddWEWL`SXvF_J-)6XdYpV$>$c7i+#cTuXhx@ z!RKE!E2MF*W;_$zpB|aM}>f*t+>kG=WA;eFR zo-YP1+c74bopsy|-UP6{!P=g68BhHT^-IoHh5F6G!_q9VlAnBaLc8`W#6+~^`dqtt z4&BnN;gGfxsbjqY(fSaJ^8V53nrOE27rY_I&__$VLfSQE``yjO(X31KWpg$f**N~I z3r?U1aP;Nk2X5%EW*e^@uy=EBcOVi{XG-&#DCD*5eRTPHR>SVf(v0w3!})ot&oiW8 z(I3YgZ5_w3+M-y`q9Zadf^zu?$Y;ENrcr1N--^&SXyN#Ko80t*@}*$go_B*o4&HR` zuC22pHIR$3BMkCtG|tJUVzkG4$GW94{~_CKzc^vIm9UTWsqQT?J#rr8q^ai}NQ~`M zXBbkSz%9I=?9_n9oIO*ATIqc*6hy1kcE=GnZ|XBnUoxgIa+!62L4T%Rgzn!uE=xs6 z$+)7kpmKC!Qyt>5Vext)ClG9)&GIH>K>t8%WOvM8-CWRA9iRtdC;=OZtph2h=lk$q z#>jhVp$CS29dwJT=)*%rY7TDb>7T85SeT*ctv8^|!)8T`N3-4mG!HBJY*n(#Pa+g` z`sj|Wy0&&WRi4gB80)d#rBnNWs?zz(1JMo>%l?HE-_^N&y?FY>IigoLLH$TbUE=rA zv?Ug-JU6|7uI{LkG%S0#1MNX<&ZR4q?+fdq!w^VDNMG4d7ySxT5N%yP*B+h>XK`z` zt+aCaNK{TaQ0M2JJ2UJ6e5eZ-JhpnnI(2a|H3c7XSyuktHg$@mkRlqNf>;MDu&u** zOuI>!e@=VExC}EuyPv>agH}RyzLC%)>v|j|6oKo7unJx0G5rx+^O`NkKz)+uY+x)D zL&mEu+XmyciDrUuG)xh=DAUK;D{X3S(fx*df(7op{!kDS4F1F zP$R6bcgySWPPbqx+1@xS8@8=bs!aTuVOXfZoOxKs+>38kUH3t?jG$>Yl+n(erED6q zldKNa?pNn7&&~aT@yY_&2)Qsv_6UYxLnTc2H#V-2sX4rQsI!1m_3S!ibpK_b`hHE0 zdu|v1+_Nlm)a^mamlTArGSOlo!$5Biem{4X(ju>4chYj}OE#UcFUDg43tH@8b*mlK z9M5NtJ_&?jV2+CPhUqNe=CB2?q@+Y#9Mi$}rd)`|^b4d3(6$E+0J*4J-L5Vd+433BN1TQ&aBZimQPC93ChZZ`Wv)%)aUSR{4)!t0 zn{xJVngU`M$`3pYP}koLGS<^?e&L0?7-{rfb(jCiDGMW2X=wG!8E|B zeHZ5TsjLl%!CpUHTlW5XGoA6&pwP&2{ae*9C;ipAKW{sAMUyL+cN!T#pAlPt@=+T6I($hYF@nc z)P8QyK9Jbc#^fbYEQib4_icQI6-%``rqIy0;pEWAv!zXXS$8Bog2^ylRFDY+6@`rK zl;}%e2qevw7r?FeG7d1yalBcyPsTL?Tds07{>7vBI30TFx3hKW?8&e1Ag~;}>*qb1 z^rz$l!z)Q1l=8hP*Q1wNEu>YhU^rWx<3n1Wh*(@}>Z*@v}Y9yH^ z^91dea&JTdLa)ukZ^75ycf(^>4o|B=QmRtF!+$T=>uSmeB+?52aDfM`0e2S-no76p zpg}as+##5D>TzhoL@{@e*vUsG>6CWs#;=1>2U^{<+?S; zvRl~rxk--z)dT=CiU0^l0*6 z_VX@=3K0hc`U(;S^D8(fA1%B6KvjO>dtt+%3-}c`5sV@7jkP{~#vpE?WG?q(y>-6UwpJMl%gGrOJ;m`6WT* zW3aGuFE8=>jG~6NM4xEOcDwjC5}0gOmj878_J_xluslHsmGsmTs@(t3{BM8Yd?TPgbB0f^>F+?GmW~>~-tjEqhDJ1x z-T>sTveo*2Nq%UQ#+<(yUB2Ln-mH~br~or4I1XW=<_AWmiVz_djn0txoM66FJ2nPZ zECfduG7jVq$5!0SDfYgyEvFed;js#<6n}ZsmA3|OEMPX^GXNJ8NJywysBdvYt?ctT z+r-o%(f9ZPy|Q|K-!vg4NP#%!KwiHB(#F>`C*WSIHYht#%z+R&f>JROubZaB{nnBX z;y?ETVb&KTu%SWwq98MMg89CIlW6pWqcQ!8F_G}sLqv2~t)b&F5m?u$yrcMIOgD{j zkNe*TsaFt6rHl;YVzY^7Kaz_{RDZHqUtMMwuazK-Af_mgL#ATDR_Ma2@7l*)`M!oY z&2WnK-`>cJAq=X?;K(gw14N?hze@#4phd8{l?X&ekdhEu)KZJm&?yv6n>ql}8HABH zHl;McGOgkKZrI?yj$*$UJe9$U8&H~)scNHOEjO4QXxI}$ICJwStpB7}p`Zd*)K4vi zAWOz2LoJ10wDDsIYZG|@2ZV#4M1nr6_rTsKW|o+Y3xPwP|ElbBl8lTW7Cd1fO~7JC z(mIjY5`l7_k&)5CcgE}ig+D*qR1;$fpQDF$+ClV!0fWhy;5LTf z)^i3F6e?|%UIMnw)G^1D_3BvXR~ zfu!WTwAZf!&PsAhEurUN$Pj^^p-9d6u@ocZFv!OZ%M?ZACMF#FuFclP^z>tbYK}~6 zMa5L%xk~!WTT4j%7=J{3cD@RZp9Id1&A01|16Y(=%i@K{>|M zAtJ(CU@vAaCP*dlSAff9b+pEgk{CFU0!7r^^be;brKG%3wwMGHqr9_y0T}!_2|GJ% zy~M8!B1I;(g7ry3aA2%nAcBCOnTl3HHd{K(+(flN1GQ2o zH4-Y7Z253Z>7Ts6jMF{?+l-W-*dYLWP~yK3Flw>J0cn4woX4)%kqfGH_W~iyKDQ>z zB_fMnLu>LOmqAmKb6Z%gw7WgCCaOb$4yQ$dYaG#a9# z3^$W{jY!pY9U@Wx_#@RH3s-kB-`nCtD|NYiJh_d?rqt--8hdy4Lh_QFMZSpA$}2rv zVTh5s&bo#7eie7vEqAVqjV9wz!WD4pS0VVBHS?8ozv?@q6IDnfnx@I~JiDQN2VTia z*KUKvYTIQvs@#Nr@S{Xg56a|;4&O>6Q7S+gh($&>9zQ&w5zlT<7!K;9#YiOVSZMQ} zrq@((*Kko#Yg;^^0E?!TZ03NQVS)+RFW`V#QL(AY_;8--tg4~x_9s*7U! zP;2S0glGX@x%G2SjQ{Y3-9*eFcn9H44)UH45-ulVVy|<~3xXP9g^7>MN@WE>tDd<} zS0m2fp%~=#?r)4PW*f|B{G9iL?wTb=mXaeq_CG%pbG5~_rOdeYg4;8nhbowO9IYex ztSZo@ept!Y3f8)9j9g3_4cO^PHCITlT0G6hd^5~!9-VV>B*BhUp;)RQRn@k);Z!nV z3v%adEzI|sM11b4b%A>I&1*wIV2fMB9d^ncq8q{EQUF37LygZ}T=6v9Q6vQk212m% zzk10i6G(m}#0bY5i{ucdIPS%Ml_l%1tQo2#V!_UZP>f)V)=>7nEZmD?=|-FwmxR$> zL8w+TW{n9bbIh}Gl@UrbLs`4zeHLxoVIZsz){!-6=0Zr1zv=oS-59|GMuQwwWo z-LO*|h$j zcuG0UcykhFK8&(##0M(DIu(m{hR{m=rF7st8IW0upabWz(up8>D)UYC)WS*cg^_wQ z0b{4_g5Wm~FwJK~$iRtE7)aua4m}P)k=KubB&z{WU?u>*u|#(8%Bs1friRSy z*T$7skqjEeb#U0nW`EV6%)>4jSQ#t^-vXE=LqDN{ep1~9lSTH{nhP$tCh9yupMffL z=A*SE#%D}DJfrMU6`OYbPf2xm_^lZMKN4ZjXQTAHY*GPIJT!Pi!k94gkN%Ks6J*U;h5AQk6y}k7Y4UYX-}#>3cK0TVGv)H3bq}^;pIb* z_`xlDU|i`~_M&F}u_OxRz|)3(vD_}KO7-gy;j+;QEU#kIWYI=lT7piW$)+!vy)cd< zrDIR0C^nE!~U~bWrqnr5=q`EO0O3hiD4s)t0bU26^IZP|HTbj86k(0LV-~Gjq%i0a_ ztZ;VlG}Y&wsEt_-&H_0g(3lm!P;0&d5S<}}qauI0{)|>I9kCsf8uAe}kAWt%EJfbAbpJ5I}G&PgEPNyIBEmhNqSk1v2DN z2x9-}MA>1*t;cn8-nExWneOg>w1sL^nRpsSihRu@f+OyyO?!=(#>xrKMK#45u9Ohv zMja&+QySCx-RcyG-)*c=T#i;K)kj*6`Tl&K!E85(3_% z)4=hb3+?3W<*_rogS*EyMxnb5o~#f{DYR$0Mc1r6QF&q>B^zmZpPi{2eH{$|?gP>eFtHy9Cqn=u@hO_3yF?~q%JJ8QoB3nC`Qs@4sv;85j?@D+p z(%`MOyS1joGf3pqL)7_i-$g3#s`io1Bqof^IWJGpQ=gbvDWbHZCBwfGGNyj-pdWht zlTFTckVZs8L1$xopf#Z%PaweTRke2|-ml7-DSgDD`>UDy|E8pkC_93c>3;G77Z7JbRUKu{pdYl{tZhX zAT1mlb!g@Bf9{LF4UySyb3b854)oCXTvNfIWTi$u4>>S{G^7F8; ztUcj9Xzy>fiTmM@2(Bk|HG7m~R8(EI7U4|Pxgg*&>ek=Z3qKX_fc+Oo zZZrY63N+e|bcxN9om0!DqrJVO{uvNFb62xp80I?9O$IczQPDriCZ5Y4KN3>$hiQ`A zg+=w#>eQmU(W&w@)jmJOy5P_j(-E`1KW@jz-=UCBa{aEEfQwrE5Z816Z`Sw3pWyW> zym`#ROs&6>&W|bfVJ!5dx|W5NRn;@mqTa>rkAKtZhb*^Bo#*NQlc8Sh@cSTyyX(LYxhLfn9w>Gm2SFb_YCDd*1^b!AL$?~D~ z@+EwEs_4bU39Q(0+{7c2V6>p$7KST_|ssHo_)8y{7X{gfIooWT!{_}e6 zch;+hgUJv%{z^$o$}K}+Zv!{a5|Q0tQC9tY5O{heZc71 z`XuRPNFGifZh+;!&Ym>^`ddKNPMMl6AuLSR+XuSJ?)c5USmB8Zui&ZY{@i=l2;}3K zoPRJHbNn;9fIR)n?>4Ca=5qh5Tbu{ng-zf(MMm4Jw0fnwucXJ z7}?4_R(w?q6VsCK_NuV0SiAsfK%*a@c>aGi`mqeu1Teak!}X}$!xaiyQd9B5xv##i z^q6$C+}zA?mF!Z!FtH3>_1Nuw(?oX-F-IEc`>CShT zTgWhR;TB03U0aI|fao|~b$r?XC^PIh>g5?fv~G5+{7;~>hYnKxb`0ZP6{0pE9AO8WxEWqAaIuo0-mGBX=qiquNJ< z6}e=cV<=U2eKZpbqHN3|lGTlIdOd0!F%Jpi%_*eTa@5yV+IjYIpbGG90pOzrHvLUm zb4s@$1cQ0CP>^|f2;Coo%|GPMhE~dU<7iO0UTdg=?JP0%*_)qs`Tq0WO`ZHO&eOjN`%* zpwXu#D0$3jBkrD+sBnm=6)lqfep zO)eBez%I)C7?hx(h!wVo(x0B0nL!`zSMOm?S7{BYG{p)cuhM|OR!h|Fv`A`>-#rU8 zBOoLkPHh;R!U-}1TCg%CR@~*jErXZYJ*o?KyKqM(^tCXV--7O8dbZ_^pm!mR2>I78!8pQ@*)EQGCvFb?Nblf4j#5`SuT1} zh3S&IDJCB;QH`p4X0A>ULEK+^NW8x*>hZ5Xf@^IvQY31{d~;5NWGQ~pZCxl z_k#2$9S_8$WUiv#y-4?t1&%tLe|gQz+<%6oQ^P+3%2S64w`jj{RrNS?b6?s!uj7>P zcw1cj)>{2KYvKel)AXU)65>n>AfyBp{!fZmmU`<06+jZl+>)#3RuC2@^^{S$i-5N^ zA7=0wh|W8erDxaOAY5S}?RvFBDd=wi~ z>gPLIo3RC#G^nQsDS17?ZCSFkQ796ai55KJ89Y0~^aVM0zb&%qRKK7ZxQF~ILF0tD zggV2Eb78e)A{UDwp=av1B}>AEd&Sx^3*7I~&gcMy+WaGfZeg#zM3XWMjcN*~*$1|w zylmRF>HGA_{rV(PCq{C>yy;{}_Mfe~IC}4BEOBMA3tlQFaUc^U1oG4DR3Iv~m>`kc znmku1aX1szm=#(68ul*FW?J>F@2mHf0h-PU%RL7?2~pu#F-3w;eS6q1XY2j6r@ z$E)I*2s0cXjy}#N>g+UISyF}xWM|<$R;xo&ZqdJ&2Tt;Mmt^t}VF?Vn;0qHP( zS7wT*=jk}o%}froSssTQyeCncB* z!<745uP7ZFLju22iT-43(KS3-~yZ?}_LZz(5LNBgx*9-~T_=3Ayp~CU| z<_A1$`L;cKlS(aH$P7zu$tNldbvE2E5+HZH6jrH!Zz$xyWwcKU9dqoV#j|Vjj2T4f zXfaz!V|IbC&v^~aSQ7f8oypBw&7{Ar)3q2J-FPRyZ#Y7p1bCi+cqhi#v6GfSNe{Gg z{neYbB1(HkS;a+CBg@=f#5OOF(HDqL%s#Ihzu(*~KllzPW&>W*R zqNsNByi=-dwEAgGXcQ3DQd5N%GZ7-mwRt%s!RGNCTQM;@lw}Jne71lnr>3U-pi(ic zSeTi!b8|K8tuuDjAweUC+hy6H=RkEgwaB5aih^J=S}rU!K}9`!^o6);Pa~LNDwHD;6`Sk^02oGDeXYy({e^`EKrzs=0z#5-kjJI@ zDquW4J@Gy7GUDQt!|O_w%kMdjjH?VPg2Z;JsK2L>9+x_LU#dPFi1uyV$Fu-3x5Tnj z>+hgrk2(90{#z0JJCgD^hWlkCTw}CTt3k&$!KKc@Kh)z#^V2mPG>9{Y<}KM+%iR;> z^Bz$1vc#M`4?@O2UxvNz>x=vvbX_RM z%#(IOSD77G;+Vidxm;>wFv^dLDJRMFPTyq&9?5g(+X_W@Ee2IR!xM^t4KKIdVoaY&RK(wNE z_BHd6x#yz2!7XT>t=cAYM(EvfgC9&)GIb)4UBjgYg4>V*#%HD#Zl`cR_0nb)W8v@T zxd`<5-$x|3+;P8PZ|ymv7M1rnwSSsDiRJV zRj4|Q!zfZF^_+bHuuDb{d>V*@RCefV=JzGkpmL1N z0!5NqYDoo+735r8I3DLO_v3hS$?6d<9dLFI8F)H?_w$lkUe7hcZEGi%f9VcxGj#=xYO6;ZgYfo*0EuwMwqa zNO2{Z17$f$v*ZP|`>b9#&W7P62r*I@RMJyvVs~o{;Y1wVb0d(GlvkGJ1i6|F5&$No zPYO)sUk)7e(!7g8;0QU2)4lHBpma7V~J7?uix`ueTJ1SQm#PbT-J0=}#85R#TUwsT8``kBNF?MW4RjCB{B76|@B0x4*hz$3Y$wJOV-r{~ zP;3X=Ps^l9)IY73A!VJzu4%1|F|ElXWfRwntfju=bvqKz{gh*()KU*V2rpn9)f z_>vT?igI~pzL|DYi#~Y&o>J4GLAJApvsRsLLQtR8E^eJ_5yi6B7T-xfbetTAwd%zH z<7f?e<>}XBtOX2PGi{bVlX{KneT(3HEKA&5etoEQu->LGOT3R*Zoi6hxz3c6bggIF zS$ELMMxstM=goTb?!pm+OqQ)UkW0jW-(quIn&%f8In$8YUW!t){HOHYB@+vro$V05 zwf9%hPi;$fcz$s5zv>$rka7|e#da#ZJ)qFt71lg_a#P)gJ}#DvV;rK>X~m?wp=xW> zzs_Bh`#?Nv+YbjGtZ_Uv^!4DI6V)b@3&x(%xcbfRo0v|)6x|7ZyEx4!g0ZECrPC}O zQ$}au@}6ReMJ#MudT^VlynX56F5_e)%yRp+nBhhmlWWiy-~JvsqE-mkbjE5Yu#nIo zpO%pz5l#5v8?kR?kL`!(Ot1kINq?nTK!6nE=s@xvT$C&GHJBAwCr{ zzD*`3F`35p4{k2tc1;WPZM;MsA)Cl7q@>!#_gT+9GZH~6N3{RWagHA{xhDUrE*w~L z7~%*0UuUZ1r;2dke;Y8nIpVHAQ_|<4v)jhLBvF|e6Wd-n?TicI~QRUqCBNGSlMf@W^z3IHxTs zVoS?3W=N9bW!?pm-}ptb#wUPWd;A3e^PGAQ#jJ<5a$SBg5(zo4nwuZo=Yrr>N-Uf_ zJpAA+uCY0{Qs;jyjiLQhV1%Xp9f0T*vaMMomXuQZx*UHS=XTOnE&F`A)kQ^++#d4KMTJBvOzO7at5>NqoOgRIbg~8e z>DYQ#C`Zfo@rScj$RQ6tAtY;PPy4V3FpUWUya`$IXoUh9as#ZTpZ+ee3{~E`M=HhB z0`Y-tQu+jZ7^4=twu6Dc1*Tcl2xWC)NkoYw0T30JKVhGr>lY)9gf|wSXY#?`VkTem)YvbSpCoIM zKRUh><{ZZoKj{=Z)q|rhbyFo2SYH_r2QsCod?}f=AynOmTmil7yHhIGl{nn0duZDa<243?R&uf ziA%W7zZmuKUDMZhN~l&>j8FHD?xEhnlRK#`Vp}fHOnE$>{nqoj2*F%mc7^^un_Tcu z`L}LN$-Z8X`nHgM+3Iy^E~uUE)*Y#i6e-6&0^NH8A~jayG9D=$t*_41yI=>i*2_vk}7P9^sht=(HBXjHI^S6amIQllDjQWU7*#jpvt zRWsy03qVgxa{uM6dS26&w7n9_6V~rLGLdvbGpU-Kww+XEYYyx!`gqA}U_&Qmh#L!! z)Cs(8Vt{8DIKwKq50beTeuOg~?rS zGFLin#Pj6oDC==sIKL)AE$K84fB)%-$Z=9HoX4?E>+bw7J|tIl(QE@dxdJ(>_B9I0 zD|#`%+^9?436b+T1LOrEkW$x zR|ohIPErza7AzVtBr5u!akRUj0mPGu$zWy+&Tz*t>bR6qy1M*SVn120P!2$Ar6t^5 zp}bNxyR^*J^@+cI$$V7s($4TKM6N@<;$hON8anfoTR9=jY)qz(6jI9%TdwdobaT1L zl|pz_-8_!bsI zFr66yPt;n8hMO6d-b1Qyd`4U3CD$wsAk5UguOxy|g(aML=C6vU3nK)o4vbFIw24*X z5;YIq`SUP?u_X(r&-=C&HXNT>xO8UEk)|T&(=KLctFv~%nu48_>uujmO{c&etY1dwDB4&8L-ow~Vk@j3^`F$={;SF^gsp1cn5VMLk{@j<7budPKa?NQJrK}hAR$kQ_Qu%)>(6e6^{4ba{wXLZ zi0%$BAGNBXv5#u7a^zA1X{cO)&l}gH zL(VI6Vi-=U`wOqfSXy5_YCTVtOwr@eq6RpRmlyeYg0~PAuc~+X{5qMe$wLa&OU5st zH{=3~X&}#y3L3O10jS`2z02!EHcrmdrbZf%q}ee7-mVgG$46XCG90(*cgb2O4Wlq> zF+tfwm%qlp7u@Lc=THlt@&A&?KAo&o^?v`DD>m^Pwu$#Qh57fh^Y(Uwp}!l_Spiq$ z5o+FAK3Rt1u?4@K0{cHjXOIh8#B$S9S|`bJJS+{0;Ab(=g%}9~rBd1V>rp`#jm4j9 zGgQv#N@dF|=g@le;TOvZyf2FJ6>iV3ZqT1_|JqD2I|vmLD`kGwB@B`yRHS73BNitH z23LrS?-$ulc29kENMxq@PAVEnPgDla&@ba669JCwrci1tw94%Jq(82#6&2Bu`+2~i z;vrfl)tf^JQRM3o_`MAw+{zvfT9qxG0vx)j2l1R}`fw;@>~w`U0!`1lo96$FBp>N?|>-0iog&n ziS2#-m;zAc7%0jI!?9$87RbdZ#)B5NVJDAkb`ogZ$4-eqxr)*cX)s!a+=p#!r_Ipr zn$TDwEWMu}?Ioesk^vka~&<=9&d&L;@x?uQ-K*NRQPEVssevZ{Vtl zslX+D*-W{TaClqn_LCB6hAsIjs=7q{Ute44QMHawQTXV`FRe{vs|rVB3uSols0181AixOD6^YF-EHjbS4U&lXOeJgG_WnwXvJ&1Qaq2FZ;(P8Ez6^!+ z>{+a|Kwau^i04pHoR`{QQ{bar%Dt+^{$O{rzV~P?y4i&TQFT_1E=|pp;#1twVrc>| z-xD~~!{^S1j0}K@I5bdV#JO;w1SU$02tGE>Nt&gFic}I1 z$UYBX2Tqd0l~K%30uzymS(Ueq+2Pcy0x-WhH!vJqbn^cLugWiy-gAMgj4TzdDLZBp zZ&35v3icr5&`;57PSsuY3rgY=s{FJ#Wa-Q!BWi1FrFrkOo132wri;MLmP_^flX-lP zM^&1dnx&T5@Cpm&s^*en7_DLfeWmK7FJ*X5m_qgRD3uSpY(f3Eee-ap5wGkRwSQFy zYJG~bml_n71=YQ3+&KT>CTxUsx}rwm>1k&J#DZ^aa@0sb4SjrlSDTHB$c&ow*YD=$ z=2Wkj``t9Jm1%@`+QwD0lmH|7d5^S?(;CXP;=x1JWt4hx>%j2m@TWI2$-ACj;XTXg zmMZ77B73dh&IsSqveOX6!G=|s?|x*Pi{Cvo|JhplJ!81{jqcYQM*S@g{u0|YuV&Z{ zb4T(jpR2^8s~Kv@wUh_Jh7fcJfgW(68&SLBdUvqj=y}h>s5hB#@j@?TxYIkSgu!vb zcUG$m)S79r7&;#f^`eT@8P=+6m#?p}P7ahnpn9lQ*G9xuqA~G*Ncv+W|0~S2cTk7& z0s2Fzvot$s^|j!JZ1A65n>*5UYXTOI|3aSaSHL{~EKLN^ z{N6>H*V0BGtuVKC`m&5xB0uS*CnjY!2vB>>+4LrT#%TmHQ8U1rK)~XjBPltsTj1jI z5OTJYAM=h)xW)Xy|HcU?!(XZ95`)s}c^N8Y;|I(6h$l1+Rdol_? zkoItKa$@5oNxoO#`$izZ(`#+^_l^(*+LJP(%g>XH{RcDzfo52kS+&~6$HrY&rxEsB zfG0S|;&neFLOQb)gifql()(vmz#BgC4ZOwHJ8KnER-``epYh??mqG9!*aG-PJLdL_ zQCS-Ip>bq7)H-KS>vXtn4h*)xp32Cy8%m$S0 zL7?@z5XRx8uguew6+5}0(fEfW&mFay=egLIr`@jo`1Xm|}xgDpcoVEJ+U z;Bm;e)ps9K&?m4MUk zy;B+5Z>EGm<&X$}sLVOZ1Vm3`k&4cjGBEToKP&V3-tXYI!BIY{6xxi<4Xm?!!7G|a z)LezEP|pEQyGdTgm#EK~J4M*A9%4=~l8HO&*)2~h?GS_NZB~S70QCczXkUz}W-3Ml zeKeqA{o8+p3VI-3NgoP`XpM7_9*-+Ce&5SyQax>C`t(#F6uv>TOX2o$cg%%O0^8)OA?KuWGCXJd$GpLLNPGm^ua1b5f=;m(L*ZrHQqA(F0JV{6 zws7K&L!+#b;zz>UJq%v)G)!TzpXj$?jPM<;Vz?@sUM#1BPYf0Dxj~s(eigFjenokR ziVKs{G?GMr4?no@5(&#iU6)8u`w6jXP5&8{kE2UPi03UE9bNx-Kgg% zEn^5K{@iD!?y&{5aH+-L7PtkEfsuAV9jw`PB7Tjv6Y}_Wu;fcdRxyU)J85p((x%QT z_p-8ZqKpuj&3N{azH%9x%k9Qe8m6VGCGH6)pA5lP-nu09VvFkpPG1G!hC5p5qh}mW zE4vh{!C@(+|B?DnUT>>xiOZg>`?#L-%Q!|NIz$hi;RUreK)%AGRnp76llJ&(BdJ!% z!Xvv!hg_9Oy}UnO)C9xnYD^YJ>dCa?U$d{xYZZ0mTXKbI#x%fFfGP)Wh?<$n4oePy zUK0n?7+ukxM zl-WpUo0QA#Sz0Yv*FBU`cKD-hf%)IzMx8?#B+_c-Qaohfw?^ecZei1W)IGVF6+R@T zw=)gdZMc&NPEMzw;WSdQ_CX+IR~~G*j4Qam&~#i9(I~B%rQyg4BI|ajoicNu`n4=* zf1gRJJ;D8;Ni_!_g{ZH`yyPMzD9LTbRT-u#^w%#zY^gwQdzaMbV%OBvB-4f{FhDIa z(Ot-IzPaXpL)FziReDf%xw!#(8LjVM@{=`1YWh$g3~FCFZNH*L$~1`*6JARk&)MWb!pC#rd9}&W4f+Wz6rwxfr+nrR95icFINHNkqAm**h@A z!9?Yz&~ZAsOhlmu&}wmuOL#wA+uYSLs*S|dNCc;W!C42TQ#=f`Kj$ES{^M0Zpa-

DZ620O-C7jJyqBFDZ8zdtx)7%LS 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 literal 0 HcmV?d00001 diff --git a/locales.json b/locales.json index e47e02a..cc76f87 100644 --- a/locales.json +++ b/locales.json @@ -108,10 +108,8 @@ "tab_stats": "Stats", "tab_summary": "Summary", "panel_recent": "Recent", - "panel_presets": "Presets (v1.4)", - "panel_history": "History (v1.4)", - "panel_hint_presets": "Presets arrive in v1.4", - "panel_hint_history": "Run history arrives in v1.4", + "panel_presets": "Presets", + "panel_history": "History", "btn_settings": "Settings", "settings_title": "Settings", "settings_paths": "Executables", @@ -303,10 +301,8 @@ "tab_stats": "Статистика", "tab_summary": "Сводка", "panel_recent": "Недавние", - "panel_presets": "Пресеты (v1.4)", - "panel_history": "История (v1.4)", - "panel_hint_presets": "Пресеты появятся в v1.4", - "panel_hint_history": "История запусков появится в v1.4", + "panel_presets": "Пресеты", + "panel_history": "История", "btn_settings": "Настройки", "settings_title": "Настройки", "settings_paths": "Исполняемые файлы", @@ -329,7 +325,7 @@ "tree_tool_label": "Инструмент:", "tree_layout": "Раскладка:", "tree_layout_rect": "Прямоугольная", - "tree_layout_slant": "Сланцевая", + "tree_layout_slant": "Наклонная", "tree_layout_circ": "Круговая", "tree_supports": "Поддержки", "tree_threshold": "порог: {}%", diff --git a/packaging/release_meta.py b/packaging/release_meta.py index 320e97b..b4a942d 100644 --- a/packaging/release_meta.py +++ b/packaging/release_meta.py @@ -21,19 +21,38 @@ _package = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(_package) -NOTES = """phymlGUI {version} - -Downloads: -- `phymlGUI-{version}-windows-x64.zip` - unpack and start `phymlgui.exe` - (command line: `phymlgui-cli.exe`). PhyML needs Microsoft MPI - (also for serial runs: the bundled PhyML is an MPI build). -- `phymlGUI-{version}-x86_64.AppImage` - `chmod +x` and run; without FUSE use - `--appimage-extract-and-run`. MPI mode needs OpenMPI (`sudo apt install openmpi-bin`). -- `SHA256SUMS` - checksums of the files above. -- `raxml-ng-2.0.3-source+patch.tar.gz` - RAxML-NG sources and the patch used for the - Windows build (AGPL-3.0). - -Bundled programs: +NOTES_DIR = os.path.join(ROOT, 'packaging', 'release_notes') +TOOL_NAMES = {'phyml': 'PhyML', 'iqtree': 'IQ-TREE', 'muscle': 'MUSCLE', 'raxml': 'RAxML-NG'} + +DOWNLOAD_EN = """### Download and requirements + +- **Windows 10/11, 64-bit:** `phymlGUI-{version}-windows-x64.zip`. Unpack the whole archive and run `phymlgui.exe` (`phymlgui-cli.exe` for the command line). PhyML needs [Microsoft MPI](https://github.com/microsoft/Microsoft-MPI/releases) (`msmpisetup.exe`), also for serial runs: the bundled PhyML is an MPI build. +- **Linux x86_64:** `phymlGUI-{version}-x86_64.AppImage`. Run `chmod +x` and start it; without FUSE add `--appimage-extract-and-run`. Needs glibc 2.35 or newer (Ubuntu 22.04+). MPI mode needs OpenMPI: `sudo apt install openmpi-bin`. +- `SHA256SUMS`: checksums of the files, `sha256sum -c SHA256SUMS`. +- `raxml-ng-2.0.3-source+patch.tar.gz`: RAxML-NG sources and the patch of the Windows build (AGPL-3.0). + +Python is not required. + +### Bundled programs + +| Program | Windows | Linux | +| --- | --- | --- | +{tools} +""" + +DOWNLOAD_RU = """### Скачать и требования + +- **Windows 10/11, 64 бит:** `phymlGUI-{version}-windows-x64.zip`. Распакуйте архив целиком и запустите `phymlgui.exe` (`phymlgui-cli.exe` — для командной строки). PhyML требует [Microsoft MPI](https://github.com/microsoft/Microsoft-MPI/releases) (`msmpisetup.exe`), в том числе для последовательного режима: встроенный PhyML собран с MPI. +- **Linux x86_64:** `phymlGUI-{version}-x86_64.AppImage`. Выполните `chmod +x` и запустите; без FUSE добавьте `--appimage-extract-and-run`. Нужен glibc 2.35 или новее (Ubuntu 22.04+). Для MPI-режима нужен OpenMPI: `sudo apt install openmpi-bin`. +- `SHA256SUMS` — контрольные суммы файлов, `sha256sum -c SHA256SUMS`. +- `raxml-ng-2.0.3-source+patch.tar.gz` — исходники RAxML-NG и патч сборки для Windows (AGPL-3.0). + +Python не нужен. + +### Программы в комплекте + +| Программа | Windows | Linux | +| --- | --- | --- | {tools} """ @@ -54,12 +73,27 @@ def write_sha256sums(files, out): f.write(f'{digest} {os.path.basename(path)}\n') -def release_notes(version, manifest): - lines = [] - for section, label in (('windows', 'Windows'), ('linux', 'Linux')): - for name, spec in manifest[section].items(): - lines.append(f'- {label}: {name} {spec["version"]}') - return NOTES.format(version=version, tools='\n'.join(lines)) +def _highlights(version, suffix, notes_dir): + """packaging/release_notes/; a pre-release uses its release's file.""" + path = os.path.join(notes_dir, version.split('-')[0] + suffix) + if not os.path.isfile(path): + return '' + with open(path, encoding='utf-8') as f: + return f.read().strip() + '\n\n' + + +def release_notes(version, manifest, notes_dir=NOTES_DIR): + """English, then Russian: the version's highlights, downloads and bundled programs.""" + rows = [] + for name, label in TOOL_NAMES.items(): + # '2.0.3 (native build, ...)' -> '2.0.3': the build notes are in the text above + cells = [manifest[section].get(name, {}).get('version', '—').split(' (')[0] + for section in ('windows', 'linux')] + rows.append(f'| {label} | {cells[0]} | {cells[1]} |') + tools = '\n'.join(rows) + english = _highlights(version, '.md', notes_dir) + DOWNLOAD_EN.format(version=version, tools=tools) + russian = _highlights(version, '.ru.md', notes_dir) + DOWNLOAD_RU.format(version=version, tools=tools) + return f'# phymlGUI {version}\n\n{english}\n---\n\n{russian}' def raxml_source_bundle(source_zip, patch, out): diff --git a/packaging/release_notes/2.0.0.md b/packaging/release_notes/2.0.0.md new file mode 100644 index 0000000..c5f5466 --- /dev/null +++ b/packaging/release_notes/2.0.0.md @@ -0,0 +1,38 @@ +### Overview + +phymlGUI 2.0.0 brings a new window, IQ-TREE as a second engine, an interactive tree viewer and ready-to-run packages for Windows and Linux with all analysis programs included. The program aligns FASTA files with MUSCLE and builds maximum-likelihood trees with PhyML (serial or MPI) or IQ-TREE (ModelFinder, ultrafast bootstrap), for single files or whole folders. + +### New window + +- Two panes: the parameters, recent files, presets and run history on the left; the tree, log, statistics, summary and batch queue on the right. +- Light and dark themes following the system, with an accent colour. +- Every setting is checked before a run, and all problems are listed at once. +- A live CPU monitor for the system and for the analysis process tree; Cancel stops the whole process tree, MPI ranks included. + +### Tree viewer + +- Rectangular, slanted and circular layouts with a distance grid and a scale. +- Support values with threshold highlighting, clade collapsing and rerooting on an outgroup. +- Majority-rule consensus from bootstrap trees and Robinson–Foulds comparison of two trees. +- Export to PNG, SVG and PDF. + +### Engines and runs + +- IQ-TREE 2.4.0: ModelFinder chooses the model (`MFP`); ultrafast bootstrap with the 1000-replicate minimum enforced; the chosen model and the statistics are shown in the window. +- Batch mode with a live per-file queue, retry of the failed files and an Excel summary next to the CSV one. +- Run history (a double click reopens a tree) and parameter presets. +- Command line without the window: `phymlgui-cli.exe` on Windows, the AppImage itself on Linux (`--file`, `--batch`, `--config`, `--version`). + +### Packages + +- Windows zip and Linux AppImage, each with PhyML, IQ-TREE, MUSCLE and RAxML-NG; Python is not required. +- RAxML-NG 2.0.3 is now built natively for Windows from the official sources; its results match the official Linux build. It is included for the command line; an engine in the window is planned. +- Every package is tested before release: alignment and a tree with PhyML and IQ-TREE, an MPI run on Linux, the window opening, and the AppImage on a clean Ubuntu 22.04. + +### Upgrading from 1.2 + +- The Windows archive is now `phymlGUI--windows-x64.zip`; unpack it into a new folder. +- To keep your settings and run history, copy `phyml_config.json` and `phyml_history.json` from the 1.2 folder next to the new `phymlgui.exe`. Settings and history are kept next to the program when that folder is writable, otherwise in `%APPDATA%\phymlGUI` (Windows) or `~/.config/phymlGUI` (Linux). +- The bundled PhyML for Windows is an MPI build: install Microsoft MPI also for serial runs. + +The full list of changes is in [CHANGELOG.md](https://github.com/adrobi/phymlGUI/blob/master/CHANGELOG.md). diff --git a/packaging/release_notes/2.0.0.ru.md b/packaging/release_notes/2.0.0.ru.md new file mode 100644 index 0000000..c0389da --- /dev/null +++ b/packaging/release_notes/2.0.0.ru.md @@ -0,0 +1,38 @@ +### Обзор + +В phymlGUI 2.0.0 — новое окно, IQ-TREE как второй движок, интерактивный просмотрщик деревьев и готовые пакеты для Windows и Linux со всеми программами анализа внутри. Программа выравнивает FASTA-файлы MUSCLE и строит деревья максимального правдоподобия в PhyML (последовательно или через MPI) или IQ-TREE (ModelFinder, ультрабыстрый бутстреп) — для отдельных файлов или целых папок. + +### Новое окно + +- Две панели: слева параметры, недавние файлы, пресеты и история запусков; справа дерево, журнал, статистика, сводка и очередь пакетного режима. +- Светлая и тёмная темы, следующие за системой, с выбором акцентного цвета. +- Все настройки проверяются до запуска, и все ошибки показываются сразу списком. +- Монитор загрузки CPU для системы и для дерева процессов анализа; «Прервать» останавливает всё дерево процессов, включая ранги MPI. + +### Просмотрщик деревьев + +- Прямоугольная, наклонная и круговая раскладки с сеткой расстояний и шкалой. +- Значения поддержек с подсветкой по порогу, сворачивание клад и укоренение по outgroup. +- Консенсус большинства из бутстреп-деревьев и сравнение двух деревьев по Робинсону–Фаулдсу. +- Экспорт в PNG, SVG и PDF. + +### Движки и запуски + +- IQ-TREE 2.4.0: ModelFinder подбирает модель (`MFP`); ультрабыстрый бутстреп с минимумом в 1000 реплик; выбранная модель и статистика показываются в окне. +- Пакетный режим с живой очередью по файлам, повтором неудавшихся и сводкой в Excel рядом с CSV. +- История запусков (двойной клик открывает дерево) и пресеты параметров. +- Командная строка без окна: `phymlgui-cli.exe` под Windows, сам AppImage под Linux (`--file`, `--batch`, `--config`, `--version`). + +### Пакеты + +- Zip для Windows и AppImage для Linux, в каждом PhyML, IQ-TREE, MUSCLE и RAxML-NG; Python не нужен. +- RAxML-NG 2.0.3 теперь собирается под Windows нативно из официальных исходников; результаты совпадают с официальной сборкой для Linux. Он входит в комплект для командной строки; движок в окне запланирован. +- Каждый пакет проверяется перед выпуском: выравнивание и дерево в PhyML и IQ-TREE, MPI-запуск под Linux, открытие окна и AppImage на чистой Ubuntu 22.04. + +### Переход с 1.2 + +- Архив для Windows теперь называется `phymlGUI-<версия>-windows-x64.zip`; распакуйте его в новую папку. +- Чтобы сохранить настройки и историю запусков, скопируйте `phyml_config.json` и `phyml_history.json` из папки 1.2 рядом с новым `phymlgui.exe`. Настройки и история хранятся рядом с программой, если эта папка доступна для записи, иначе в `%APPDATA%\phymlGUI` (Windows) или `~/.config/phymlGUI` (Linux). +- Встроенный PhyML для Windows собран с MPI: Microsoft MPI нужен и для последовательного режима. + +Полный список изменений — в [CHANGELOG.md](https://github.com/adrobi/phymlGUI/blob/master/CHANGELOG.md) (на английском). diff --git a/phyml_core/__init__.py b/phyml_core/__init__.py index f9d5722..864bab4 100644 --- a/phyml_core/__init__.py +++ b/phyml_core/__init__.py @@ -1,3 +1,3 @@ """phymlGUI core: settings, runner, engines, i18n and helpers (no GUI code here).""" -__version__ = "1.2" +__version__ = "2.0.0" diff --git a/scripts/make_screenshots.py b/scripts/make_screenshots.py new file mode 100644 index 0000000..adafef3 --- /dev/null +++ b/scripts/make_screenshots.py @@ -0,0 +1,127 @@ +"""Screenshots for the README: real runs of the bundled tools in a throwaway data folder. + + python scripts/make_screenshots.py --fasta testrun/cytb_mammals.fasta --out docs/screenshots + +The inputs are copied to testrun/screenshots (the path shows in the window). +Writes, for English and Russian (suffix _ru): main.png (PhyML with MPI bootstrap, +light theme), dark.png (the same tree, slanted layout, dark theme) and iqtree.png +(IQ-TREE with ModelFinder, statistics tab), all rooted on --outgroup. The user's settings and +history are never touched: PHYMLGUI_DATA_DIR points to a temporary folder. +Tools come from --bin (default: build-bin, then bin). +""" +import argparse +import json +import os +import shutil +import subprocess +import sys +import tempfile +import time + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +WINDOW_SIZE = (1500, 920) + + +def _tool(bins, name): + for folder in bins: + path = os.path.join(ROOT, folder, name) + if os.path.isfile(path): + return path + sys.exit(f'{name} not found in {bins}') + + +def _config(bins, theme, engine): + mpiexec = shutil.which('mpiexec') or r'C:\Program Files\Microsoft MPI\Bin\mpiexec.exe' + return { + 'engine': engine, + 'phyml_path': _tool(bins, 'phyml-mpi.exe'), + 'iqtree_path': _tool(bins, 'iqtree2.exe'), + 'muscle_path': _tool(bins, 'muscle.exe'), + 'mpirun_path': mpiexec, + 'use_mpi': engine == 'phyml', + 'mpi_np': '4', + 'support_method': 'bootstrap', + 'bootstrap_replicates': '100', + 'model': 'HKY85' if engine == 'phyml' else 'MFP', + 'theme': theme, + 'accent': 'green', + } + + +def shoot(lang, theme, engine, fasta, bins, out, name, layout='rect', tab=0, outgroup=None): + """One screenshot in a fresh process: the language is fixed at import time.""" + with tempfile.TemporaryDirectory(prefix='phymlgui_shots_') as tmp: + data = os.path.join(tmp, 'data') + os.makedirs(data) + # the input path shows in the window and the log: keep the user's home out of it + work = os.path.join(ROOT, 'testrun', 'screenshots') + shutil.rmtree(work, ignore_errors=True) + os.makedirs(work) + with open(os.path.join(data, 'phyml_config.json'), 'w', encoding='utf-8') as f: + json.dump(_config(bins, theme, engine), f) + target = os.path.join(work, os.path.basename(fasta)) + shutil.copy(fasta, target) + job = dict(lang=lang, fasta=target, png=os.path.join(out, name), layout=layout, tab=tab, + outgroup=outgroup) + env = dict(os.environ, PHYMLGUI_DATA_DIR=data, PHYMLGUI_SHOT=json.dumps(job)) + subprocess.run([sys.executable, os.path.abspath(__file__), '--child'], env=env, check=True) + + +def child(): + job = json.loads(os.environ['PHYMLGUI_SHOT']) + sys.path.insert(0, ROOT) + from phyml_core import i18n + i18n.LANG = job['lang'] + from PySide6.QtWidgets import QApplication + from phyml_ui.main_window import PhyMLApp + app = QApplication(sys.argv) + window = PhyMLApp() + window.resize(*WINDOW_SIZE) + window.move(-WINDOW_SIZE[0] - 200, 0) # off-screen: nothing flashes on the desktop + window.show() + window.fasta_path_input.setText(job['fasta']) + window.btn_run.click() + deadline = time.time() + 600 + while not window.btn_run.isEnabled(): + app.processEvents() + time.sleep(0.05) + if time.time() > deadline: + sys.exit('the run did not finish') + combo = window.tree_view.layout_combo + combo.setCurrentIndex(combo.findData(job['layout'])) + if job['outgroup']: + combo = window.tree_view.outgroup_combo + combo.setCurrentIndex(combo.findData(job['outgroup'])) + window.result_tabs.setCurrentIndex(job['tab']) + for _ in range(40): + app.processEvents() + time.sleep(0.025) + window.grab().save(job['png']) + print('wrote', job['png']) + window.close() + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--fasta', default=os.path.join(ROOT, 'testrun', 'cytb_mammals.fasta')) + parser.add_argument('--out', default=os.path.join(ROOT, 'docs', 'screenshots')) + parser.add_argument('--bin', action='append', help='folder with the tools (repeatable)') + parser.add_argument('--outgroup', default='Mus_musculus', help='taxon to root the trees on') + parser.add_argument('--child', action='store_true', help=argparse.SUPPRESS) + args = parser.parse_args(argv) + if args.child: + child() + return 0 + bins = args.bin or ['build-bin', 'bin'] + os.makedirs(args.out, exist_ok=True) + fasta = os.path.abspath(args.fasta) + for lang, suffix in (('en', ''), ('ru', '_ru')): + common = dict(fasta=fasta, bins=bins, out=args.out, outgroup=args.outgroup) + shoot(lang, 'light', 'phyml', name=f'main{suffix}.png', **common) + shoot(lang, 'dark', 'phyml', name=f'dark{suffix}.png', layout='slanted', **common) + shoot(lang, 'light', 'iqtree', name=f'iqtree{suffix}.png', tab=1, **common) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tests/unit/test_release_meta.py b/tests/unit/test_release_meta.py index 2e5af25..167770a 100644 --- a/tests/unit/test_release_meta.py +++ b/tests/unit/test_release_meta.py @@ -44,7 +44,7 @@ def test_release_notes_lists_tools(): assert 'phymlGUI 2.0.0' in notes for section in ('windows', 'linux'): for name, spec in manifest[section].items(): - assert spec['version'] in notes, (section, name) + assert f" {spec['version'].split(' (')[0]} |" in notes, (section, name) assert 'Microsoft MPI' in notes and 'OpenMPI' in notes and 'SHA256SUMS' in notes @@ -59,3 +59,24 @@ def test_raxml_source_bundle(tmp_path): with tarfile.open(out) as t: assert sorted(t.getnames()) == ['raxml-ng-2.0.3-source+patch/raxml-ng-2.0.3-windows.patch', 'raxml-ng-2.0.3-source+patch/raxml-ng_v2.0.3_source.zip'] + + +def test_release_notes_are_bilingual(): + manifest = json.loads((ROOT / 'packaging' / 'third_party.json').read_text('utf-8')) + notes = meta.release_notes('2.0.0', manifest) + for text in ('Download', 'Скачать', 'Microsoft MPI', 'OpenMPI', 'SHA256SUMS'): + assert text in notes, text + assert notes.index('Download') < notes.index('Скачать') + + +def test_release_notes_hold_the_version_highlights_in_both_languages(tmp_path): + manifest = json.loads((ROOT / 'packaging' / 'third_party.json').read_text('utf-8')) + (tmp_path / '2.0.0.md').write_text('## Highlights\n\nNew window.\n', 'utf-8') + (tmp_path / '2.0.0.ru.md').write_text('## Главное\n\nНовое окно.\n', 'utf-8') + for version in ('2.0.0', '2.0.0-rc1'): # a release candidate uses the notes of its release + notes = meta.release_notes(version, manifest, notes_dir=str(tmp_path)) + assert notes.startswith(f'# phymlGUI {version}\n\n## Highlights\n\nNew window.\n'), version + order = [notes.index(t) for t in ('Highlights', 'Download', 'Главное', 'Скачать')] + assert order == sorted(order), version + plain = meta.release_notes('2.1.0', manifest, notes_dir=str(tmp_path)) + assert 'Highlights' not in plain and 'Главное' not in plain and 'Скачать' in plain From bfcb8ae74529779abdb63dd42d0b4f5ff9bae231 Mon Sep 17 00:00:00 2001 From: Aleksey Drobin <43707931+adrobi@users.noreply.github.com> Date: Sat, 31 Oct 2026 14:08:49 +0300 Subject: [PATCH 25/25] Build Linux PhyML for x86-64-v2 instead of -march=native PhyML's configure.ac compiles with -march=native, so the binary built on one CI runner died with SIGILL (illegal instruction) on another, and the AppImage would do the same on CPUs older than the build runner. x86-64-v2 keeps the SSE likelihood code; the script fails if -march=native is left in a Makefile. Co-Authored-By: Claude Opus 5.5 --- packaging/build_phyml_linux.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packaging/build_phyml_linux.sh b/packaging/build_phyml_linux.sh index ab4fbcd..1e69594 100644 --- a/packaging/build_phyml_linux.sh +++ b/packaging/build_phyml_linux.sh @@ -12,19 +12,32 @@ trap 'rm -rf "$work"' EXIT tar -xzf "$src_archive" -C "$work" cd "$work"/phyml-* +# configure.ac compiles with -march=native: a binary built on the CI runner dies with +# SIGILL on an older CPU. x86-64-v2 (SSE4.2, every x86-64 CPU since about 2009) keeps +# PhyML's SSE likelihood code; --disable-native would drop vectorisation altogether. +sed -i 's/-march=native/-march=x86-64-v2/; s/-mcpu=native/-march=x86-64-v2/' configure.ac + # the release tarball ships a stale configured tree: regenerate from scratch make distclean >/dev/null 2>&1 || true sh ./autogen.sh -# no --enable-native: the binaries must run on any x86-64 CPU. +no_native() { + if grep -rq -e '-march=native' -e '-mcpu=native' --include=Makefile .; then + echo 'build_phyml_linux.sh: -march=native is still in the Makefiles' >&2 + exit 1 + fi +} + # Single-threaded make: parallel builds crashed GCC (internal compiler error # in evolve.c) on Ubuntu 26.04; -j1 is reliable everywhere. ./configure --enable-phyml +no_native make -j1 install -m 755 src/phyml "$dest/phyml" make distclean >/dev/null ./configure --enable-phyml-mpi +no_native make -j1 install -m 755 src/phyml-mpi "$dest/phyml-mpi"