7
votes

Invoquant Makefile dans le répertoire racine du projet du sous-répertoire d'EMACS

J'ai un makefile dans le répertoire racine du projet. Si je modifie un fichier dans un sous-répertoire, comment puis-je invoquer faire de EMACS? M-x Compiler Make ne fonctionnera pas car il recherche le makefile dans le répertoire actuel. Mais j'ai le maquillage dans le répertoire racine du projet.

Toutes les pensées?

Edit

Comme suggéré, make -fletpath_to_makefile a fait le tour. Mais j'inclus Certains incluent dans le maquillage comme incluent " tests / module.mk " qui ont échoué. Il recherche un répertoire " tests " dans le sous-répertoire. Cela peut être résolu en spécifiant un chemin parfaitement qualifié dans le maquillage. Mais je ne pense pas que ce soit une bonne solution. Toute meilleure approche?


0 commentaires

10 Réponses :


1
votes

Lorsque j'utilise Emacs pour compiler, le minibuffer ressemble à quelque chose comme ça;

faire -k

Et j'ajouterai simplement un texte que j'aime, tel que -f ../../root/makefile. Cela pourrait fonctionner pour vous.

marque


1 commentaires

L'interrupteur -f a fait l'affaire. Mais dans le maquillage, j'en ai une partie indique comme "Inclure les tests / module.mk" et se plaint de ne pas trouver le répertoire "Tests". Il recherche des "tests" dans le sous-répertoire. On dirait donc que je dois utiliser un chemin parfaitement qualifié partout. Merci pour la réponse.



1
votes

Je ne suis pas une grande partie d'un utilisateur Emacs, mais pourriez-vous passer à make -c ../ ou si de nombreux répertoires vous devez aller?


3 commentaires

Cela fonctionnera faire dans le répertoire racine. APPU veut exécuter faire dans le répertoire local à l'aide du makefile dans le répertoire racine.


Je soupçonne fortement que ce n'est pas ce que l'appu veut vraiment, comme un makefile qui ne fonctionne que lorsque pas à partir de son propre répertoire est limite insensée. C'est la technique appropriée pour faire fonctionner des fabricants de "ailleurs".


1) Personne (avant que vous) a suggéré un maquillage qui ne fonctionne que lorsque pas court de son propre répertoire. 2) Ce n'est pas le moyen de gérer des fabricants d'ailleurs - essayez-le.



6
votes

Le mx compile La fonction lève les compile-commande-variable-variable que vous pouvez remplacer sur la promt - alors remplaclez-le avec quelque chose comme xxx < / pré>

et laisser fonctionner.

J'utilise aussi souvent un en-tête de fichier (en ligne 1) telle que xxx

que vous pouvez Généraliser à volonté avec différentes options. Après rechargement du fichier, M-x compile exécutera votre commande Compile personnalisée que je trouve assez utile.


2 commentaires

Super. J'ai fait cela fonctionnant. Ajouté "(SETQ Compile-Commande" (CD ~ / FullPath_To_Project_root / && make && CD -) ")" Dans le fichier .emacs. On dirait que je devra peut-être essayer EDE et définir des commandes spécifiques au projet. Mais cela suffit pour le moment. Merci encore.


En fait, je préfère compiler la commande dans chaque fichier source. De cette façon, ils sont définis lorsqu'ils sont chargés - parfait dans un répertoire comme ~ / cpp / mos / où j'ai peut-être besoin de renforcer les fichiers de test, qt pour d'autres, etc pp. Mais si vous avez toujours besoin de la même commande de compilée, ~ / .emacs est valable aussi bien.



2
votes

J'utilise EDE (de Cedet) pour définir des projets et stocker des commandes de compilation dans la définition du projet. Recherchez-vous à My Config pour des exemples : Lines 105-133 - Exemples de projets, lignes 135-165 - Code, qui définit les fonctions de compilation et les lignes 168-189 - Fonctions pour différents types de projets - standard (compilez à partir du répertoire racine) et cmake ( compilation dans le répertoire séparé)


1 commentaires

Merci. Malheureusement, EDE ne fonctionne pas à ma fin. Je ne peux pas voir le menu du projet. J'ai déjà suivi votre article mais cela n'a pas aidé à l'EDE.



0
votes

Ceci devrait le faire:

make -f path_to_rootdir/Makefile -I path_to_rootdir/tests


3 commentaires

Cela peut fonctionner, mais tous les outils gérés par la marque vont avoir leur répertoire de travail placé quelque part autre qu'eux attendu. La technique appropriée est l'option -c, en tant que détails OPELLO ci-dessous. Ou mettre une commande de CD dans la commande de compilation M-x elle-même, comme Dirk explique ci-dessus.


Argument sans preuve. Vérifiez simplement la page d'homme si vous ne me croyez pas; L'argument -f spécifie le makefile, il ne modifie pas le répertoire de travail. L'option -i est un piratage pour contourner ce problème pour se faire , mais pas l'un des processus qu'elle reproche. S'ils ont des dépendances sur la CWD (la plupart le font), ils ne vont pas travailler correctement.


Oui, -f Spécifie le maquillage, comme je l'ai dit . Oui, cela ne change pas le répertoire de travail, ce que nous essayons de . L'utilisation de -c ou de CD entraînera la construction échoue, comme cela a expliqué . Les processus engendrés agiront dans l'annuaire local, comme ils devraient . Dois-je continuer?



