Это перевод страницы, написанной на английском языке.

Исключение для библиотек времени исполнения GCC: пояснение и ответы на вопросы

Введение

27 июня 2007 года Фонд свободного программного обеспечения выпустил GPLv3. Она была немедленно принята в пятнадцати проектах GNU, а в последующие месяцы на нее переключились еще некоторые пакеты. База исходных текстов GCC по большей части перешла на новую лицензию с выпуском 4.2.2, а сейчас мы готовимся к завершению этого процесса.

Лицензии некоторых библиотек, сопровождающих GCC, еще не поменялись. Эти библиотеки автоматически применяются в объектном коде, который производит GCC. Поэтому если бы эти библиотеки просто распространялись на условиях GPL, то весь объектный код, который производит GCC, приходилось бы распространять на тех же условиях. Однако когда-то давно ФСПО решил позволить разработчикам применять библиотеки GCC для компиляции любой программы независимо от ее лицензии. Разработка несвободных программ не полезна для общества, и ничто не обязывает нас облегчать ее. Мы решили позволить это, потому что, как нам представлялось, запрет, вероятно, приведет к последствиям, негативным для нас самих, и потому что если бы небольшие библиотеки использовались для  того, чтобы ограничить применение GCC, это выглядело бы как хвост, виляющий собакой.

Таким образом, у этих библиотек всегда были лицензионные исключения, позволяющие людям распространять объектный код, который производит GCC, под любой лицензией. Сейчас мы переводим эти библиотеки на GPLv3 и обновляем их исключения. Основы нашей политики не изменились; новая лицензия составлена так, чтобы разрешать все применения GCC, которые были разрешены ранее. Однако мы решили воспользоваться этим случаем, чтобы достичь трех целей:

  • Использовать новые положения GPLv3. GPLv3 отличается несколькими новыми условиями, полезными для всех программ. Сюда входит раздел 7, который создает базу для предоставления лицензионных исключений. Чтобы получить в GCC как можно больше пользы от перехода на GPLv3, нам нужно обновить это исключение, чтобы учесть эти новые условия и работать в рамках раздела 7.

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

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

Как и в случае с GPLv3, когда мы писали проект этого исключения, мы прилагали массу усилий, чтобы выслушать различные соображения пользователей и учесть их должным образом. При всем при том этот процесс занял у нас больше года. Фонд свободного программного обеспечения и Руководящий комитет GCC хотели бы выразить благодарность Ричарду Фонтане, Брэдли Куну и Карен Сэндлер из Юридического центра свободы программного обеспечения за их упорный труд и помощь в работе над этим исключением. Эти изменения укрепят сообщество GCC, и мы будем с нетерпением ждать прогресса компилятора в новых направлениях, которые оно откроет.

Поскольку GCC является настолько критичной частью жизни разработчиков, мы ожидаем множества вопросов об этих изменениях и хотим гарантировать, что они не останутся без ответа. Ниже мы даем ответы на конкретные вопросы, которых мы ожидаем от пользователей. Если у вас есть вопросы о новом исключении, которые здесь не упоминаются, обращайтесь к нам, пожалуйста, по адресу <[email protected]>.

Как действует исключение

Нужное вам разрешение — передавать объектный код из этих библиотек GCC под собственной лицензией вашего проекта — в основном содержится в разделе 1:

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

В этом разделе употребляется много терминов, и их конкретные значения неразрывно связаны с тем, как действует исключение. В этом разделе рассмотрено, как эти условия связаны с обычными вариантами применения.

Когда вы пишете свою программу, она состоит из набора файлов исходного текста. Каждый файл является “независимым модулем” до тех пор, пока он не содержит никаких исходных текстов из библиотек GCC.

Когда вы компилируете эти файлы исходного текста, они обычно проходят через ряд этапов: генерация исходного текста, обработка препроцессором, компиляция в низкоуровневый код, ассемблирование и компоновка. Не во всех проектах есть все эти шаги — это зависит от языка, которым вы пользуетесь, и от того, как пишется программа, но они всегда идут в таком порядке, и всякий, кто пользуется GCC, будет проходить через процесс компиляции программы на языке высокого уровня в программу на некотором языке низкого уровня, таком как язык ассемблера или псевдокод Java. Именно в этой фазе GCC комбинирует или компонует ваши программы с программами библиотек GCC. Мы называем это “компиляционным процессом”. На выходе этого процесса вы получаете то, что называется “целевым кодом”, до тех пор, пока эти выходные данные не используются как данные в промежуточном представлении компилятора или для создания таких данных в промежуточном представлении компилятора.

Чтобы воспользоваться этим разрешением, компиляционный процесс, который вы применяете для создания целевого кода, должен быть “подходящим”, что означает, что в него не вовлекается одновременно GCC и несовместимые с GPL программы. Важно помнить, что компиляционный процесс начинается, когда вы подаете на вход GCC любые программы на языке высокого уровня, а завершается, как только он сгенерирует хоть что-то, что может считаться целевым кодом. По этой причине до тех пор, пока GCC не выводит данные в промежуточном представлении, ваш компиляционный процесс будет оставаться подходящим, даже если вы применяете GCC в сочетании с несовместимыми с GPL ассемблерами, редакторами связей и генераторами программ на языке высокого уровня: эти программы не вовлекаются в компиляционный процесс в том виде, в каком он здесь определен. Единственный момент, в который нельзя применять несовместимые с GPL программы вместе с GCC,— это когда он выполняет основную работу по компиляции.

