2012-01-19 38 views
40

Tôi có dự án chưa được chia thành thư viện, nhưng nguồn được tổ chức trong cây thư mục. Tôi không biết làm thế nào để nói với cmake để đi xuống một thư mục, sau đó thêm nguồn trong thư mục đó để dự án được xác định trong thư mục mẹ. Tôi đã cố gắng như sau:Thêm nguồn trong thư mục con vào dự án cmake

trong dự án/nguồn/CMakelists.txt:

set(SOURCE 
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp 
) 
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1") 
add_executable(UnitTestRNG ${SOURCE} ${HEADERS}) 

sau đó trong dự án/nguồn/folder1/CMakeLists.txt:

set(SOURCE 
    ${SOURCE} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp 
) 
set(HEADERS 
    ${HEADERS} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp 
) 

sử dụng một số tin nhắn() báo cáo, tôi đã thấy rằng thư mục con sẽ nhận được nội dung của biến SOURCE, nhưng đó là nhiệm vụ mới cho biến đó sẽ không tồn tại khi quay lại trang gốc CMakeLists.txt

Tìm kiếm các ví dụ và hướng dẫn cmake đã dẫn tôi đến kết luận rằng: - Cấu trúc tệp nguồn thường phẳng trong một dự án - Nếu mã được chia thành các thư mục, nó thường được chia thành các thư viện tương ứng.

Tôi tự hỏi nếu có một số "thực hành tốt nhất" mà từ đó tôi đang deviating bằng cách cố gắng cấu trúc này.

Trả lời

32

Giống như phần thứ hai của câu trả lời arrowdodger cho biết: trong dự án/nguồn/folder1/CMakeLists.txt:

set(SOURCE 
    ${SOURCE} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp 
    PARENT_SCOPE 
) 
set(HEADERS 
    ${HEADERS} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp 
    PARENT_SCOPE 
) 
+0

Cảm ơn cú pháp! Nó hoạt động rất tốt. – 2NinerRomeo

+0

Đây có phải là cách được khuyến nghị để đạt được điều này trong phiên bản mới nhất của cmake không? – lanoxx

4

Bạn không thể chỉ đặt tất cả các nguồn của mình trong dự án/source/CMakelists.txt sau đó?

Dù sao, những gì bạn cần là PARENT_SCOPE hoặc CACHE tùy chọn trên set command.

+0

Phần đầu của câu trả lời của bạn thực sự là những gì tôi đã làm trong thời gian chuyển tiếp. – 2NinerRomeo

Các vấn đề liên quan