2016-01-27 12 views
15

Có lẽ tôi đang thiếu một cái gì đó hiển nhiên, nhưng tôi dường như không thể tìm ra cách đặt rõ ràng các biến môi trường có thể được nhìn thấy bởi các quá trình được đưa ra thông qua add_custom_target().Làm cách nào để sửa đổi các biến môi trường được chuyển đến mục tiêu CMake tùy chỉnh?

tôi thử như sau:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}") 
add_custom_target(newtarget somecommand) 

Thật không may, các biến môi trường %PATH% xuất hiện không thay đổi để somecommand. (Tôi đã thiết lập một Gist để tái tạo sự cố here.)

Tôi đang làm gì sai?

+0

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

Trả lời

13

Một cách di động của thiết lập các biến môi trường cho một mục tiêu tùy chỉnh là sử dụng CMake của chế độ công cụ dòng lệnh lệnh env:

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]... 
Run command in a modified environment. 

ví dụ .:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand) 

Xem thêm Command Line Tool Mode.

12

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.

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