Итак, если вы применяете GCC, с совместимыми с GPL улучшениями или без них, это будет подходящий компиляционный процесс. Если вы пользуетесь только несовместимыми с GPL средствами компиляции, это тоже будет подходящий компиляционный процесс. (Нередко люди, которые собирают программы для GNU/Linux, компонуют с библиотеками GCC, даже если они пользуются другим компилятором.) Однако если бы вы применяли GCC в сочетании с несовместимыми с GPL программами в ходе преобразования программы на языке высокого уровня в низкоуровневый код, это не было бы подходящим компиляционным процессом. Это произошло бы, если бы вы, например, применяли GCC с несвободным внешним модулем.

До тех пор, пока вы применяете подходящий компиляционный процесс, у вас есть разрешение брать целевой код, генерируемый GCC, и перемещать его “на выбранных вами условиях”.

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

Вопросы и ответы

Я пользуюсь стандартным выпуском GCC (например, предоставленным ФСПО или поставляемым с моей операционной системой) для компиляции несовместимых с GPL программ. Как это изменение сказывается на мне?

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

На ком сказывается это изменение?

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

Я пользуюсь GCC в сочетании с несвободными препроцессорами или генераторами исходного текста, чтобы компилировать свою программу. Могу ли я, несмотря на это, пользоваться этим исключением?

Да. Компиляционный процесс начинается с любой “программы, полностью представленной на непромежуточном языке высокого уровня”. Сюда входят программы, генерируемые препроцессором или другими несвободными программами. Компиляционный процесс как таковой в данном случае не вовлекает никаких несвободных программ; его следует считать подходящим, и исключение распространяется на эту программу.

Я применяю GCC в сочетании с несвободными ассемблерами или редакторами связей, чтобы компилировать свою программу. Могу ли я, несмотря на это, пользоваться этим исключением?

Да. Компиляционный процесс завершается, когда компилятор генерирует целевой код, который включает в себя выходные данные, “пригодные для передачи на ассемблер, загрузчик, редактор связей или в фазу выполнения”. Другими словами, в данном случае компиляционный процесс завершается, когда вы получили из GCC ассемблерный код или нескомпонованные объектные файлы, и таким образом, он не вовлекает никаких несвободных программ. Его можно считать подходящим, а следовательно, исключение распространяется на эту программу.

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

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

Я пользуюсь несвободным компиляторным набором инструментов без каких бы то ни было частей GCC, чтобы скомпилировать свою программу, и компоную ее с libstdc++. В состав самой моей программы не входят никакие процедуры библиотеки времени исполнения точно так же, как в состав программ, компилируемых с помощью GCC, не входит libgcc. Могу ли я все так же пользоваться этим исключением?

Да. Хотя комбинирование libgcc с объектным кодом, компилируемым с помощью GCC, вероятно, представляет самый распространенный способ пользования исключением, ни GPL, ни “Исключение для библиотек времени исполнения GCC” не отличает в своих условиях динамической компоновки от других методов комбинирования программ. Для вас доступны одни и те же разрешения на одних и тех же условиях независимо от того, каким методом вы пользуетесь.

Обратите внимание, что если вы распространяете libstdc++ в качестве независимой библиотеки, то вам нужно будет при этом следовать условиям GPL. Например, если вы распространяете саму библиотеку в виде объектного кода, вам нужно будет предоставлять исходный текст своим получателям одним из методов, перечисленных в разделе 6 GPLv3. Но до тех пор, пока вы можете правомерно пользоваться для своей программы разрешениями “Исключения для библиотек времени исполнения GCC”, условия GPL на нее не распространяются.

Почему данные в промежуточном представлении компилятора исключены из определения “целевого кода”?

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

Мы делаем это, исключая такие выходные данные из определения целевого кода. Благодаря этому, даже если кто-то напишет внешний модуль, который сохраняет эти сведения на диске, любые программы, которые изменяют структуры перед тем, как GCC выводит целевой код, будут вовлечены в компиляционный процесс. Если эта программа несвободна, исключение не будет доступно для любых программ, скомпилированных с ее помощью; объектный код, который в конце концов создает GCC, придется распространять на условиях GPL.

Если я пишу какие-то программы на языке ассемблера, могу ли я комбинировать их с другим объектным кодом, скомпилированным обычным образом, и все так же пользоваться этим исключением?

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

На какие библиотеки распространяется “Исключение для библиотек времени исполнения GCC”?

“Исключение для библиотек времени исполнения GCC” распространяется на все файлы, в лицензионных заголовках которых это указано. К таким библиотекам относятся libgcc, libstdc++, libfortran, libgomp, libdecnumber, libgov и другие библиотеки, распространяемые с GCC.

Будет ли это новое исключение применяться для Classpath?

Хотя нынешнее исключение Classpath и служит для сходных целей, в этот раз мы его не обновляем. Из-за недавних разработок в сообществе свободного программного обеспечения Java приоритеты для принципов лицензирования Classpath отличаются от приоритетов для других библиотек GCC, и мы взвешиваем это предложение отдельно.