Bạn đặt biến môi trường tại cấu hình bước, nhưng lệnh quy định cho add_custom_target
được thực hiện tại build bước. Xem thêm CMake FAQ: How can I get or set environment variables?
[...]
biến môi trường SET
trong CMakeLists.txt chỉ có hiệu lực cho bản thân cmake (cấu hình thời gian), để bạn có thể không sử dụng này phương pháp để đặt biến môi trường mà lệnh tùy chỉnh có thể cần (thời gian xây dựng). Chặn hỗ trợ biến môi trường theo các lệnh CMake khác nhau (ví dụ: add_custom_command()
, hiện chưa được hỗ trợ), giải pháp có thể chấp nhận có thể là gọi các tập lệnh shell thay vì .
Hiện tại add_custom_target
(và các lệnh khác, xác định hành động cho bước xây dựng, ví dụ: add_custom_command
) không hỗ trợ các biến môi trường thiết lập đơn giản. Như được đề cập trong this bugreport, đối với giá trị của biến số không có dấu cách trên Linux, bạn có thể thêm lệnh bằng mệnh đề "VAR = VAL". Đối với trường hợp chung, bạn có thể chuẩn bị wrapper kịch bản, trong đó thiết lập môi trường và chạy lệnh thực tế:
Trên Windows:
wrapper.bat:
@ECHO OFF
set PATH="C:\\Some\\Path;%PATH%"
%*
CMakeLists.txt:
add_custom_target(...
COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)
O n Linux:
wrapper.sh:
export "PATH=/Some/Path:$PATH"
eval "$*"
CMakeLists.txt:
add_custom_target(...
COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)
Nếu giá trị của biến phụ thuộc vào cấu hình, bạn có thể cấu hình kịch bản wrapper với configure_file
.
CẬP NHẬT:
Theo ghi nhận của @sakra, env
chế độ công cụ của cmake
thực thi có thể được sử dụng như một kịch bản wrapper:
add_custom_target(...
COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args...
)
cách này có sẵn từ CMake 3.2.
Tôi muốn đề xuất rằng vì bạn đang tạo một quy trình mới (từ nhận xét của bạn) thì quy trình mới sẽ được cung cấp môi trường riêng của mình, không kế thừa môi trường của quy trình chính. Nếu bạn tạo ra một tiến trình con của tiến trình chính, thì môi trường sẽ được thừa hưởng - nhưng tôi không biết gì về 'cmake' vì vậy tôi có thể thoát khỏi đây. Tuy nhiên, bạn nên sử dụng 'dấu gạch chéo ngược' làm dấu tách thư mục, không phải'/'là'/'là một tiền tố chuyển đổi. Đôi khi '/' hoạt động một cách vui vẻ, nhưng nó không đáng tin cậy. – Magoo