Lógica e FAQ de Exceção da Biblioteca de Tempo de Execução do GCC

Introdução

Em 29 de junho de 2007, a Free Software Foundation lançou a GPLv3. Foi imediatamente adotada por quinze projetos GNU, e outros mudaram nos meses seguintes. A maior parte da base de código do GCC migrou para a nova licença no lançamento 4.2.2 e agora estamos nos preparando para finalizar esse processo.

As licenças de algumas bibliotecas que acompanham o GCC ainda não foram alteradas. Essas bibliotecas são usadas automaticamente pelo código objeto que o GCC produz. Por causa disso, se essas bibliotecas fossem simplesmente distribuídas apenas sob os termos da GPL, todo o código objeto que o GCC produz teria que ser distribuído sob os mesmos termos. No entanto, a FSF decidiu há muito tempo permitir que os desenvolvedores usem as bibliotecas do GCC para compilar qualquer programa, independentemente de sua licença. O desenvolvimento de software não livre não é bom para a sociedade e não temos obrigação de torná-lo mais fácil. Decidimos permitir isso porque proibir parecia sair pela culatra, e porque usar pequenas bibliotecas para limitar o uso do GCC parecia a cauda abanando o cachorro.

Portanto, essas bibliotecas sempre tiveram exceções de licença que permitem que as pessoas distribuam o código objeto que o GCC produz sob qualquer licença. Estamos agora movendo essas bibliotecas para a GPLv3 e atualizando suas exceções. Nossa política fundamental não mudou; a nova licença destina-se a permitir todos os usos do GCC permitidos anteriormente. No entanto, decidimos usar essa oportunidade para atualizar a exceção para realizar três metas:

Assim como na GPLv3, trabalhamos duro para ouvir os interesses de vários usuários enquanto elaboramos isso e os endereçamos apropriadamente. Tudo dito, passamos mais de um ano neste processo. A Free Software Foundation e o Comitê Gestor do GCC gostariam de agradecer a Richard Fontana, Bradley Kuhn e Karen Sandler no Software Freedom Law Center por todo seu trabalho duro e assistência com a exceção. As mudanças aqui fortalecerão a comunidade do GCC, e estamos ansiosos para os desenvolvimentos do compilador que ela permitirá.

Como o GCC é uma parte crucial da vida dos desenvolvedores, esperamos muitas perguntas sobre essas mudanças e queremos garantir que elas sejam abordadas. Abaixo, abordamos preocupações específicas que esperamos que os usuários tenham. Se você tiver dúvidas sobre a nova exceção que não é mencionada aqui, sinta-se à vontade para entrar em contato conosco em <licensing@fsf.org>.

Como a exceção funciona

A permissão que você precisa – para transmitir o código objeto dessas bibliotecas do GCC sob a licença do seu próprio projeto – está principalmente contida na seção 1:

Você tem permissão para propagar um trabalho do Código Alvo formado pela combinação da Biblioteca de Tempo de Execução com Módulos Independentes, mesmo se essa propagação violasse os termos do GPLv3, desde que todos os Código Alvo sejam gerados pelos Processos de Compilação Aptos. Você pode então transmitir essa combinação sob os termos de sua escolha, consistente com o licenciamento dos Módulos Independentes.

Esta seção usa muitos termos definidos e seus significados específicos são essenciais para o funcionamento da exceção. Esta seção analisa como esses termos se relacionam com cenários comuns.

Quando você escreve seu software, ele consiste em um conjunto de arquivos de código fonte. Cada arquivo é um “Módulo Independente” desde que não contenha nenhuma fonte das bibliotecas do GCC.

Quando você compila esses arquivos de código fonte, eles geralmente passam por uma série de etapas: geração de código fonte, pré-processamento, compilação para código de baixo nível, montagem e vinculação. Nem todos os projetos seguem todas essas etapas, dependendo de qual linguagem você está usando e como está escrito, mas eles sempre seguem nessa ordem, e todos usando o GCC passarão pelo processo de compilação de códigos de alto nível em alguns linguagem de baixo nível, como código assembly ou bytecode Java. Esta fase é quando o GCC combina ou vincula seu próprio código ao código das bibliotecas do GCC. Nós o chamamos de “Processo de Compilação”. A saída que você obtém é chamada “Código Alvo” contanto que essa saída não seja usada como representação intermediária do compilador ou para criar uma representação intermediária desse tipo.

