Có vẻ như bạn muốn một bản dựng ngoài nguồn . Có một số cách bạn có thể tạo bản dựng ngoài nguồn.
Làm những gì bạn đang làm, chạy
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
mà sẽ gây cmake để tạo ra một cây xây dựng trong /path/to/my/build/folder
cho cây nguồn trong /path/to/my/source/folder
.
Khi bạn đã tạo xong, cmake sẽ nhớ thư mục nguồn nằm ở đâu - vì vậy bạn có thể chạy lại cmake trên cây xây dựng với
cmake /path/to/my/build/folder
hoặc thậm chí
cmake .
nếu thư mục hiện tại của bạn đã là thư mục xây dựng.
Đối với CMake 3.13 trở lên, hãy sử dụng các tùy chọn này để đặt nguồn và tạo thư mục
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Đối với CMake cũ hơn, hãy sử dụng một số tùy chọn không có tài liệu để đặt nguồn và tạo thư mục :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
sẽ thực hiện chính xác điều tương tự như (1), nhưng không phụ thuộc vào thư mục làm việc hiện tại.
CMake đặt tất cả các đầu ra của nó trong cây xây dựng theo mặc định, vì vậy trừ khi bạn đang sử dụng tự do ${CMAKE_SOURCE_DIR}
hoặc ${CMAKE_CURRENT_SOURCE_DIR}
trong các tệp cmake của mình, nó sẽ không chạm vào cây nguồn của bạn .
Điều lớn nhất có thể xảy ra là nếu trước đó bạn đã tạo một cây xây dựng trong cây nguồn của mình (tức là bạn có một bản dựng trong nguồn ). Khi bạn đã hoàn thành việc này, phần thứ hai của (1) ở trên sẽ bắt đầu và cmake không thực hiện bất kỳ thay đổi nào đối với nguồn hoặc vị trí xây dựng. Do đó, bạn không thể tạo một bản dựng ngoài nguồn cho một thư mục nguồn với một bản dựng trong nguồn . Bạn có thể sửa lỗi này khá dễ dàng bằng cách xóa (tối thiểu) CMakeCache.txt
khỏi thư mục nguồn. Có một số tệp khác (chủ yếu trong CMakeFiles
thư mục) mà CMake tạo ra mà bạn cũng nên xóa, nhưng những tệp này sẽ không khiến cmake coi cây nguồn là cây xây dựng.
Vì các bản dựng ngoài nguồn thường được mong muốn hơn các bản dựng trong nguồn, bạn có thể muốn sửa đổi bản dựng của mình để yêu cầu các bản dựng ngoài nguồn:
# 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."
)
Macro trên đến từ một mô-đun thường được sử dụng có tên MacroOutOfSourceBuild
. Có rất nhiều nguồn MacroOutOfSourceBuild.cmake
trên google nhưng tôi dường như không thể tìm thấy tài liệu gốc và nó đủ ngắn để đưa vào đây đầy đủ.
Thật không may, cmake thường ghi một vài tệp vào thời điểm macro được gọi, vì vậy mặc dù nó sẽ ngăn bạn thực sự thực hiện xây dựng, bạn vẫn sẽ cần phải xóa CMakeCache.txt
và CMakeFiles
.
Bạn có thể thấy hữu ích khi đặt các đường dẫn mà tệp nhị phân, thư viện được chia sẻ và thư viện tĩnh được ghi vào - trong trường hợp đó, hãy xem cách tôi tạo đầu ra cmake thành dir 'bin'? (tuyên bố từ chối trách nhiệm, tôi có câu trả lời được bình chọn nhiều nhất cho câu hỏi đó ... nhưng đó là cách tôi biết về nó).
CMAKE_BINARY_DIR
hoặcCMAKE_CACHEFILE_DIR
. Điều gì xảy ra nếu bạn xóa tất cả cácset()
cuộc gọi này và chỉ làmcd Compile; rm -rf *; cmake ../src
?