Jestem całkiem nowy w CMake i przeczytałem kilka samouczków o tym, jak go używać, i napisałem kilka skomplikowanych 50 linii skryptu CMake, aby stworzyć program dla 3 różnych kompilatorów. To prawdopodobnie kończy całą moją wiedzę o CMake.
Teraz mój problem polega na tym, że mam kod źródłowy, którego folderu nie chcę dotykać / majstrować podczas tworzenia programu. Chcę, żeby wszystkie CMake i make
pliki wyjściowe i foldery trafiały do tego ../Compile/
, więc zmieniłem kilka zmiennych w moim skrypcie CMake i działało to przez jakiś czas, kiedy zrobiłem coś takiego na moim laptopie:
Compile$ cmake ../src
Compile$ make
Gdzie z tym miałem czysty wynik w folderze, w którym teraz jestem, co jest dokładnie tym, czego szukam.
Teraz przeniosłem się na inny komputer i ponownie skompilowałem CMake 2.8.11.2 i prawie wracam do punktu wyjścia! Zawsze kompiluje to do src
folderu, w którym CMakeLists.txt
znajduje się my .
Część, w której wybieram katalog w moim skrypcie CMake, jest następująca:
set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})
A teraz zawsze kończy się na:
-- Build files have been written to: /.../src
Czy coś mi brakuje?
CMAKE_BINARY_DIR
aniCMAKE_CACHEFILE_DIR
. Co się stanie, jeśli usuniesz wszystkie teset()
połączenia i po prostu to zrobiszcd Compile; rm -rf *; cmake ../src
?Odpowiedzi:
Nie ma potrzeby ustawiania wszystkich zmiennych, które ustawiasz. CMake ustawia je na rozsądne wartości domyślne. Zdecydowanie nie powinieneś modyfikować
CMAKE_BINARY_DIR
aniCMAKE_CACHEFILE_DIR
. Traktuj je jako tylko do odczytu.Najpierw usuń istniejący problematyczny plik pamięci podręcznej z katalogu src:
Następnie usuń wszystkie
set()
polecenia i wykonaj:Dopóki jesteś poza katalogiem źródłowym podczas uruchamiania CMake, nie zmodyfikuje katalogu źródłowego, chyba że CMakeList wyraźnie tego nakazuje.
Gdy już to uruchomisz, możesz sprawdzić, gdzie CMake domyślnie umieszcza rzeczy i tylko jeśli nie jesteś zadowolony z domyślnych lokalizacji (takich jak domyślna wartość
EXECUTABLE_OUTPUT_PATH
), zmodyfikuj tylko te, których potrzebujesz. I starają się wyrazić je w stosunku doCMAKE_BINARY_DIR
,CMAKE_CURRENT_BINARY_DIR
,PROJECT_BINARY_DIR
itd.Jeśli spojrzysz na dokumentację CMake, zobaczysz zmienne podzielone na sekcje semantyczne. Z wyjątkiem bardzo szczególnych okoliczności, należy traktować wszystkie te wymienione w sekcji „Zmienne dostarczające informacji” jako tylko do odczytu wewnątrz CMakeLists.
źródło
rm -rf *
. Nie jest ładnie, jeślicd Compile
zawiedzie ...Compile
, usuń tam wszystko, a następnie uruchom CMake ze ścieżką do katalogu źródłowego”. Zakładam podstawowy zdrowy rozsądek i osąd po części czytelnika.Wygląda na to, że chcesz mieć kompilację poza źródłem . Istnieje kilka sposobów tworzenia kompilacji poza kodem źródłowym.
Rób to, co robiłeś, uciekaj
co spowoduje cmake do generowania drzewa kompilacji w
/path/to/my/build/folder
na drzewie źródłowym w/path/to/my/source/folder
.Po utworzeniu cmake pamięta, gdzie jest folder źródłowy - możesz więc ponownie uruchomić cmake na drzewie kompilacji za pomocą
lub nawet
jeśli twój bieżący katalog jest już folderem kompilacji.
W przypadku CMake 3.13 lub nowszego użyj tych opcji, aby ustawić foldery źródłowe i kompilacji
W przypadku starszego CMake użyj nieudokumentowanych opcji, aby ustawić foldery źródłowe i kompilacji :
który zrobi dokładnie to samo, co (1), ale bez polegania na bieżącym katalogu roboczym.
CMake domyślnie umieszcza wszystkie swoje dane wyjściowe w drzewie budowania , więc jeśli nie korzystasz zbytnio z plików cmake
${CMAKE_SOURCE_DIR}
lub${CMAKE_CURRENT_SOURCE_DIR}
w swoich plikach cmake, nie powinien dotykać twojego drzewa źródłowego .Największą rzeczą, która może się nie udać, jest to, że wcześniej wygenerowałeś drzewo budowania w swoim drzewie źródłowym (tj. Masz kompilację w źródle ). Gdy to zrobisz, zaczyna się druga część (1) powyżej, a cmake nie wprowadza żadnych zmian w źródle ani lokalizacjach kompilacji. Dlatego nie można utworzyć kompilacji poza źródłem dla katalogu źródłowego z kompilacją w źródle . Możesz to dość łatwo naprawić, usuwając (przynajmniej)
CMakeCache.txt
z katalogu źródłowego. Istnieje kilka innych plików (głównie w formacieCMakeFiles
katalogu), które generuje CMake, które również powinieneś usunąć, ale to nie spowoduje, że cmake będzie traktował drzewo źródłowe jako drzewo budowania.Ponieważ kompilacje poza źródłem są często bardziej pożądane niż kompilacje w źródle, możesz chcieć zmodyfikować swoje cmake, aby wymagało kompilacji spoza źródła:
Powyższe makro pochodzi z powszechnie używanego modułu o nazwie
MacroOutOfSourceBuild
. W Google jest wiele źródeł,MacroOutOfSourceBuild.cmake
ale nie mogę znaleźć oryginału i jest wystarczająco krótki, aby go tu zamieścić w całości.Niestety cmake zwykle zapisał kilka plików do czasu wywołania makra, więc chociaż uniemożliwi to wykonanie kompilacji, nadal będziesz musiał usunąć
CMakeCache.txt
iCMakeFiles
.Przydatne może być ustawienie ścieżek, w których zapisywane są pliki binarne, biblioteki współdzielone i biblioteki statyczne - w takim przypadku zobacz, jak mogę umieścić dane wyjściowe cmake w katalogu „bin”? (zastrzeżenie, mam najlepszą głosowaną odpowiedź na to pytanie ... ale tak to wiem).
źródło
-S
nie jest-H
Zamieniam mój komentarz w odpowiedź:
Na wypadek, gdyby ktoś zrobił to, co ja, co rozpoczęło się od umieszczenia wszystkich plików kompilacji w katalogu źródłowym:
CUpewnij będzie umieścić kilka plików budować i pliki pamięci podręcznej (
CMakeCache.txt
,CMakeFiles
,cmake_install.cmake
itp) wsrc
reż.Aby zmienić na kompilację poza kodem, musiałem usunąć wszystkie te pliki. Wtedy mógłbym zrobić to, co @Angew zalecił w swojej odpowiedzi:
źródło
Od CMake Wiki :
Porównaj te dwie zmienne, aby określić, czy została uruchomiona kompilacja poza źródłem
źródło
Nie powinieneś polegać na zakodowanej na stałe nazwie katalogu kompilacji w swoim skrypcie, więc wiersz z
../Compile
musi zostać zmieniony.To dlatego, że od użytkownika powinno zależeć, gdzie skompilować.
Zamiast tego użyj jednej z predefiniowanych zmiennych: http://www.cmake.org/Wiki/CMake_Useful_Variables (poszukaj
CMAKE_BINARY_DIR
iCMAKE_CURRENT_BINARY_DIR
)źródło
CMAKE_CURRENT_BINARY_DIR
zazwyczaj mówi o bieżącej ścieżce budowania binarnego. Prawdopodobnie może być użyty do ustawienia zależnych kompilacji libs / bin.