Bạn đang rời ra một số thông tin, chẳng hạn như các nền tảng bạn cần để chạy trên và nếu có bất kỳ công cụ bổ sung mà bạn có thể sử dụng. Nếu bạn có thể sử dụng Ruby, Perl, của Python, mọi thứ trở nên đơn giản hơn nhiều. Tôi sẽ giả sử rằng bạn muốn chạy trên cả UNIX và Windows pqlatform và rằng không có sẵn các công cụ bổ sung.
Nếu bạn muốn đầu ra từ lệnh trong một biểu tượng tiền xử lý, cách đơn giản nhất là tạo một tệp tiêu đề thay vì không quan trọng xung quanh với các tham số dòng lệnh. Hãy nhớ rằng CMake có một kịch bản-mode (-P), nơi nó chỉ xử lý các lệnh script trong file, vì vậy bạn có thể làm điều gì đó như thế này:
CMakeLists.txt:
project(foo)
cmake_minimum_required(VERSION 2.6)
add_executable(foo main.c custom.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_custom_command(OUTPUT custom.h
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake)
Các tập tin " custom.h "được tạo tại thời gian biên dịch bằng lệnh" cmake -P custom.cmake ". custom.cmake trông như thế này:
execute_process(COMMAND uname -a
OUTPUT_VARIABLE _output OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE custom.h "#define COMPILE_TIME_VALUE \"${_output}\"")
Nó thực thi lệnh (trong trường hợp này "uname -a", bạn sẽ thay thế nó với bất cứ lệnh bạn muốn), và đặt ra trong biến _output , sau đó viết cho custom.h.Lưu ý rằng điều này sẽ chỉ hoạt động nếu lệnh xuất ra một dòng. (Nếu bạn cần Multiline đầu ra, bạn sẽ phải viết một custom.cmake phức tạp hơn, tùy thuộc vào cách bạn muốn dữ liệu multiline vào chương trình của bạn.)
Các chương trình chính như sau:
#include <stdio.h>
#include "custom.h"
int main()
{
printf("COMPILE_TIME_VALUE: %s\n", COMPILE_TIME_VALUE);
return 0;
}
Nếu bạn thực sự muốn tính toán các tùy chọn trình biên dịch tại thời gian biên dịch, mọi thứ trở nên phức tạp hơn nhiều. Đối với các trình tạo Bourne-shell, bạn chỉ có thể chèn lệnh bên trong các dấu gạch chéo ngược. Nếu bạn nhận được điên khi tìm ra trích dẫn, di chuyển tất cả các logic của lệnh của bạn bên trong một vỏ kịch bản để bạn chỉ cần đặt mycommand.sh
trong add_definitions của bạn():
if(UNIX)
add_definitions(`${CMAKE_CURRENT_SOURCE_DIR}/custom-options.sh`)
endif()
Đối với máy phát điện của Windows tập tin thực thi công việc cơ bản có nhiều mẹo nhỏ hơn, và tôi không có giải pháp tốt. Vấn đề là các lệnh PRE_BUILD
không được thực thi như là một phần của cùng một tệp batch như trình biên dịch thực tế gọi (BuildLog.htm để biết chi tiết), vì vậy ý tưởng ban đầu của tôi không hoạt động (tạo custom.bat trong một PRE_BUILD
và sau đó thực hiện "gọi custom.bat" trên đó để nhận tập hợp biến có thể sau này được tham chiếu trong dòng lệnh trình biên dịch). Nếu có tương đương với backticks trong các tệp hàng loạt, điều đó sẽ giải quyết được sự cố.
Hy vọng điều này sẽ đưa ra một số ý tưởng và điểm xuất phát.
(Bây giờ đến vấn ngược lại không thể tránh khỏi: là những gì bạn thực sự cố gắng để làm gì?)
EDIT: Tôi không chắc chắn lý do tại sao bạn không muốn để cho CMake được sử dụng để tạo ra các tập tin tiêu đề. Sử dụng $ {CMAKE_COMMAND} sẽ mở rộng đến CMake được sử dụng để tạo các tệp Makefiles/.vcproj và vì CMake không thực sự hỗ trợ các tệp Makefiles/.vcproj di động, bạn sẽ cần chạy lại CMake trên các máy mục tiêu.
CMake cũng có một loạt các lệnh tiện ích (Chạy "cmake -E" cho danh sách) vì lý do rõ ràng này. Ví dụ: bạn có thể làm
add_custom_command(OUTPUT custom.h COMMAND ${CMAKE_COMMAND} -E copy file1.h file2.h)
để sao chép tệp1.h thành file2.h.
Dù sao, nếu bạn không muốn tạo header-files sử dụng CMake, bạn sẽ có cần phải gọi .bat/script sh riêng biệt để tạo ra các tập tin tiêu đề, hoặc làm điều đó bằng tiếng vang:
add_custom_command(OUTPUT custom.h COMMAND echo #define SOMETHING 1 > custom.h)
Điều chỉnh trích dẫn nếu cần.
Tôi đã làm rõ câu hỏi của mình. Bạn có thể làm rõ bạn trả lời trong ánh sáng này? –