2016-05-19 21 views
6

Ho creato alcuni pezzi di software C++ che voglio rilasciare per Ubuntu. Che modi ci sono e cosa puoi raccomandare? È la costruzione di file .deb e la creazione di uno apt repo per loro il modo migliore? Che dire di make install, è considerato un modo accettabile per installare il software?Rilascio per Ubuntu

Di gran lunga più semplice per me, e forse la più trasparente per l'utente, sarebbe semplicemente avere un repository github in cui è possibile eseguire make install per ottenere tutti i programmi installati in una volta.

Devo installare sempre i binari in /usr/bin?

Uno dei programmi contiene codice libreria Python 3, dovrebbe essere installato in /usr/lib/python3/dist-packages? (Non voglio creare un pacchetto pip, che renderebbe l'installazione più difficile - e sprecherò di più del mio tempo.) Il programma contiene anche esempi/tutorial di Python 3 destinati all'utente a modificare e imparare da dove sono installare quelli? Devo creare un ~/my-prog-tutorial-dir/ per inserirli? In tal caso: come dovrei nominare quella directory?

Modifica: se rilasci semplicemente i file binari collegati in modo statico in un archivio, cosa si romperà alla fine? Libc? Esistono importanti API di applicazioni che di solito cambiano tra gli Ubuntu LTS? Uso solo pthreads, X11 e OpenGL quindi sospetto che i binari collegati staticamente potrebbero essere un'opzione abbastanza stabile?

+0

Non tutti hanno i permessi per l'installazione in '/ usr/bin'. Quindi il tuo valore predefinito potrebbe essere '/ usr/bin', ma dovresti renderlo abbastanza configurabile da usare altre posizioni. La maggior parte dei sorgenti C++ utilizza un altro livello di strumenti di compilazione (autotools) e il software è installato con './configure && make && make test && sudo make install' –

+4

Vedi [Come ottenere il mio software in Ubuntu?] (http://askubuntu.com/questions/16446/how-to-get-my-software-into-ubuntu) –

+1

Io, ad esempio, distribuisco il mio software come eseguibile archiviato in modo semplice che può essere scaricato dal sito Web ufficiale [ ] (https://brute.tk) – ForceBru

risposta

1

Sono stato asked per espandere il mio commento in una risposta, e così faccio.

Il progetto di cui stavo parlando si chiama Woodpecker hash Bruteforce e lo distribuisco come semplici eseguibili archiviati per Mac OS, Windows e Linux.

hash Woodpecker Bruteforce ha solo due dipendenze di cui mi devo occupare (gli utenti non devono installare nulla): OpenSSL e Botan - librerie per fare hashing. Ho due macchine virtuali sul mio Mac dove costruisco il progetto e diversi script per automatizzare il processo. Uso Docker (in collaborazione con VirtualBox) e VMware Fusion.

Sopra ho detto che gli utenti non devono preoccuparsi di alcuna libreria di terze parti perché tutto è collegato staticamente con l'eseguibile: basta scaricare il file appropriato dal sito web ufficiale, annullarlo (se necessario), sudo chmod +x l'eseguibile e questo è tutto!

Questo funziona su qualsiasi versione di Linux, inclusi Ubuntu (questo è dove eseguo la build) e Kali Linux.

+0

Sembra un modo semplice e pulito per rilasciare! Ho letto un numero di volte online che le persone hanno problemi nell'esecuzione di binari precompilati su Linux. È qualcosa del passato, o si applica principalmente ai binari collegati dinamicamente? Presumo che tu crei solo le versioni x86 a 32 bit? La maggior parte delle persone usa l'hardware x86_64 in questi giorni, ma forse non ha importanza per la tua applicazione? –

+0

@ JonasByström, beh, non ho mai avuto problemi con il mio programma su vari Linux. Attualmente sto costruendo solo i binari a 32 bit per Linux, perché nessuno ha richiesto quelli a 64 bit, ma questo può essere fatto con un'altra linea nei miei script che controllano il processo di compilazione. – ForceBru

+1

Come ho anche riportato nella mia risposta, il collegamento statico ha una buona portabilità: ho visto questo metodo fallire solo poche volte, con binari molto vecchi (ad es. Compilati su kernel precedenti alla 2.0) o se stavano accedendo ai dispositivi. Il collegamento dinamico è più complicato, specialmente con il software C++, poiché presto vedrete incompatibilità ABI, a meno che non vengano fornite tutte le dipendenze e gli script per consentire al linker di utilizzarli. Per favore, dai un'occhiata a http://programmers.stackexchange.com/questions/254735/are-c-static-libraries-frowned-upon#comment513712_254735 e ai seguenti commenti per capire perché lo scoraggi. –

2

In generale, la creazione di un pacchetto binario renderà il software molto più semplice da installare e aggiornare per gli utenti. Lo stesso vale per i pacchetti Python. Esistono generalmente strumenti per generare pacchetti apt dai pacchetti pip, quindi puoi semplicemente elencare il tuo codice Python come una dipendenza dei tuoi pacchetti binari.

È possibile che gli imballaggi e gli installatori siano uno spreco di tempo, ma fornire solo una distribuzione di origine fa perdere tempo ai propri utenti. Gli utenti non vogliono costantemente controllare github per le nuove versioni e spesso non vogliono installare tutte le dipendenze di build se vogliono semplicemente utilizzare il software. Se il tuo software è rivolto agli sviluppatori, questo potrebbe essere un problema minore, ma è ancora un lavoro extra che i tuoi utenti devono affrontare.

Come per gli esempi, la convenzione generale è di mettere quelli in/usr/share/doc/myprogram/samples o una directory samples nel pacchetto python.

1

Il modo migliore per rilasciare il software per Ubuntu dipende dal software stesso e dal suo pubblico di destinazione, come già indicato in Miles Budnek.

Il tuo obiettivo è ridurre le barriere all'utilizzo del software. Se stai prendendo di mira gli sviluppatori del tuo software (cioè, sviluppi file sorgente che dovrebbero essere modificati da altri) o stai sviluppando una parte di codice che dovrebbe essere inclusa in altri progetti (ad esempio, gnulib), probabilmente è meglio solo fornire fonti e documentazione.

In tutti gli altri casi che attualmente immagino (anche quando si scelgono come target gli sviluppatori), fornire i binari precompilati è un'opzione migliore. In questo caso la soluzione ottimale sarebbe avere il software in Ubuntu. In questo caso, How to get my software into Ubuntu? fornisce molte informazioni utili, come suggerito da Mark K.

Ottenere software in Debian o Ubuntu può essere difficile e richiedere molto tempo (devi rispettare un sacco di politiche di cui potresti non essere a conoscenza e devi trovare uno sponsor) e imparerai presto che un punto chiave è utilizzare un sistema di compilazione decente e popolare per il software (ad esempio, autotools, cmake, distutils, ...) come indicato nello Debian Upstream Guide. Essere conformi alla guida sarà utile anche per gli utenti di altre distribuzioni.

In generale suggerisco di procedere in questo modo:

  1. forniscono fonti;
  2. utilizza un sistema di compilazione comune (dal punto di vista degli amministratori di sistema, ovvero, le persone che installano il software, gli autotools funzionano meglio nella mia esperienza per i sistemi Posix);
  3. creare un pacchetto binario (tenere presente che è necessario mantenerlo o che gli utenti incontreranno probabilmente incompatibilità binarie);
  4. aggiungere il pacchetto nel repository privato (suggerisco aptly per questa attività);
  5. cercare di ottenere il pacchetto nella distribuzione di scelta (si prega di tenere a mente i costi di manutenzione).

Un'altra opzione che non suggerisco è di fornire build collegate in modo statico. Ciò riduce la possibilità di incompatibilità binarie, ma aumenta i costi di risoluzione dei bug (ad es., Se il bug è in una dipendenza) e sicurezza, come spiegato in this e seguenti commenti. Un altro motivo per evitare il collegamento statico è se esistono diverse implementazioni dello stesso ABI, al fine di sfruttare l'accelerazione hardware (ad es. OpenGL), ma è anche possibile combinare collegamenti statici e dinamici.

Infine, è anche possibile fornire un contenitore, come docker, per spedire il software e tutte le sue dipendenze: gli utenti avranno solo bisogno di finestra mobile per eseguire l'applicazione in modo molto portabile. Tuttavia è probabilmente eccessivo nella maggior parte delle situazioni e se è una soluzione pratica o meno dipende dall'applicazione e dal pubblico di destinazione.