Un employé de Red Hat a présenté le système d'assemblage des Objectifs. Sortie de GNU Make 4.2

Richard WM Jones, auteur libguestfs, travaillant chez Red Hat, представил nouvel utilitaire d'assemblage Objectifs, visant à éliminer les lacunes et les problèmes liés à l'utilité de make tout en conservant la simplicité et la compréhensibilité globales des scripts. L'utilitaire make a été conçu en 1976 et présente un certain nombre de défauts conceptuels ; Goals prévoit d'éliminer ces défauts sans changer le concept général.
Code source des objectifs distribué par sous licence GPLv2+.

Problèmes résolus:

  • Prise en charge d'une seule tactique de résolution de dépendances : "l'instruction d'assemblage est exécutée si le fichier cible est manquant ou est plus ancien que l'une des dépendances". Goals prévoit de mettre en œuvre d'autres tactiques, telles que vérifier la présence d'une URL, comparer les heures de modification avec n'importe quel fichier, évaluer le package intégré. qui, comparaison des sommes de contrôle, exécution de cas de test avec saut sélectif de tests.
  • Lors du traitement des cibles de build, make ne sépare pas les fichiers et les noms de règles et, par conséquent, il n'y a aucune vérification que lors de l'exécution d'une règle, le fichier qu'elle prétend être créé sera réellement créé. Par exemple, si vous avez une règle appelée "test" qui exécute des scripts avec des tests, un fichier nommé "test" est accidentellement créé, alors les tests ne seront plus appelés, puisque make considérera que la cible est construite et ne nécessite pas n'importe quelle action (pour contourner le problème dans make, vous pouvez spécifier la directive « .PHONY : test »). Les objectifs séparent explicitement les fichiers et les noms de règles.

    Un employé de Red Hat a présenté le système d'assemblage des Objectifs. Sortie de GNU Make 4.2

  • Problème avec la fourniture d'un seul paramètre pour les instructions d'assemblage.

    Un employé de Red Hat a présenté le système d'assemblage des Objectifs. Sortie de GNU Make 4.2

    Goals vous permet d'utiliser un nombre arbitraire de paramètres nommés. Par exemple, vous pouvez extraire séparément le signe d'un fichier de débogage du nom :

    Un employé de Red Hat a présenté le système d'assemblage des Objectifs. Sortie de GNU Make 4.2

  • Problèmes d'interaction avec l'interpréteur shell. Par exemple, la nécessité de contrôler l'échappement des espaces dans les noms de fichiers et de répertoires, le gaspillage de ressources lors du lancement d'un interpréteur shell distinct lors de l'exécution de chaque commande, la double interprétation du caractère « $ » (utilisé à la fois dans le shell et dans make), en tenant compte des indentations.

    Ces problèmes sont résolus dans Goals en utilisant le symbole « % » au lieu de « $ » pour les variables d'assemblage (« $ » reste uniquement pour le shell), à l'aide d'un analyseur. LALR(1), ce qui vous oblige à entourer les chemins et les noms de fichiers de guillemets et à mettre en surbrillance les blocs de code avec des accolades. L'ensemble du bloc de commande est lancé dans une instance du shell de commande et, à l'intérieur du bloc, le formatage de code arbitraire est autorisé, sans référence à des espaces spéciaux.

    C'était:
    cible : foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    C'est devenu:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Autres fonctionnalités des objectifs :

  • Prise en charge facultative pour la spécification de noms et de paramètres arbitraires :

    objectif tout = : "cible"

    lien d'objectif =
    "cible" : "foo.o", "bar.o" { ... }

    objectif compiler (nom) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Deux modes de lancement : le mode création pour faire correspondre les cibles de construction avec les noms de fichiers (par exemple, le fichier "foo.o" correspond à la cible "%name.o") et le mode de compilation directe :

    objectif tout = : lien

    lien d'objectif =
    "cible" : "foo.o", compile ("bar") { ... }

    objectif compiler (nom) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Les tactiques d'assemblage sont déterminées par des règles spéciales qui peuvent être utilisées pour déterminer la nécessité de réassembler une cible d'assemblage. Si un lien est établi avec la présence d'un fichier, celui-ci est explicitement déterminé par le signe correspondant (« cible » pour le nom de la règle et *fichier (« cible ») pour la vérification du fichier).

    "cible" : "foo.o", "bar.o" { ... }

    *file("target") : *file("foo.o"), *file("bar.o") { ... }

  • Le développeur peut définir des attributs arbitraires des tactiques d'assemblage. L'indicateur "*file" est défini par défaut (@{...} indique la suppression de la sortie, et "exit 99" signale la nécessité d'une reconstruction) :

    tactique *file (nom de fichier) = @{
    test -f %nom de fichier || sortie 99
    pour f en %

    Source: opennet.ru

Ajouter un commentaire