konfiguracja Emacsa dla cmake

Gcc 4.4.2 cmake 2.6

Właśnie zacząłem używać cmake. Pisząc własne pliki Makefile.

Jednak mam tę strukturę katalogów i używam kompilacji out-of-source. Aby oddzielić pliki źródłowe od plików kompilacji.

project
    src
        my_c_files.c
        CMakeLists.txt
    build
        Makefile

Zanim napisałem własne pliki Makefile w katalogu src, a następnie wcisnąłem F5 i udało mi się skompilować mój program. A emacs wyświetli wszelkie ostrzeżenia lub błędy. Jednak wydaje się, że muszę otworzyć terminal i przejść do budowy katalog do uruchomienia

cmake ../src

A następnie

make

Chciałbym uruchomić make z Emacsa tak samo jak naciśnięcie F5. Ale jako plik Makefile został wygenerowany w katalogu build, a emacs szuka go w katalogu src.

Nawet gdy ustawiam soft link do pliku Makefile w katalogu src aby link do pliku Makefile w katalogu build. Wszystko to dało mi listę błędów.

 22
Author: Aaron Hall, 2010-01-23

7 answers

Dokładnie w tym samym celu znalazłem .dir-locals.el jako niezwykle pomocny, oto jak jeden z moich wygląda:

((nil . ((tab-width . 8)
     (indent-tabs-mode . t)))
 (c++-mode . ((c-basic-offset . 8)
          (tab-width . 8)
          (indent-tabs-mode . t)
          (compile-command . "make -C ../build -j 2 run_tests")))
 ((c-mode . ((c-basic-offset . 8)
         (tab-width . 8)
         (indent-tabs-mode . t)
         (compile-command . "make -C ../build -j 2 run_tests")))))

Oczywiście mogę mieć ścieżki określone w różnych .dir_locals.el w zależności od ich lokalizacji i takich, powiedzmy jakieś build {[5] } do testu jednostkowego, niektóre budować prawdziwy cel i tak dalej.

Następnie umieszczam atrapę makefile w katalogu build, który wygląda tak:

all: run_tests

run_tests:
    @cmake ..
    @make -j 2

W ten sposób mogę dokonać kasy i po prostu uruchomić M-x compile w dowolnym pliku, który mi się podoba i to postąpi słusznie. Używam git i mam ten plik Makefile ignorowany z monitorowania przez git tak:

git update-index --assume-unchanged Makefile

I jeśli chcę zmodyfikować i zatwierdzić to robię

git update-index --no-assume-unchanged Makefile.

W ten sposób nowo utworzony przez cmake Makefile nie pojawi się w git status jako zmodyfikowany, a ja nie popełnię go przypadkowo.

Korzyści z tego podejścia:

  • Ponieważ cmake używa ścieżek absolutnych wewnętrznie, nie ma absolutnie żadnego problemu ze skokiem przez błędy kompilacji w buforze kompilacji po prostu naciskając enter na nich.

  • Możesz określić dowolne reguły wcięć i mogą się one różnić w różnych projektach lub nawet katalogach, jeśli chcesz :)

  • Możesz określić dowolną ilość celów, które chcesz w różnych projektach, nawet katalogach, nadal używać tego samego starego M-x compile (mam to przypisane do C-c b) i zmusić Emacsa do zrobienia właściwej rzeczy.

Jedyny wadą jest posiadanie .dir-locals.el w podkatalogach, co nie wydaje mi się złe.

EDIT: robUK, aby odpowiedzieć na twój komentarz:

Oto dokumentacja dla zmiennych lokalnych dla katalogów , Jak to nazywają w instrukcji Emacsa. Nie jest to pakiet, jest częścią Emacsa, chociaż nie jestem pewien, czy był dostępny w wersjach przed 23, używam 23.1.1.

EDIT2: liwp, aby odpowiedzieć na twoje pytanie:

Jak już zauważył Karol, i jak mówi dokumentacja:

Jeśli umieścisz plik o specjalnej nazwie .dir-miejscowi.el w katalogu, Emacs odczyta go, gdy odwiedzi dowolny plik w tym katalogu lub którymkolwiek z jego podkatalogach, i zastosować ustawienia określa do bufora pliku. Emacs szuka .dir-miejscowi.el począwszy od katalogu odwiedzanego pliku, i przesuwając się w górę drzewo katalogów. (Aby uniknąć spowolnienia, to wyszukiwanie jest pomijane dla zdalnego pliki.)

