2011-11-29 38 views
8

Tôi đang thiết lập cmake cho dự án của mình và tôi đã thiết lập một dự án thử nghiệm cho nó. Khi nó tạo ra dự án studio hình ảnh 2010 của tôi, tôi muốn biến nó thành dự án tôi đã có trước đó.Chỉ định cách cmake tạo dự án studio trực quan

  • nó tạo dự án ALL_BUILD và ZERO_CHECK mà tôi không muốn.
  • nó đặt tệp .h vào thư mục Phụ thuộc bên ngoài. Tôi muốn có một thư mục bao gồm tập tin, nơi tất cả các tập tin .h đi.
  • Tôi cũng muốn nhóm một số tệp theo các bộ lọc khác nhau. Giống như trong lib cốt lõi của tôi, tôi muốn nhóm tất cả các tệp liên quan đến Toán trong một thư mục và tất cả các tệp liên quan đến Quản lý sự kiện trong một thư mục khác.
  • Trên hệ thống tệp, nó đặt tệp dự án vào bên trong/Lib/src. Có lẽ vì tôi đã tổ chức nó trong thư mục mã, nhưng tôi không muốn điều đó cho các tệp dự án.
  • Tôi muốn thiết lập cấu hình khác vì vậy tôi có DebugOpenGL, DebugDirectX, ReleaseOpenGL, ReleaseDirectX và sau đó đặt cờ USE_OPENGL hoặc USE_DIRECTX cho hai loại cấu hình.

Làm cách nào để loại trừ một số tệp khi tôi xây dựng trên cửa sổ và các tệp khác khi tôi xây dựng trên linux? Giống như tôi có WindowWin.cpp và WindowLinux.cpp.


Tôi đã thử những gì bạn sugested nhưng không thể làm cho nó làm việc:

#LibProject/src 

FILE(GLOB test0_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test.h) 
source_group(include0 FILES ${test0_headers}) 
FILE(GLOB test0_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp) 
source_group(source0 FILES ${test0_source}) 

FILE(GLOB test1_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test1.h) 
source_group(include1 FILES ${test1_headers}) 
FILE(GLOB test1_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test1.cpp) 
source_group(source1 FILES ${test1_source}) 

include_directories(${test0_headers} ${test1_headers}) 

add_library(LibProject ${test0_headers} ${test1_headers} ${test0_source} ${test 
1_source}) 

tôi loại đã nhận nó làm việc bây giờ .. duy nhất mà tôi muốn các thư mục phụ cho tiêu đề và các tập tin nguồn bên trong nhóm nguồn.

set(test_source0 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp) 
source_group(TEST FILES ${test_source0}) 

set(test_source1 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp) 
source_group(TEST2 FILES ${test_source1}) 

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc) 
add_library(LibProject ${test_source0} ${test_source1}) 

Heres giải pháp của tôi :)

set(test_header 
${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h) 
set(test_source 
${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp) 

source_group(TEST\\Headers FILES ${test_header}) 
source_group(TEST\\Source FILES ${test_source}) 

set(test2_header 
${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h) 
set(test2_source 
${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp) 
source_group(TEST2\\Headers FILES ${test2_header}) 
source_group(TEST2\\Source FILES ${test2_source}) 

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc) 

add_library(LibProject 
${test_header} 
${test_source} 
${test2_header} 
${test2_source}) 
+0

Xem http://stackoverflow.com/questions/27175754/what-are-all-build-and-zero-check-and-do-i-need-them để xem ZERO_CHECK và ALL_BUILD là gì. – sashoalm

Trả lời

7

Để nhóm các tập tin vào một thư mục trong Visual Studio bạn có thể sử dụng:

# Include files 
FILE(GLOB all_headers "include/*.h*") 
source_group("include" FILES ${all_headers}) 

# Source files 
FILE(GLOB all_srcs "src/*.cpp") 
source_group("source" FILES ${all_srcs}) 

này sẽ đặt tất cả các file .h của bạn được đặt trong thư mục bao gồm xuất hiện trong một thư mục có tên bao gồm trong Visual Studio . Tương tự cho các tệp cpp của bạn. Bạn có thể sử dụng kỹ thuật này để tạo cấu trúc của riêng bạn trong CMake, nếu đó là những gì bạn muốn.

Vì mục đích của ALL_BUILD và ZERO_CHECK, hãy đọc this answer. Để vô hiệu hóa việc tạo ZERO_CHECK, hãy sử dụng set(CMAKE_SUPPRESS_REGENERATION true).

Để chọn giữa OpenGL và DirectX và để thiết lập các thư mục thích hợp, bạn có thể sử dụng kỹ thuật tương tự đã sử dụng ở trên nhưng đặt chúng bên trong một

if(${USE_OPENGL}) 
    FILE(GLOB ....) 
endif() 

Tôi nghĩ rằng bạn sẽ có được ý tưởng.

+2

Sử dụng GLOB có lẽ không phải là ý tưởng tốt nhất, vì nó không cung cấp cho bạn một lỗi nếu các tập tin bị thiếu là rất quan trọng cho dự án. Nếu bạn liệt kê tất cả các tệp theo cách thủ công (rất nhiều cách gõ tôi biết), CMake sẽ khiếu nại nếu nó không thể tìm thấy tệp được liệt kê. – LiMuBei

+0

để loại bỏ ZERO_CHECK, bạn có thể chuyển tùy chọn -DCMAKE_SUPPRESS_REGENERATION = 0 để tạo dòng lệnh. – davidnr

4

tôi sẽ trả lời những cái tôi biết:

Các ALL_BUILD và ZERO_CHECK được sử dụng để giữ cho các dự án của bạn đồng bộ với những thay đổi để CMakeFiles. Tôi không nghĩ có cách nào để loại bỏ chúng.

Để nhận tệp .h nơi bạn muốn, bạn cần đưa chúng vào như một phần của nguồn. Tôi sử dụng một cái gì đó như thế này:

file(GLOB LocalProjectIncludes "${yourheaderdirectory}/*.h") 

Sau đó, tôi thêm $ {LocalProjectIncludes} vào tệp nguồn cho dự án. CMake sẽ tìm ra rằng họ là các tiêu đề; nó sẽ không cố gắng xây dựng chúng.

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