Logiciel propriétaire d’empaquetage pour Linux

Je fais du développement multi-plateforme et je veux créer un paquetage sympa et autonome (!) Pour Linux. Je sais que ce n’est pas comme ça que ça se passe habituellement, mais l’application nécessite toutes les données au même endroit, alors je l’installe dans / opt, comme beaucoup d’autres logiciels propriétaires. Je vais éventuellement fournir des paquets deb et rpm, mais ce ne sera que pour le moment .tar.gz. L’utilisateur devrait l’extraire quelque part et cela devrait fonctionner. Je préfère ne pas avoir d’installateur.

D’abord mes questions, puis les détails:

  1. Comment les autres utilisateurs intègrent-ils les logiciels propriétaires pour Linux?
  2. Existe-t-il des outils pour les logiciels de packaging, y compris les bibliothèques partagées?

Maintenant, pour quelques détails: Ceci est la mise en page de mon projet (je l’appelle foo à cette fin):

  • foo (binary)
  • config.ini
  • Les données

Maintenant, dans le package, il y aura deux éléments supplémentaires:

  • libs
  • foo.sh

Les bibliothèques contiendront toutes les bibliothèques partagées par le projet, et foo.sh est un script qui définit LD_LIBRARY_PATH pour inclure les bibliothèques . Par conséquent, l’utilisateur exécutera foo.sh et le programme devrait démarrer.

J’ai un script shell qui emballe le logiciel dans les étapes suivantes:

  1. Créer un répertoire vide et y copier foo.sh
  2. Appeler le processus de compilation et faire l’installation dans le nouveau répertoire
  3. Copier les bibliothèques partagées du système de fichiers
  4. Tout emballer comme .tar.gz

Que pensez-vous de cela? Il y a quelques problèmes avec cette approche:

  • Je dois coder toutes les dépendances deux fois (une fois dans CMake, une fois dans le script de packaging)
  • Je dois définir le numéro de version deux fois (une fois dans le code source, une fois dans le script de packaging)

Comment faites-vous?

Edit: Une autre question vient d’être posée: comment déterminez-vous sur quelles bibliothèques votre logiciel dépend? J’ai fait un ldd foo , mais il y a un tas de choses. J’ai regardé à quoi ressemblaient les paquets WorldOfGoo et ils ne livraient que très peu de bibliothèques. Comment puis-je faire des hypothèses sur la bibliothèque qui sera présente dans le système d’un utilisateur et qui ne le sera pas? Installez simplement toutes les dissortingbutions ciblées dans une masortingce virtuelle et voyez ce qui est requirejs?

Problèmes génériques

Votre façon d’emballer vos objects (avec des bibliothèques dépendantes) sur /opt est la façon dont les logiciels propriétaires (et même open-source) sont intégrés. C’est la pratique recommandée de The Linux Foundation (voir ma réponse à l’autre question pour les liens).

Les bibliothèques externes peuvent être compilées à partir de zéro et incorporées dans votre processus de construction en tant qu’étape distincte (en particulier si vous les modifiez), ou extraites de packages de certaines dissortingbutions. La seconde approche est plus facile, mais la première permet plus de flexibilité.

Notez qu’il n’est pas nécessaire d’inclure des bibliothèques de bas niveau (telles que glibc, Xorg) dans votre paquet. Il serait préférable de les laisser accorder aux fournisseurs de systèmes, et vous pouvez simplement supposer qu’ils existent. De plus, il existe une base standard Linux , qui documente les bibliothèques les plus importantes; ces bibliothèques existent presque partout et on peut leur faire confiance.

Notez également que si vous comstackz sous un système plus récent, les utilisateurs de systèmes plus anciens ne pourront probablement pas l’utiliser, alors que l’inverse n’est pas vrai. Donc, pour obtenir une meilleure compatibilité, il peut être utile de comstackr un paquetage sous un système deux ans plus ancien qu’aujourd’hui.

Je viens de décrire des choses génériques, mais je crois que le site Web de Linux Developers Network contient plus d’informations sur l’emballage et la portabilité.

Emballage

À en juger par ce que j’ai vu dans les projets de dissortingbution open-source, votre script le fait de la même manière que les fournisseurs de logiciels de dissortingbution. Leurs scripts corrigent automatiquement les sources, reproduisent l’installation des logiciels et regroupent les dossiers résultants en DEB et RPM.

Tar.gz, ou bien sûr, pourrait aussi fonctionner, mais la création, par exemple, d’un RPM n’est pas assez complexe pour que vous puissiez rater une telle opportunité de rendre la vie de vos utilisateurs beaucoup plus facile.

Répondre à vos questions,

  • Oui, vous devez coder en dur deux fois les dépendances.

    La chose est que lorsque vous les placez dans CMake, vous les spécifiez dans les autres termes que lorsque vous les spécifiez dans un script de packaging. CMake fait référence aux bibliothèques partagées et aux fichiers d’en-tête , tandis que le script d’empaquetage fait référence aux packages .

    Il n’y a pas de relation univoque entre les noms de paquets et les bibliothèques et les en-têtes partagés. Cela varie selon les dissortingbutions. Par conséquent, il convient de le spécifier deux fois.

    Mais le paquet peut être facilement re-emballé par les fournisseurs de dissortingbution, en particulier si vous vous efforcez d’y intégrer toutes les bibliothèques dépendantes (il y aura donc moins de dépendances externes à porter). En outre, un outil permettant de transférer des paquets d’une dissortingbution à une autre apparaîtra bientôt (je mettrai à jour ma réponse dès sa sortie).

  • Oui, vous devez spécifier votre version deux fois.

    Mais le fait est que vous pouvez organiser votre processus de packaging de manière à ce que les versions des packages et des logiciels ne soient jamais désynchronisées . Il suffit de faire en sorte que le script de packaging extrait de votre référentiel (ou télécharge depuis votre site Web) exactement la même version que le script va écrire dans les spécifications du package.

Analyser les dépendances

Pour parsingr les dépendances de votre logiciel, vous pouvez utiliser notre outil open source, gratuit, Linux Application Checker . Il affichera la liste des bibliothèques dont il dépend, affichera les dissortingbutions avec lesquelles votre logiciel est compatible et aidera votre application à être plus portable entre les dissortingbutions. Il s’avère que parfois, une plus grande compatibilité entre les répartitions peut être obtenue sans trop d’efforts, et vous n’avez pas besoin de vous limiter à quelques dissortingbutions sélectionnées.

Pensez longuement et durement (ou demandez à votre service de développement de produits) quelles dissortingbutions / architectures vous devez supporter.

Assurez-vous qu’ils comprennent bien les implications du test.

Je pense que vous trouverez une liste très courte des dissortingbutions et des architectures sockets en charge.

Cela dépend vraiment des clients qui paient pour le support Linux. La plupart des utilisateurs utilisent Redhat Enterprise (sur des serveurs) ou Centos (ce qui est impossible à distinguer d’un sharepoint vue technique).

Si vous avez seulement besoin de prendre en charge Redhat, il vous suffit de prendre en charge RPM, le travail est une bonne chose.