0
votes

Démarrer avec M-x compile RET . Lorsqu'il invite une commande, entrez simplement cd / chemin / à / root && créer et appuyez sur le retour. Cette commande fonctionne pour toutes les variantes de marque et gère le problème "Makefile Inclus" sans aucun drapeau supplémentaire.

La prochaine fois que vous tapez M-x compile RET , cette nouvelle chaîne sera présentée comme par défaut, de sorte que vous ne devez donc enregistrer de retour. Sur les chances hors probils que vous compilez activement plusieurs projets dans EMACS, vous pouvez utiliser MP et mn pour vous déplacer en arrière et en avant à travers l'historique de compilation COMAMNDS.


2 commentaires

Merci. J'ai ajouté que sur le fichier d'initialisation EMACS et que tout fonctionne maintenant.


Mon point était que vous n'avez pas besoin de faire des personnalisations .emacs. Cependant, il existe plusieurs solutions à chaque problème d'emacs, donc si vous avez trouvé quelque chose qui fonctionne, c'est assez bon.



1
votes

Après un certain temps de tentatives différentes de faire fonctionner EDE fonctionner comme je le voulais, je suis allé pour . Dir-locals.el :

(((C ++ - mode. ((COMPILE-COMMANDER. "MAKE -C ../Build -J2 Peu importe")))))

Je l'ai trouvé légèrement mieux pour moi que d'avoir un // - * - - * - dans un en-tête de chaque fichier, et tout un lot mieux que de spécifier dans mon init.el (ou toute autre configuration) ces ede-cpp-root-projet avec des chemins complets vers des projets, que je crée trop souvent ou déplacez tout soudain:)

bel ajout au schéma était CUKEFERRER"> CMAKE qui fait des erreurs de compilation pour être "correctement blanchi" car il utilise Chemins complets dans des maquillages générés.


0 commentaires

3
votes

(J'utilise des scons, mais le principe est identique. Changer de sconstrique pour faire jouer et scand à faire ...)

J'ai personnalisé par .emacs afin qu'il compilait toujours le projet contenant le fichier de la mémoire tampon actuel, Cependant, profondément imbriqué; Il recherche vers le haut pour le premier scâteur et utilise cela, car c'est le répertoire racine de projet. P>

Voici quelques fonctions qui recherchent la hiérarchie de répertoire à la recherche de sconstrique. P>

(concat "cd " (project-root) " && scons")


2 commentaires

Merci! J'utilise des scons au travail mais je suce à Elisp, et cela fonctionne magnifiquement pour moi.


Pourquoi ne pas utiliser (localiser-dominant-fichier "." "Sconstructeur") ?



2
votes

Une autre alternative consiste à définir la variable compilation-processus-configuration-configuration de la compilation forte> qui est documentée comme suit:

fonction pour appeler pour personnaliser le processus de compilation. Cette fonction est appelé immédiatement avant le début du processus de compilation. Ce peut être utilisé pour définir toutes les variables ou fonctions utilisées lors de Traitement de la sortie du processus de compilation. La fonction est appelé avec variables compilation-tampon 'et code> compilation-fenêtre' liée au tampon de compilation et à la fenêtre, respectivement. p> BlockQuote>

J'utilise Maven Botrot et j'ai écrit cette bibliothèque pour soutenir votre problème pour un contexte maven. Dans ce qui suit, changez la valeur de la variable Compile-Search-Fichier Strong> selon le cas: P>

;;; Support for Maven 2

(require 'compile)

(setq compile-search-file "pom.xml")

(defun find-search-file ()
  ;; Search for the pom file traversing up the directory tree.
  (setq dir (expand-file-name default-directory))
  (let ((parent (file-name-directory (directory-file-name dir))))
    (while (and (not (file-readable-p (concat dir compile-search-file)))
        (not (string= parent dir)))
      (setq dir parent
        parent (file-name-directory (directory-file-name dir))))
    (if (string= dir parent)
    (error "Search file %s is missing" compile-search-file)
      (with-current-buffer compilation-last-buffer
    (message "Test %s %s." compilation-buffer compilation-window)
    (setq default-directory dir)))))

;; Add the following to support Emacs' compile mode:
(add-to-list
 'compilation-error-regexp-alist-alist
 '(mvn "^\\(.*\\):\\[\\([0-9]*\\),\\([0-9]*\\)\\]" 1 2 3))
(add-to-list 'compilation-error-regexp-alist 'mvn)

(setq compilation-process-setup-function 'find-search-file)

(provide 'maven-support)


0 commentaires

1
votes

Je viens de commencer à travailler sur une solution plus générique, extensible et robuste mais robuste encore raisonnablement rapide et sale que je viens de créer. Il est quelque peu basé sur l'exemple maven ci-dessus, mais je préfère ne pas vous brouiller avec des variables globales, donc j'utilise les formes spéciales ou que les formes spéciales. Et bien sûr, il utilise make.

À l'heure actuelle, il ne prend en charge que des fabricants de fabricants, mais vous pouvez ajouter une clause au formulaire spécial (Cond) dans la fonction `My-compilation-Process-Fonction de configuration» si vous souhaitez prendre en charge un ou plusieurs systèmes de construction supplémentaires supplémentaires. < / p>

Il a même des chaînes Doc!

vous le verrez à Mon GitHub finalement.


0 commentaires