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.
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 doC-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.
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ę ../
.
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:
Należy sprawdzić, czy bieżący projekt korzysta z CMake, skanując katalog źródłowy przed hakowaniem
compile-command
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ż:
-
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 "
Jak korzystam ze strategii out-of-source to skomplikowane. Na przykład, mogę zbudować tylko jeden komponent używając out-of-source.
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....
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.
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
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
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