Para aproveitar essa permissão, o Processo de Compilação que você usa para criar o Código Alvo deve ser “Apto”, o que significa que não envolve software incompatível com GCC e GPL. É importante lembrar que o Processo de Compilação começa quando você alimenta o GCC com qualquer código de alto nível e termina assim que gera algo que possa ser considerado como Código Alvo. Por causa disso, desde que o GCC não esteja escrevendo a representação intermediária, seu Processo de Compilação ainda pode ser Apto mesmo se você usar o GCC em conjunto com montadores, vinculadores ou geradores de código de alto nível incompatíveis com GPL: esses programas não estão envolvidos no Processo de Compilação, como é definido aqui. O único lugar onde você não pode usar software incompatível com a GPL com o GCC é quando está executando o trabalho de compilação do núcleo.

Portanto, se você usar o GCC, com ou sem aprimoramentos compatíveis com GPL, isso seria um Processo de Compilação Apto. Se você usar apenas ferramentas de compilador incompatíveis com a GPL, isso também seria um Processo de Compilação Apto. (Não é incomum que pessoas que criam software para GNU/Linux vincularem com as bibliotecas do GCC, mesmo se estiverem usando um compilador diferente.) Entretanto, se você usou o GCC em conjunto com o software incompatível com GPL durante o processo de transformação de código de nível para código de baixo nível, esse não seria um Processo de Compilação Apto. Isso aconteceria se, por exemplo, você usasse o GCC com um plug-in proprietário.

Contanto que você use um Processo de Compilação Apto, então você tem permissão para tomar o Código Alvo que o GCC gera e propagá-lo “sob os termos de sua escolha”.

Se você usou software incompatível com a GPL em conjunto com o GCC durante o processo de compilação, não seria possível tirar proveito dessa permissão. Como todo o código objeto gerado pelo GCC é derivado dessas bibliotecas GPL, isso significa que você deve seguir os termos da GPL ao propagar qualquer um desses códigos de objeto. Você não poderia usar o GCC para desenvolver seu próprio software incompatível com GPL.

Perguntas frequentes (FAQ)

Estou usando uma lançamento padrão do GCC (como a fornecida pela FSF ou com meu sistema operacional) para compilar software incompatível com GPL. Como essa mudança me afeta?

Não deve afetar você. A menos que você tenha configurado o GCC para gerar uma representação intermediária – o que é raro –, a nova exceção é projetada para garantir que você não tenha obrigações de licença quando fizer isso, assim como as exceções antigas.

A quem essa mudança afeta?

Ninguém que esteja usando o GCC atualmente deve ser afetado por essa mudança. As únicas mudanças na política destinam-se a impedir que os desenvolvedores façam certas modificações no GCC que serão possíveis no futuro. A FSF tem trabalhado em estreita colaboração com os desenvolvedores do GCC para aprender mais sobre as diferentes maneiras pelas quais as pessoas usam o GCC hoje e garantir que todas elas possam continuar essas atividades sob a nova exceção.

Eu uso o GCC em conjunto com pré-processadores e/ou geradores de fontes proprietários para compilar meu programa. Ainda posso aproveitar a exceção?

Sim. O Processo de Compilação pode começar com qualquer “código totalmente representado por meio de linguagem não intermediária de alto nível”. Isso inclui código gerado por um pré-processador ou outro software proprietário. Como tal, o processo de compilação, neste caso, não envolve nenhum software proprietário; qualifica-se como Apto e a exceção está disponível para este programa.

Eu uso o GCC em conjunto com montadores e/ou vinculadores proprietários para compilar meu programa. Ainda posso aproveitar a exceção?

Sim. O Processo de Compilação termina quando o compilador gera o Código Alvo, que inclui uma saída que é “adequada para entrada em um montador, carregador, vinculador e/ou fase de execução”. Em outras palavras, o Processo de Compilação, neste caso, acaba quando você tem o código de montagem ou arquivos de objeto desvinculados do GCC, e por isso não envolve nenhum software proprietário. Qualifica-se como Apto e a exceção está disponível para este programa.

