61 votes

Achèvement bash de la cible du makefile

Supposons que j'ai un fichier makefile simple comme :

hello:
   echo "hello world"

bye:
   echo "bye bye"

Ensuite, dans bash, je veux quelque chose comme :

make h < tab >

afin que cela se complète en :

make hello

J'ai trouvé une façon simple comme créer des fichiers vides hello et bye mais je cherche quelque chose de plus sophistiqué.

90voto

Cibin Joseph Points 884

Ajoutez ceci dans votre fichier ~/.bash_profile ou dans votre fichier ~/.bashrc

complete -W "\`grep -oE '^[a-zA-Z0-9_.-]+:([^=]|$)' ?akefile | sed 's/[^a-zA-Z0-9_.-]*$//'\`" make

Ceci recherche une cible dans votre fichier Makefile intitulé 'Makefile' ou 'makefile' (notez le joker capital ? dans ?akefile) en utilisant grep, et le pipe vers la commande complete dans bash qui est utilisée pour spécifier comment les arguments sont autocomplétés. Le drapeau -W indique que l'entrée de la commande complete sera une liste de mots, ce qui est accompli en passant les résultats de grep à travers sed qui les arrange dans le format souhaitable de liste de mots.

Limitations et pièges :

  1. Votre fichier make s'appelle 'GNUMakefile' ou autre chose que 'Makefile' ou 'makefile'. Si vous rencontrez fréquemment de tels titres, envisagez de modifier l'expression régulière ?akefile en conséquence.

  2. Oublier de sourcer votre fichier ~/.bash_profile ou ~/.bashrc après avoir apporté les modifications. J'ajoute ce détail en apparence trivial car, pour les non-initiés, c'est peu familier. Pour que toute modification apportée à vos fichiers bash prenne effet, sourcer les en utilisant la commande

    source ~/.bashrc

    ou

    source ~/.bash_profile

PS. Vous avez également maintenant la capacité supplémentaire d'afficher les cibles make possibles en appuyant deux fois sur [Tab] comme dans l'autocomplétion bash. Assurez-vous simplement d'ajouter un espace après la commande make avant de taper [Tab] deux fois.

14voto

Kos Points 29125

Cette réponse de 2010 est obsolète - le projet mentionné ici semble avoir été abandonné.

Est-ce que c'est ce que vous cherchez?

http://freshmeat.net/projects/bashcompletion/

En tapant [Tab], vous obtiendrez la complétion sur toutes les cibles dans le Makefile. Ce projet avait pour objectif de produire des routines de complétion programmables pour les commandes Linux/UNIX les plus courantes, réduisant ainsi la quantité de frappe que les administrateurs systèmes et les programmeurs doivent effectuer quotidiennement.

3 votes

Le lien est cassé.

0 votes

@JonasStein merci, je vais supprimer celui-ci car je n'ai pas trouvé de lien alternatif pour ces projets. Il y a beaucoup de réponses plus récentes que la mienne

0 votes

Désolé, je ne peux pas supprimer car c'est accepté. Je vais laisser une note.

14voto

Paul Bissex Points 481

Il existe un package utile appelé bash-completion disponible pour la plupart des systèmes d'exploitation. Il inclut la complétion de Makefile.

(Si vous utilisez macOS et Homebrew, vous pouvez obtenir ceci via brew install bash-completion.)

7 votes

Pour macOS - il y a bash-completion@2 qui entre en conflit directement avec bash-completion. Il est recommandé d'utiliser la version @2 si votre bash >= 4.1. Il ne semble pas y avoir d'achèvement de Makefile inclus, donc l'ajout d'une règle personnalisée dans bashrc comme suggéré dans d'autres réponses pourrait aider.

3voto

mvds Points 26475

Cela semble être la valeur par défaut au moins dans Debian Lenny :

$ grep Makefile /etc/bash_completion
    # make lit d'abord `GNUmakefile', ensuite `makefile', puis `Makefile'
    elif [ -f ${makef_dir}/Makefile ]; then
        makef=${makef_dir}/Makefile
    # avant que nous recherchions des cibles, vérifions si un nom de Makefile était
    # traiter avec les Makefiles inclus

L'en-tête de ce fichier indique :

#   La dernière version de ce logiciel peut être obtenue ici :
#
#   http://bash-completion.alioth.debian.org/
#
#   VERSION : 20080617.5

3voto

Alissa H Points 131

Voici un script de complétion qui examine la déclaration .PHONY:

_make_phony_words() {
  local opt_revert

  if [ -n "${BASH_VERSION:-}" ]; then
    shopt -q nullglob || {
      opt_revert=1 ; shopt -s nullglob ;
    }

  elif [ -n "${ZSH_VERSION:-}" ]; then
    [[ -o nullglob ]] || {
      opt_revert=1 ; setopt nullglob
    }
  fi

  for f in ./?akefile ./*.make ; do
    sed -nEe '/^.PHONY/ { s/^.PHONY:[ ]?// ; p ; } ' "$f" | tr ' ' $'\n' | sort -u
  done

  if [ -n "$opt_revert" ]; then

    [ -n "${ZSH_VERSION:-}" ] && unsetopt nullglob
    [ -n "${BASH_VERSION:-}" ] && shopt -u nullglob
  fi
  unset opt_revert

}

_make_phony_complete() {
  local cur="${COMP_WORDS[COMP_CWORD]}"

  COMPREPLY+=( $(compgen -W "$( _make_phony_words )" -- ${cur}) )

}
complete -F _make_phony_complete make

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X