2010-07-09 36 views
16

Câu hỏi: CMake có thể tạo các kịch bản xây dựng mà không, theo bất kỳ cách nào, sử dụng CMake? Nếu không, làm thế nào cứng là nó để ruột một CMake tạo ra kịch bản automake để không thực hiện bất kỳ kiểm tra đối với CMake?CMake có thể tạo các tập lệnh xây dựng mà * không * sử dụng cmake không?

Tôi là một fan hâm mộ lớn của CMake đến mức tôi đang vô địch ý tưởng rằng chúng tôi chuyển sang nó trong môi trường làm việc hiện tại của mình. Một điều có thể làm giảm sự chuyển đổi này từ hệ thống xây dựng hiện tại của chúng tôi sang CMake sẽ là nếu tôi có thể chứng minh rằng CMake có thể tạo ra các tệp tự động không yêu cầu bản thân cmake.

Rõ ràng, tôi sẽ không bao giờ muốn thực hiện việc này hàng ngày, nhưng có khả năng dễ dàng tạo chi nhánh mã của chúng tôi có thể được xây dựng từ nguồn mà không yêu cầu cmake sẽ giúp tôi trường hợp.

+0

Tôi thấy kỳ lạ là câu trả lời ở đây là "không". Tôi chỉ nhận được điểm với cmake rằng tôi bắt đầu hiểu cách sử dụng nó (thay vì cố gắng ép buộc nó làm điều gì đó mà nó không được thiết kế cho), chẳng hạn như sử dụng các bản dựng mã nguồn ngoài, v.v ... biết rằng cmake được đóng gói với cpack, có thể tạo ra tarballs trên Linux và tương tự. Nếu một tarball đòi hỏi cmake để xây dựng, tôi không tin rằng đó là một tarball ở tất cả. – Steve314

+0

Tôi sẽ xem xét kỹ hơn về CPack;) – Voltaire

+3

Các tarballs được tạo bởi CPack thường không phải là tarballs nguồn để xây dựng, mà là tarballs nhị phân để chạy hệ thống. – JesperE

Trả lời

5

Không, CMake không thể thực hiện việc này. Nó không thực sự có ý nghĩa, vì không có bất kỳ hỗ trợ CMake nào trong thời gian xây dựng, sẽ không có cách nào để kiểm tra hoặc cập nhật các tệp makefiles/project-files khi các tệp CMakeLists.txt đã thay đổi.

Nếu bạn đang chuyển từ Visual Studio sang CMake, bạn có thể muốn xem vcproj2cmake.

+1

Đó thực sự là một hệ quả "mong muốn" - tôi quan tâm đến việc tạo ra một công cụ tự động "sẵn sàng phân phối" loại xây dựng, nơi mà có thể được sử dụng để xây dựng dự án mà không phụ thuộc vào bất kỳ loại nào - tại thời điểm đó nếu các thay đổi không được phản ánh lại trong CMake. – Voltaire

+5

Đó là trường hợp sử dụng mà CMake không giải quyết. – JesperE

2

Là người đã lấy một phần mềm phức tạp lớn và gần đây đã rút ra hệ thống xây dựng hiện có của mình, cài đặt hệ thống xây dựng mới tại chỗ của nó. Tôi có thể nói với bạn rằng nó không phải dễ dàng, nhưng tôi chắc chắn sẽ không muốn các kịch bản shell như là một phần của quá trình xây dựng của tôi, nếu chúng có thể tránh được. Ngày càng có nhiều hệ thống sẽ tìm thấy chính mình với CMake trên chúng, vì các gói phần mềm tên tuổi lớn hơn như LLVM và KDE bắt đầu sử dụng nó - Đây là một lĩnh vực mà nó thực sự đạt được, các dự án lớn.

Một trong những điều tốt đẹp về CMake là nó xây dựng mọi thứ nhanh hơn. Khu nghỉ dưỡng phải có vỏ vỏ ngã ba để giải thích một tập lệnh thực sự làm chậm quá trình xây dựng.

3

Các tệp được tạo ra CMake phụ thuộc vào cmake cho các lệnh khác nhau như tạo/xóa/etc ... không chỉ để tạo lại các tệp makefiles khi thay đổi để loại bỏ cmake sẽ không hoạt động.

+2

+1 CMake cũng có thể được sử dụng như một ngôn ngữ kịch bản (xem tùy chọn "-P" trong manpage CMake), và nhiều dự án sử dụng CMake như một sự thay thế cho các kịch bản shell, cho các công cụ như sao chép các tập tin xung quanh hoặc gọi các chương trình trợ giúp. Các dự án này sẽ yêu cầu CMake vào thời gian xây dựng, không chỉ để tạo ra makefile. – sleske

-1

Còn 'giải pháp nguyên tử' thì sao?

EX tự động tạo một file "QT moc" từ CMakeLists.txt, sau đó xây dựng dự án mà phụ thuộc vào các tập tin cpp được tạo

# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file 
if(UNIX) 
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(UNIX) 

Trong trường hợp file sh chứa:

# generate_moc.sh 
echo "generating moc file: moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp " 
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp 

cửa sổ tương đương tập tin thực thi, "moc_creator_win.bat":

moc "GUICreator.h" -o "moc_GUICreator.cpp" 

đã không cố gắng l này ast bit trong cửa sổ, nhưng nó hoặc một cái gì đó rất gần nên làm việc, ngay sau khối if (UNIX) trong CMakeLists.txt:

if(WIN32) 
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(WIN32) 

Vì vậy, về cơ bản nếu bạn khéo léo bạn có thể làm bất cứ điều gì bạn muốn từ một kịch bản và sử dụng các biến CMake như args cho nó, tôi không chắc chắn nếu bạn có thể yêu cầu thêm ...

điểm là để tránh 'phi di động xây dựng các loại' trừ khi bạn thực sự cần phải hack nó vào một trình biên dịch chuyên ngành, hoặc không cảm thấy như sử dụng QT thiết kế để đặt các widget ;-)

+0

Tôi không chắc chắn điều này có liên quan đến câu hỏi gốc hay không. –

+0

Điểm bạn có thể sử dụng CMake như dự định, hoặc ở đầu đối diện của quang phổ, chỉ quấn quanh các tập lệnh tùy ý. Không có gì để ngăn bạn phân tích các biến cmake và tạo ra bất kỳ makefiles nào mà bạn mong muốn ... –

4

Khả năng để làm điều này phụ thuộc vào hệ điều hành của bạn, tôi giả sử Unix/Makefile hoặc Winderz/MSVC. Nếu bạn đang sử dụng MSVC, sự phụ thuộc cmake nên được loại bỏ bằng cách khai báo tùy chọn CMAKE_SUPPRESS_REGENERATION khi bắt đầu tập lệnh cmake của bạn.

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

Trên các hệ thống dựa trên Unix, tuy nhiên, Makefiles là tied một cách rõ ràng đến cmake xây dựng file (CMakeFiles, vv). Tôi nghi ngờ rằng sự phụ thuộc này có thể bị bỏ qua bởi những nhận xét chiến lược từ các chỉ thị của Makefile mặc dù, tôi không thể nói chúng có thể là gì.

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