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 em> de EMACS? M-x Compiler Make em> 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. p>
Toutes les pensées? p>
Edit p>
Comme suggéré, make -fletpath_to_makefile em> a fait le tour. Mais j'inclus Certains incluent dans le maquillage comme incluent " tests / module.mk em>" qui ont échoué. Il recherche un répertoire " tests em>" 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? P>
10 Réponses :
Lorsque j'utilise Emacs pour compiler, le minibuffer ressemble à quelque chose comme ça; p>
faire -k p>
Et j'ajouterai simplement un texte que j'aime, tel que -f ../../root/makefile. Cela pourrait fonctionner pour vous. P>
marque p>
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.
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? P>
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 i> à 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 i> court de son propre répertoire. 2) Ce n'est pas le moyen de gérer des fabricants d'ailleurs - essayez-le.
Le et laisser fonctionner. p> J'utilise aussi souvent un en-tête de fichier (en ligne 1) telle que p> que vous pouvez Généraliser à volonté avec différentes options. Après rechargement du fichier, mx compile code> La fonction lève les
compile-commande-variable-variable code> que vous pouvez remplacer sur la promt - alors remplaclez-le avec quelque chose comme
M-x compile code> exécutera votre commande Compile personnalisée que je trouve assez utile. P> p>
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.
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é) p>
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.
Ceci devrait le faire:
make -f path_to_rootdir/Makefile -I path_to_rootdir/tests
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 B>, 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 i>. Oui, cela ne change pas le répertoire de travail, ce que nous essayons de i>. L'utilisation de -c ou de CD entraînera la construction échoue, comme cela a expliqué i>. Les processus engendrés agiront dans l'annuaire local, comme ils devraient i>. Dois-je continuer?
Démarrer avec La prochaine fois que vous tapez M-x compile RET code>. Lorsqu'il invite une commande, entrez simplement
cd / chemin / à / root && créer code> 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. P>
M-x compile RET code>, 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 code> et
mn code> pour vous déplacer en arrière et en avant à travers l'historique de compilation COMAMNDS. P >
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.
Après un certain temps de tentatives différentes de faire fonctionner EDE fonctionner comme je le voulais, je suis allé pour Je l'ai trouvé légèrement mieux pour moi que d'avoir un 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. P> (((C ++ - mode. ((COMPILE-COMMANDER. "MAKE -C ../Build -J2 Peu importe"))))) Code> P>
// - * - - * - code> 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 code> avec des chemins complets vers des projets, que je crée trop souvent ou déplacez tout soudain:) p>
(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")
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") code>?
Une autre alternative consiste à définir la variable 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 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
compilation-tampon 'et code> compilation-fenêtre'
liée au tampon de compilation et à la fenêtre, respectivement. p>
BlockQuote>
;;; 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)
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. P>
À 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! p>
vous le verrez à Mon GitHub finalement. P>