Есть в программировании техника, называемая условной компиляцией. Это означает, что какие-то куски кода включаются или не включаются в результирующую программу в зависимости от конфигурации. Особенно распространена эта практика в языках C и C++.
Одно из применений условной компиляции это обход косяков операционной системы, на которой эта программа будет работать.
Но есть и другое применение -- опциональный функционал и опциональные зависимости. Это есть зло! Распростанённое, от того лишь более ужасное зло.
Дело в том, что на практике пользователь не имеет возможности выбирать эти опциональные зависимости и возможности. Если в программе есть опциональная зависимость от libshit, будьте уверены, она будет включена в Debian и Fedora. В Alpine она скорее всего будет выключена, но реальный выбор будет лишь у пользователей Gentoo и, быть может, Nix.
Мораль, разумеется не в том, что Gentoo лучше всех, а в том, что архитектуру приложения нужно делать с умом.
Опциональные возможности должны реализовываться вызовом дочерних процессов или, на худой конец, системой плагинов (dlopen), но никак не условной компиляцией, которая оборачивается монстрами Франкенштейна.
Поучительный пример. Есть просмотрщик документов zathura, поддержка формата DeJaVu в котором реализована в виде плагина, а есть видеопроигрыватель vlc, в котором 150 (!) флагов условной компиляции, т.е количество возможных конфигураций превосходит количество всех, когда либо живущих людей на Земле.
Post #165
589