You don ' t potrzebujesz .dir-locals.el wszędzie w drzewie projektu. Zauważ jednak, że prawdopodobnie zależy to od złożoności struktury bazy kodu.

Normalnie wybrałbym dość prosty layout jak ten:

/project_root_dir
    /build
    /src
    /test

I miałbym nieco inne cele określone w różnych .dir-locals.el, powiedzmy w /test zbudowałbym tylko testrunner i zleciłbym ich wykonanie, poświęciłbym większość czasu na budowanie tego celu. Wtedy w /src najpierw zbudowałbym to samo testrunner, zleciłbym jego wykonanie, a jeśli wszystko idzie dobrze, to zbuduje mi mój główny cel projektu. Jeśli tego nie potrzebujesz, możesz mieć tylko jeden .dir-locals.el poniżej /project_root_dir. Jeśli twoja struktura źródłowa i wymagania są o wiele bardziej wyrafinowane, może to oznaczać, że potrzebujesz nieco więcej kreatora związanego z ścieżkami i celami.

 24
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-01 16:06:49

Bardziej ogólnym rozwiązaniem dla polecenia compile byłoby:

cd ${PWD%/src/*}/build && cmake ../src && make

Zmienna środowiskowa PWD przechowuje katalog, w którym znajduje się edytowany plik; rozszerzenie go za pomocą %/src/* spowoduje powrót do katalogu głównego projektu bez martwienia się o liczbę ../.

 9
Author: Porculus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-30 21:12:21

Proste rozwiązanie: zainstaluj cpputils-cmake , wtedy możesz zaczynać.

Wyjaśnienie: CMake już umieścił wszystkie informacje w katalogu budowania. Wystarczy zhakować zmienną ELisp {[0] } w swoich c++-mode-hook i c-mode-hook, jeśli uzyskasz odpowiednie informacje z cmake.

Dwa punkty za idealne rozwiązanie:

  1. Należy sprawdzić, czy bieżący projekt korzysta z CMake, skanując katalog źródłowy przed hakowaniem compile-command

  2. Pełna ścieżka do katalogu zbudowanego poza źródłem powinna być automatycznie wykryta i dołączona do polecenia make -C.

Napisałem wtyczkę do Emacsacpputils-cmake https://github.com/redguardtoo/cpputils-cmake który rozwiąże te dwa problemy. Sprawdź mój kod i możesz go zainstalować za pomocą menedżera pakietów Emacsa.

BTW, Po utworzeniu katalogu kompilacji przez cmake, Zwykle cmake nie powinien być jawnie wywoływany w wierszu poleceń. {[6] } jest wystarczająco inteligentny, ponieważ Makefile w tym katalogu i tak wywoła cmake. Nawet po zmianie Cmakelistów.txt, wywołanie make -C out-of-source-build-dir wciąż wystarczy. Jestem tego prawie pewien, ponieważ używam cmake od czterech lat.

Wiele poprzednich odpowiedzi nie zadziała, ponieważ:

  1. Każde założenie dotyczące układu drzewa źródłowego może być błędne. Na przykład, nazwałem mój główny katalog źródłowy "mysrc" zamiast " src "

  2. Jak korzystam ze strategii out-of-source to skomplikowane. Na przykład, mogę zbudować tylko jeden komponent używając out-of-source.

 5
Author: chen bin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 07:08:56

Używam EDE z Cedet do konfigurowania projektów do pracy z CMake. Spójrz w mój CEDET config, zaczynając od linii 105, na przykład kodu do konfiguracji projektu. Używam osobnych katalogów debugowania i Wydania dla różnych kompilacji i domyślnie kompilacja działa tylko w trybie debugowania....

 4
Author: Alex Ott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 16:14:13

Możesz zmienić bieżący katalog roboczy, którego używa emacs z M-x cd<enter> <path to build dir><enter>. Po tym, kiedy biegniesz M-x compile, make zostanie uruchomiony w nowym katalogu roboczym. Jest to dokładnie to samo, co uruchamianie make na terminalu w katalogu budowania, więc powinno działać dobrze.

 2
Author: liwp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 13:37:00

Może użyjesz opcji-C Dla make ?

Naciśnij F5 , lub M-x compile, gdy emacs zapyta polecenie kompilacji, wpisz:

make -C ../build
 2
Author: remi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 11:33:56

Zmień polecenie na bezwzględne zamiast względnego pat. EG:

cmake ~/workspace/project/src && make
 1
Author: David Oneill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-01 15:04:07