Venant du monde du C et du C ++, la plupart des systèmes de build ont une install
cible, notamment Makefiles (où il est recommandé par GNU par exemple) ou CMake . Cette cible copie les fichiers d'exécution (exécutables, bibliothèques, ...) dans le système d'exploitation (par exemple, sous C:\Program Files\
Windows).
Cela semble vraiment hacky, car pour moi, ce n'est pas la responsabilité du système de construction d'installer des programmes (qui est en fait la responsabilité du système d'exploitation / gestionnaire de packages). Cela signifie également que le système de construction ou le script de construction doit connaître l'organisation des programmes installés, avec les variables d'environnement, les variables de registre, les liens symboliques, les autorisations, etc.
Au mieux, les systèmes de construction doivent avoir une release
cible qui produira un programme installable (par exemple .deb
ou .msi
), puis demandera au système d'exploitation d'installer ce programme. Cela permettrait également à l'utilisateur de désinstaller sans avoir à taper make uninstall
.
Donc, ma question: pourquoi le système de construction recommande-t-il généralement d'avoir une install
cible?
la source
make install
installe généralement sous/usr/local
(ou même/opt
) des répertoires qui ne sont pas gérés par le "système de gestion du système d'exploitation / du noyau". Je ne sais pas si Windows a une convention similaire.make install
cela n'a aucun sens lorsque nous parlons de compilation croiséeDESTDIR
.Réponses:
De nombreux scripts de construction ou Makefiles ont une cible d'installation car ils ont été créés avant que les gestionnaires de packages n'existent et parce qu'aujourd'hui encore de nombreux systèmes ne disposent pas de gestionnaires de packages. De plus, il existe des systèmes où est
make install
en fait la façon préférée de gérer les packages.la source
make install
sont préférés. En dehors de cela, je voulais dire gestionnaire de programme quand j'ai dit que les makefiles devraient créer des packages installables. Je pense que presque tous les OS sont livrés avec un moyen de gérer les programmes installés? Par exemple, Windows n'a pas de gestionnaire de packages (en dehors du magasin) mais a toujours un moyen de gérer les programmes installés (via des.msi
packages pour des exemples)make install
.checkinstall
overmake install
pour deux raisons: "Vous pouvez facilement supprimer le paquet en une seule étape." et "Vous pouvez installer le package résultant sur plusieurs machines." - comme checkinstall construit un .deb et l'installe, il utilise le gestionnaire de paquets ...make install
checkinstall
invocation utiliseramake install
et surveillera ses actions pour la construction de packages.Un
makefile
peut ne pas avoir deinstall
cible, et plus important encore, vous pouvez avoir des programmes qui ne sont même pas censés être installables (par exemple, car ils devraient s'exécuter à partir de leur répertoire de construction, ou parce qu'ils peuvent s'exécuter installés n'importe où). Lainstall
cible n'est qu'une convention pour lesmakefile
-s habituels .Cependant, de nombreux programmes nécessitent l'exécution de ressources externes (par exemple: polices, bases de données, fichiers de configuration, etc.). Et leur exécutable fait souvent des hypothèses sur ces ressources. Par exemple, votre
bash
shell devrait généralement lire un fichier d'initialisation à partir de/etc/bash.bashrc
etc .... Ces ressources sont généralement dans le système de fichiers (voir hier (7) pour les conventions sur la hiérarchie des fichiers) et le chemin du fichier par défaut est construit dans votre exécutable.Essayez d'utiliser des chaînes (1) sur la plupart des exécutables de votre système. Vous découvrirez quels chemins de fichiers lui sont connus.
BTW, pour de nombreux programmes GNU utilisant
autoconf
, vous pouvez exécutermake install DESTDIR=/tmp/destdir/
sans être root. Puis/tmp/destdir/
est rempli les fichiers qui devraient être plus tard emballés.FWIW, j'ai tendance à croire que mon programme bismon (sous licence GPLv3 +) (décrit dans mon rapport bismon-chariot-doc.pdf ) ne peut pas être "installé"; Je ne suis pas sûr de pouvoir le prouver et je ne peux pas imaginer comment rendre ce programme installable.
la source
/opt
ou dans$HOME
. La seule façon d'éviter différents préfixes est d'utiliser des conteneurs, mais c'est bien sûr une solution spécifique à Linux../configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install
et pouvoir déplacer le package vers/opt/foo
sans aucun problème.Il y a plusieurs raisons qui me viennent à l'esprit.
$HOME
répertoire. Tous les gestionnaires de packages ne le prennent pas en charge.la source
Une raison non mentionnée est qu'il y a de nombreuses fois où vous n'utilisez pas la version actuelle du logiciel ou utilisez une version modifiée du logiciel. Essayer de créer un package personnalisé est non seulement plus de travail, mais il peut entrer en conflit avec les packages actuellement créés et distribués. Dans le code open source, cela se produit souvent, surtout si des changements de rupture sont introduits dans les futures versions que vous utilisez.
Supposons que vous utilisez le projet open source FOO qui est actuellement sur la version 2.0.1 et que vous utilisez la version 1.3.0. Vous ne voulez pas utiliser quoi que ce soit au-dessus de cela parce que la version 2.0.0 est incompatible avec ce que vous faites actuellement, mais il y a un seul correctif de bogue dans 2.0.1 dont vous avez désespérément besoin. Cette
make install
option vous permet d'installer le logiciel 1.3.0 modifié sans avoir à vous soucier de créer un package et de l'installer sur votre système.la source
Les distributions Linux séparent généralement la maintenance des programmes de la maintenance des packages. Un système de construction qui intègre la génération de packages obligerait les responsables de programme à effectuer également la maintenance des packages.
C'est généralement une mauvaise idée. Les distributions disposent de nombreuses infrastructures pour vérifier la cohérence interne, fournir des fichiers binaires pour plusieurs plates-formes cibles, effectuer de petites modifications pour mieux s'intégrer au reste du système et fournir une expérience cohérente aux utilisateurs signalant des bogues.
Pour générer des packages directement à partir d'un système de génération, vous devez soit intégrer, soit contourner toute cette infrastructure. L'intégrer représenterait beaucoup de travail pour un bénéfice discutable, et le contourner donnerait une expérience utilisateur pire.
Il s'agit de l'un des problèmes les plus fréquents de la chaîne alimentaire dans les systèmes multipartites. Si vous avez plusieurs systèmes complexes, il doit y avoir une hiérarchie claire de quel système est responsable de la coordination de tous les autres.
Dans le cas de la gestion de l'installation du logiciel, le gestionnaire de package est ce composant, et il exécutera le système de construction du package, puis prendra la sortie via une interface pratique ("fichiers dans un répertoire après une étape d'installation"), générera un package et préparera pour le télécharger dans un référentiel.
Le gestionnaire de packages se trouve au milieu entre le système de construction et le référentiel ici, et est le mieux placé pour bien s'intégrer aux deux.
Vous avez peut-être remarqué qu'il n'y a que quelques-uns des packages JavaScript disponibles via
npm
également disponibles viaapt
- c'est principalement parce que les gens JavaScript l'ont décidénpm
et que le référentiel associé allait être le haut de leur chaîne alimentaire, ce qui l'a rendu presque impossible à expédiez ces paquets en tant que paquets Debian.Avec mon chapeau de développeur Debian allumé: si vous publiez un logiciel open source, veuillez laisser l'emballage aux responsables de la distribution. Cela vous fait économiser beaucoup de travail à vous et à nous.
la source
Eh bien, les développeurs d'applications sont ceux qui savent où chaque fichier doit aller. Ils pourraient laisser cela dans la documentation et demander aux mainteneurs de paquet de le lire et de créer un script pour chaque paquet. Peut-être que les responsables du paquet interpréteront mal la documentation et devront déboguer le script jusqu'à ce qu'il fonctionne. C'est inefficace. Il est préférable que le développeur de l'application écrive un script pour installer correctement l'application qu'il a écrite.
Il pourrait écrire un script d'installation avec un nom arbitraire ou peut-être l'intégrer à la procédure d'un autre script. Cependant, avec une commande d'installation standard
make install
(une convention qui précède les gestionnaires de packages), il est devenu très facile de créer des packages. Si vous regardez le modèle PKGBUILD pour faire des paquets Archlinux , vous pouvez voir que la fonction qui fait réellement les paquets fait simplement unmake DESTDIR="$pkgdir/" install
. Cela fonctionne probablement pour la majorité des packages et probablement plus avec une petite modification. Grâce àmake
(et aux outils automatiques) étant standard, l'emballage est vraiment, vraiment facile.la source