Có hai loại máy phát điện: một cấu hình và nhiều cấu hình.
Cấu hình đơn
Trình tạo giống như: Unix Makefiles , NMake Makefiles , MinGW Makefiles , ...
Bạn đặt kiểu cấu hình trong bước tạo:
cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
Trong trường hợp này, bước xây dựng luôn là Gỡ lỗi :
> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...
Đa cấu hình
Trình tạo IDE: Visual Studio , Xcode
CMAKE_BUILD_TYPE
trên bước tạo bị bỏ qua, cả hai:
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"
và
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"
sẽ có tác dụng tương tự:
Điều này là do tất cả các cấu hình là bên trong (tức là, _builds/msvc-opaque/Release
và _builds/msvc-opaque/Debug
hoặc cái gì đó, không quan trọng). Bạn có thể sử dụng --config
các tùy chọn để chuyển đổi:
> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...
Điều khiển (?)
Có, bạn có thể. Chỉ cần xác định CMAKE_CONFIGURATION_TYPES :
# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")
Đầu ra mặc định:
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done
Viết lại nó:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done
Bạn thậm chí có thể xác định loại cấu hình của riêng mình:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"
Và xây dựng:
cmake --build _builds --config MyRelease
Lộn xộn (?)
Không hề nếu bạn biết mẹo :) Đây là cách xây dựng / kiểm tra cấu hình trong hướng dẫn xây dựng của máy chủ / tài liệu / máy chủ tập lệnh / CI, v.v.:
> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile
Mẫu xấu
if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...
Tốt
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")
Hoạt động tốt.
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")
Cảm ơn bạn! :) Bạn tiết kiệm một ngày cho một lập trình viên.
Làm việc cho tôi với Makefile, tôi rất vui ...
Một số trích dẫn từ một cuốn sách hay của một chàng trai tốt mà bạn có thể biết (nhấn mạnh của tôi):
Tại sao bạn phải bận tâm? Những người lập trình trên nhiều hệ thống hoặc sử dụng nhiều trình biên dịch khác nhau quan tâm rất nhiều vì nếu không, họ buộc phải lãng phí thời gian để tìm và sửa các lỗi khó hiểu. Những người phàn nàn rằng họ không quan tâm về tính di động thường làm như vậy bởi vì họ chỉ sử dụng một hệ thống duy nhất và cảm thấy họ có thể đủ khả năng thái độ rằng '' ngôn ngữ là những gì cụ biên dịch của tôi. '' Đây là một hẹp và thiển cậnlượt xem. Nếu chương trình của bạn thành công, nó có khả năng được chuyển, vì vậy ai đó sẽ phải tìm và sửa các vấn đề liên quan đến các tính năng phụ thuộc vào việc triển khai. Ngoài ra, các chương trình thường cần được biên dịch với các trình biên dịch khác cho cùng một hệ thống và ngay cả bản phát hành trong tương lai của trình biên dịch yêu thích của bạn cũng có thể làm một số việc khác với bản hiện tại. Việc biết và hạn chế tác động của các phụ thuộc thực thi khi một chương trình được viết sẽ dễ dàng hơn nhiều so với việc cố gắng gỡ rối sau đó.