Це здається, що ви хочете зібрати джерело . Є кілька способів створити збірку з вихідного коду.
Робіть те, що ви робили, бігайте
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
що призведе до CMake для створення збірки дерева в /path/to/my/build/folder
для дерева вихідних текстів в /path/to/my/source/folder
.
Після створення файлу cmake запам'ятовує, де знаходиться папка вихідного коду - так що ви можете повторно запустити cmake на дереві збірки за допомогою
cmake /path/to/my/build/folder
або навіть
cmake .
якщо ваш поточний каталог вже папка збірки.
Для CMake 3.13 або новішої версії використовуйте ці параметри для встановлення джерела та створення папок
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Для старих CMake використовуйте деякі незадокументовані параметри для встановлення джерела та створення папок :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
який буде робити те саме, що і (1), але без опори на поточний робочий каталог.
CMake за замовчуванням розміщує всі свої результати у дереві збірки , тому, якщо ви не використовуєте вільно ${CMAKE_SOURCE_DIR}
або ${CMAKE_CURRENT_SOURCE_DIR}
у своїх файлах cmake, він не повинен торкатися вашого вихідного дерева .
Найголовніше, що може піти не так, якщо ви раніше створили дерево збірки у своєму вихідному дереві (тобто у вас є збірка у джерелі ). Як тільки ви це зробите, друга частина (1) вище починається, а cmake не вносить жодних змін у джерело та місця розташування. Таким чином, ви не можете створити збірку без вихідних даних для вихідного каталогу із збіркою в джерелі . Ви можете це виправити досить легко, видаливши (як мінімум) CMakeCache.txt
з вихідного каталогу. Є кілька інших файлів (в основному в CMakeFiles
каталозі), які CMake генерує, що ви також повинні видалити, але вони не спричинять cmake трактувати вихідне дерево як дерево збірки.
Оскільки збірки без вихідних джерел часто є більш бажаними, ніж збірки в джерелах, ви можете змінити свій cmake, щоб вимагати збірок з джерела:
# 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."
)
Вищевказаний макрос походить від часто використовуваного модуля, який називається MacroOutOfSourceBuild
. У Google є чимало джерел, MacroOutOfSourceBuild.cmake
але я не можу знайти оригінал, і він досить короткий, щоб включити сюди повністю.
На жаль, cmake зазвичай записує кілька файлів до моменту виклику макросу, тому, хоча це не дозволить вам реально виконати збірку, вам все одно потрібно буде видалити CMakeCache.txt
та CMakeFiles
.
Вам може бути корисно встановити шляхи, до яких записуються бінарні файли, спільні бібліотеки та статичні бібліотеки - у такому випадку дивіться, як я можу зробити висновок cmake у din 'dir? (відмова, у мене є відповідь на це питання, але я знаю про це).
CMAKE_BINARY_DIR
абоCMAKE_CACHEFILE_DIR
. Що станеться, якщо ви видалите всі ціset()
дзвінки і просто зробитеcd Compile; rm -rf *; cmake ../src
?