Eu uso o GCC para compilar partes do meu programa e um compilador proprietário para compilar outras partes. As peças são combinadas posteriormente, durante as fases de montagem ou de vinculação. Ainda posso aproveitar a exceção?

Sim. Neste caso, cada Módulo Independente é transformado em Código Alvo através de um Processo de Compilação Apto. Mesmo que diferentes módulos passem por diferentes processos, a exceção ainda está disponível para este programa.

Eu uso uma cadeia de ferramentas de compilador proprietário sem qualquer parte do GCC para compilar meu programa e vinculá-lo ao libstdc++. Meu programa em si não inclui nenhum código de biblioteca de tempo de execução da mesma maneira que programas compilados pelo GCC incluem libgcc. Ainda posso aproveitar a exceção?

Sim. Embora a combinação de libgcc com código objeto compilado pelo GCC seja provavelmente a forma mais comum de uso da exceção, a GPL e a Exceção da Biblioteca de Tempo de Execução do GCC não distinguem entre vinculação estática, vinculação dinâmica e outros métodos para combinar código em suas condições. As mesmas permissões estão disponíveis para você, sob os mesmos termos, independentemente do método usado.

Note que, se você distribuir o libstdc++ como uma biblioteca independente, precisará seguir os termos do GPL ao fazer isso. Por exemplo, se você distribuir a própria biblioteca na forma de código objeto, precisará fornecer o código fonte aos seus destinatários usando um dos métodos listados na seção 6 da GPLv3. Mas, desde que você esteja qualificado para aproveitar as permissões de Exceção da Biblioteca de Tempo de Execução do GCC para o seu próprio programa, os termos da GPL não se estendem a ele.

Por que a representação intermediária do compilador é excluída da definição de “Código Alvo”?

Quando consideramos a adição de uma infraestrutura de plug-in ao GCC, estávamos profundamente preocupados com a possibilidade de alguém escrever um plug-in que salvasse apenas as estruturas internas de dados de compilação de baixo nível do GCC no disco. Com isso feito, outro software seria capaz de otimizar ou melhorar o código sem estar diretamente conectado ao GCC. Pode ter sido difícil para nós argumentar que esses programas deveriam estar sujeitos ao copyleft da GPL, então queríamos desencorajar esse tipo de arranjo.

Fazemos isso excluindo essa saída da definição do Código Alvo. Por causa disso, mesmo que alguém escreva um plug-in que armazene essas informações no disco, todos os programas que alterarem as estruturas antes de o GCC escrever o Código Alvo estarão envolvidos no Processo de Compilação. Se esse programa for proprietário, a exceção não estará disponível para nenhum software compilado com ele; o código objeto que o GCC cria finalmente terá que ser distribuído sob os termos da GPL.

Se eu escrever algum código em linguagem assembly, posso combinar isso com outro código objeto compilado normalmente e ainda aproveitar a exceção?

Sim, desde que todo o código objeto tenha sido compilado por meio de um Processo de Compilação Apto. O processo de executar o assembly escrito a mão através de um assembler é um processo de compilação, uma vez que ele “transforma o código inteiramente representado por meio uma linguagem não intermediária projetada para código escrito por humanos... no Código Alvo”.

Quais bibliotecas a Exceção de Biblioteca de Tempo de Execução do GCC cobre?

A Exceção de Biblioteca de Tempo de Execução do GCC abrange qualquer arquivo que tenha um aviso em seus cabeçalhos de licença informando que a exceção se aplica. Isso inclui libgcc, libstdc++, libfortran, libgomp, libdecnumber, libgcov e outras bibliotecas distribuídas com o GCC.

O Classpath vai usar essa nova exceção?

Ainda que a exceção atual do Classpath tenha um propósito semelhante, não estamos atualizando-o neste momento. Devido aos desenvolvimentos recentes na comunidade Java de software livre, as prioridades das políticas de licenciamento do Classpath são diferentes das outras bibliotecas do GCC, e estamos avaliando-o separadamente.