Como distribuo meu software científico com o menor número possível de dependências?

8

Como parte da minha pesquisa, escrevo muitos códigos Python e MATLAB que nunca precisam ser distribuídos a mais ninguém. Mesmo que eu precise distribuir meu software, Python e MATLAB, ambos sendo interpretados, tornam o compartilhamento relativamente simples.

Agora estou escrevendo algum software em C ++ que gostaria de distribuir. Eu sei como compilar o software em minha própria máquina, mas o que não entendo é o que precisa ser feito para fornecer o software a outras pessoas.

Primeiro, mais sobre o meu projeto: estou escrevendo um código para calcular e exibir visualizações. O projeto é baseado em gráficos e, portanto, estou usando a biblioteca de gráficos LEMON. Estou explorando as implementações VTK e OpenGL com o objetivo de exibir a visualização. Gostaria de escrever ligações Python e MATLAB para que os usuários desses ambientes pudessem usar meu software e gostaria de produzir versões para Windows e Linux (ainda não pensei no OS X ...).

Então, vamos dar como exemplo a biblioteca de gráficos LEMON. É um monte de cabeçalhos, juntamente com um pequeno objeto compartilhado. No meu sistema de desenvolvimento, compilo a biblioteca com o CMake e a vinculo ao meu projeto.

Agora diga que quero dar meu software a alguém executando no Windows. Quero que eles possam baixar um instalador, clicar em um ou dois botões e ter tudo resolvido. Não quero que eles se preocupem com a instalação da biblioteca LEMON ou OpenGL. Eles não deveriam ter que compilar nada conscientemente. Isso é possível?

Tenho a sensação de que é, mas falho quando procuro referências. Eu tenho uma vaga idéia de que, se eu compilar um binário no Windows, devo poder distribuí-lo a qualquer pessoa executando um sistema operacional Windows. Mas e as bibliotecas que eu uso? Acho que preciso vinculá-los estaticamente no Windows, e isso resolverá o problema de dependência. Mas, no fundo, eu li que vincular estaticamente não é uma boa prática (ou é apenas no Linux?)

Como você pode ver, estou um pouco perdido. Eu apreciaria uma cutucada na direção certa e algumas referências para ler, se você souber de alguma!

jme
fonte
5
Consegui um conselho: comece a TENTAR. Na verdade, compile um pacote, vá para outro computador e tente executá-lo lá (use instaladores somente depois de saber o que fazer). Enxágüe, repita. Explore as configurações do compilador, evite usar bibliotecas de depuração para lançamento, use o rastreamento de dependência.
Deer Hunter
@DeerHunter Posso apreciar a abordagem empírica e certamente passei algumas horas experimentando e pesquisando. Dito isso, eu gostaria de saber se é possível empacotar, digamos, VTK, com o meu software, para que o usuário não precise instalá-lo ou qualquer uma de suas dependências. Todo projeto que eu vi que usa o VTK pede ao usuário para instalá-lo como pré-requisito. Talvez seja a minha resposta.
JME
jme, é possível se você verificar a licença e a licença permitir isso. Dependências agrupadas são suportadas em todas as principais estruturas de instalação.
Deer Hunter
1
No Linux, a vinculação dinâmica é preferida, porque o software de gerenciamento de pacotes garante que haja apenas uma cópia de cada biblioteca no sistema. Mas no Windows, basta vincular estaticamente, pois ele não possui um gerenciador de pacotes utilizável. Mesmo no Linux, vincularia estaticamente coisas que não estão no repositório de pacotes padrão ou no LSB para compatibilidade entre distribuições. Apenas verifique se você está autorizado a fazê-lo (o LGPL para no limite do link dinâmico, para que você não possa vincular estaticamente, por exemplo, o Qt no aplicativo que não seja LGPL).
Jan Hudec
1
@ JanHudec no Windows, você também pode vincular dinamicamente e colocar todas as dlls usadas no mesmo diretório que o exe
stijn

Respostas:

2

Enquanto a licença das bibliotecas VTK permitir, você poderá escrever um script do NSIS Installer (que criará um instalador redistribuível) que instalará as bibliotecas VTK no modo silencioso. O modo silencioso (se o instalador do VTK tiver isso) instalará as bibliotecas sem solicitar ao usuário qualquer entrada - é assim que a maioria dos instaladores de videogames funciona (o software necessário é instalado sem solicitar que você concorde com os termos de uso ou onde instalar isto).

No entanto, apenas a instalação cega de software extra pode deixá-lo em uma posição legal precária. Não tenho muita certeza da legalidade disso, mas acho que você deve informar o usuário de todo o software extra que está prestes a instalar na máquina.

Como exemplo, um dos instaladores em que escrevi (para um produto em que trabalho) exige que o SQL Server 2005 seja instalado juntamente com o binário. No script de instalação, se a máquina do usuário não tiver a versão exigida do SQL Server (ou posterior) instalada, ele chamará o arquivo MSI do SQL Server 2005 (empacotado no instalador do NSIS) com a opção / q. Isso instala o servidor SQL com as configurações padrão e tudo que o usuário vê é o prompt "instalando o SQL Server 2005" que é exibido enquanto o MSI faz seu trabalho. Fazemos questão de informar o usuário sobre isso e dar a ele a opção de instalar nosso software sem ele.

Você pode criar uma marca que criará todas as suas bibliotecas para você e, em seguida, chame o construtor de scripts NSIS, mas não tenho certeza. Eu não olhei tão longe no buraco do coelho para o NSIS, pois não estamos automatizando as compilações do instalador.

Obviamente, você pode substituir o NSIS por qualquer outro ambiente de script do instalador. Eu só usei aqui como exemplo, porque tenho um pouco de experiência com ele.

Jamie Taylor
fonte