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
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
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ą
cmake /path/to/my/build/folder
lub nawet
cmake .
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
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
W przypadku starszego CMake użyj nieudokumentowanych opcji, aby ustawić foldery źródłowe i kompilacji :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
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:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
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
i CMakeFiles
.
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).
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
?