Jak korzystać z CMAKE_INSTALL_PREFIX

97

Chcę wygenerować plik Makefile z miejscem docelowym instalacji, wykonując instalację w / usr zamiast domyślnego / usr / local. Zakładając, że katalog budowania jest wykonany w podkatalogu źródłowym, wykonuję:

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

CMakeCache.txt zawiera: CMAKE_INSTALL_PREFIX:PATH=/usr(OK?)

Teraz wykonuję:

robić
dokonać instalacji

Wszystkie pliki są nadal instalowane w usr / local. Co jest nie tak?

Edycja: nie ma CMAKE_INSTALL_PREFIX w żadnym z plików projektu CMakeLists.txt. Przed uruchomieniem cmake usuwam wszystko z katalogu wyjściowego. dyrektywy instalacji w CMakeLists.txt wyglądają następująco:

install(TARGETS mylibrary DESTINATION lib)

Alex F.
źródło

Odpowiedzi:

30

Istnieją dwa sposoby korzystania z tej zmiennej:

  • przekazanie go jako argumentu wiersza poleceń, tak jak wspomniał Job:

    cmake -DCMAKE_INSTALL_PREFIX=< install_path > ..

  • przypisanie mu wartości w CMakeLists.txt:

    SET(CMAKE_INSTALL_PREFIX < install_path >)

    Ale pamiętaj, aby umieścić go PRZED PROJECT(< project_name>) komendą, w przeciwnym razie nie zadziała!

ryan_tu
źródło
4
Dziwne, instrukcja SET () działa dla mnie tylko wtedy, gdy umieszczę ją PO instrukcji PROJECT () (CMake 2.8).
AstroFloyd
2
Ta odpowiedź i odniesienie, do którego prowadzi, bardziej bezpośrednio omawia problem z poleceniem projektu () przed / po.
Craig Scott
Co to za PROJECTpolecenie i jak mieć cmakeprzed nim tę opcję? Miałbyś przykład?
Stephane
6

Ale pamiętaj, aby umieścić go PRZED PROJEKTEM (<nazwa_projektu>), w przeciwnym razie nie zadziała!

Mój pierwszy tydzień używania cmake - po kilku latach autotools GNU - więc wciąż się uczę (lepiej niż pisanie makr m4), ale myślę, że modyfikacja CMAKE_INSTALL_PREFIX po ustawieniu projektu jest lepszym miejscem.

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
project (BarkBark)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")

Pierwsze uruchomienie (bez pamięci podręcznej)

CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- The C compiler identification is GNU 4.4.7
-- etc, etc,...
CIP = /usr/local (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Drugi bieg

CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Daj mi znać, jeśli się mylę, mam dużo do zrobienia. To zabawne.

Jim
źródło
Spróbuj użyć FORCE, gdy wykonujesz SET: set (CMAKE_INSTALL_PREFIX / foo / bar / bubba CACHE PATH "Cmake prefix" FORCE)
Jav_Rock,