GPL-FAQ по релизу исходного кода

Подробный обзор требований GPL по раскрытию исходного кода от основателя gpl-violations.org.

🖊️
это перевод текста "gpl-violations.org Source Code Release FAQ" авторства Харальда Вельте, основателя gpl-violations.org

Этот FAQ содержит более подробную информацию о требованиях и наилучшей текущей практике предоставления соответствующего исходного кода для исполняемого кода, лицензированного по лицензии GPL. Он был составлен в результате многочисленных недостатков и ошибок, допущенных при более чем шестидесяти успешных применениях GPL.

Поэтому, прежде чем сделать релиз исходного кода в соответствии с требованиями GPL, мы рекомендуем ознакомиться с этим FAQ, чтобы убедиться в полноте и взаимном удовлетворении тем, что вы на самом деле публикуете.

Какой исходный код я должен опубликовать под лицензией GNU GPL?

GNU GPL требует, чтобы, как только вы распространяете лицензионное программное обеспечение под GPL в исполняемом формате, вы предоставляли "полный соответствующий исходный код". GNU GPL также содержит определение этого термина:

Исходный код произведения означает предпочтительную форму произведения для внесения в него изменений. Для исполняемого произведения полный исходный код означает весь исходный код для всех содержащихся в нем модулей, а также все связанные файлы определений интерфейса и скрипты, используемые для управления компиляцией и установкой исполняемого файла.

Это довольно точное определение. Для типичной программы на C это означает весь исходный код (файлы .c) плюс заголовочные файлы (файлы .h) плюс скрипты, используемые для управления компиляцией и установкой.

Всегда имейте в виду, что цель GPL – дать возможность пользователям реализовать свои свободы. В частности, свободу создавать модифицированные версии программы и запускать такие модифицированные версии программы.

Что такое "скрипты, используемые для управления компиляцией"?

Как правило, любая сложная программа разбита на множество различных файлов с исходным кодом. В процессе компиляции каждый из них компилируется в исполняемый код, после чего они связываются между собой. Этот процесс компиляции и линкования отдельных файлов исходного кода, как правило, контролируется скриптами. Чаще всего используется программа "make", скрипты которой обычно называются "Makefiles".

Кроме того, некоторые программы, такие как ядро Linux, как правило, имеют конфигурацию во время компиляции (в случае ядра Linux – файл .config). Поскольку эта конфигурация во время компиляции, несомненно, управляет процессом компиляции, вам также необходимо включить любые такие файлы конфигурации во время компиляции.

Что такое "скрипты, используемые для управления установкой"?

После перевода программного обеспечения из исходного кода в исполняемую форму программа довольно часто нуждается в установке в систему. Процесс установки часто автоматизирован с помощью установочных скриптов. Именно на эти скрипты ссылается лицензия GPL.

Пожалуйста, обратите внимание, что это имеет особое практическое значение в случае встроенных устройств, поскольку исполняемая программа(ы) должна быть каким-то образом установлена на устройство. Если пользователю не предоставляется возможность установить свои собственные (модифицированные) версии программы, у него нет возможности воспользоваться своей свободой в запуске модифицированных версий программы.

Иногда процессу установки способствуют не скрипты, а какие-то другие средства (например, исполняемые программы). В тексте GPL упоминается только слово "скрипты". Но при чтении и интерпретации лицензии становится ясно, что лицензия конкретно означает не только "скрипты", но и любые виды программного обеспечения, которые необходимы для установки (модифицированной) версии скомпилированной программы.

А как насчёт компилятора, цепочки инструментов?

В GPL явно указано:

Однако, в качестве особого исключения, распространяемый исходный код не обязательно должен включать в себя что-либо, что обычно распространяется (в исходном или двоичном виде) вместе с основными компонентами (компилятором, ядром и т.д.) операционной системы, в которой выполняется исполняемый файл, если только этот компонент сам не сопровождает исполняемый файл.

Очевидно, что этот пункт написан для пользовательских программ, работающих в существующих операционных системах общего назначения. Таким образом, если вы распространяете только такие программы, то вам не нужно включать компилятор, ядро, компоновщик и так далее.

В частности, в случае кросс-компиляции для встраиваемых платформ, кросс-компилятор для конкретного оборудования весьма вероятно, не то же самое, что "нормально распространяемая с ... операционная система".

Поэтому в таких случаях вы должны предоставить точную версию вашего набора инструментов компилятора, который использовался для создания исполняемых файлов, которые вы распространили. Пожалуйста, обратите внимание, что в большинстве случаев это будет GNU GCC, который сам по себе имеет лицензию GPL, поэтому обязательства по GPL, в свою очередь, будут распространяться на набор инструментов, и вы также должны опубликовать полный соответствующий исходный код для него.

Какую версию исходного кода я должен опубликовать?

Для каждой версии исполняемой программы вы должны выпустить точно соответствующую версию всего соответствующего исходного кода.

Итак, если вы распространили десять различных версий прошивки для встроенного продукта, и эта прошивка содержит программное обеспечение, лицензированное по лицензии GPL, то вам необходимо выпустить десять различных пакетов исходного кода, каждый из которых соответствует каждой исполняемой версии.

Пожалуйста, обратите внимание, что если вы выбрали опцию GPL 3b (а не 3a), то обязательство действует только в течение трёх лет. Это означает, что вам не нужно предоставлять исходный код для любого исполняемого кода, который в последний раз распространялся более трёх лет назад.

Пожалуйста, также имейте в виду, что распространением считается как распространение на физическом носителе, так и распространение через сети передачи данных, такие как Интернет.

Как я могу убедиться, что мой релиз исходного кода полный?

Это довольно просто. Если вы используете только исходный код, предоставленный в этом выпуске, и вы можете использовать этот исходный код для создания рабочей формы исполняемого кода, то релиз исходного кода видится полным.

Если процесс сборки завершается сбоем, или вы получаете нерабочий исполняемый файл, или у вас нет возможности установить полученный исполняемый файл, то явно чего-то не хватает.