Cách truy xuất biến môi trường người dùng trong CMake (Windows)


104

Tôi biết cách truy xuất biến môi trường rộng máy bình thường trong CMAKE bằng cách sử dụng

$ENV{EnvironmentVariableName}

nhưng tôi không thể truy xuất biến môi trường cụ thể của người dùng. Nó có thể và làm thế nào?


2
Tôi nghĩ bạn chỉ nên xóa câu hỏi này, vì nó không bổ sung gì với câu trả lời đã cho.
Tom Brito

11
Đây là cú đánh đầu tiên của Google về cách truy xuất các vars môi trường trong CMake. Có thể hơi lạ khi câu hỏi đã có câu trả lời, nhưng không nên xóa IMO.
Andreas Haferburg

2
Làm thế quái nào mà câu hỏi và câu trả lời này lại có nhiều lượt ủng hộ đến vậy, trong khi câu trả lời hoàn toàn là "không có gì"?
Ludwik

3
@Ludwik vì nó giải đáp vấn đề rằng các biến môi trường cụ thể của người dùng không có sẵn trong tập lệnh CMake.
Robert

3
Một phần của vấn đề là sự phân chia giữa "biến môi trường cụ thể của người dùng" và "biến môi trường trên toàn máy bình thường" là một khái niệm rất cụ thể đối với Windows. Các hệ thống giống Unix không quan tâm đến nơi đặt các biến môi trường; chúng đều giống nhau.
James Moore

Câu trả lời:


83

Đưa các biến vào tập lệnh CMake của bạn

Bạn có thể chuyển một biến trên dòng với lời gọi cmake:

FOO=1 cmake

hoặc bằng cách xuất một biến trong BASH:

export FOO=1

Sau đó, bạn có thể chọn nó trong một kịch bản cmake bằng cách sử dụng:

$ENV{FOO}

13

Bạn cũng có thể gọi để thực hiện điều này theo cách đa nền tảng:

cmake -E env EnvironmentVariableName="Hello World" cmake ..

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...

Chạy lệnh trong môi trường đã sửa đổi.


Chỉ cần lưu ý rằng điều này có thể chỉ hoạt động trong lần đầu tiên. Nếu CMake cấu hình lại với một trong các bản dựng liên tiếp (bạn chỉ cần gọi ví dụ: makemột bản CMakeLists.txtđã được thay đổi và CMake chạy lại quá trình tạo), biến môi trường do người dùng xác định có thể không còn ở đó nữa (so với các biến môi trường trên toàn hệ thống).

Vì vậy, tôi chuyển những biến môi trường do người dùng xác định trong các dự án của mình thành một biến được lưu trong bộ nhớ cache CMake:

cmake_minimum_required(VERSION 2.6)

project(PrintEnv NONE)

if (NOT "$ENV{EnvironmentVariableName}" STREQUAL "")
    set(EnvironmentVariableName "$ENV{EnvironmentVariableName}" CACHE INTERNAL "Copied from environment variable")
endif()

message("EnvironmentVariableName = ${EnvironmentVariableName}")

Tài liệu tham khảo


4

Bạn cần xuất các biến của mình. Ví dụ trong Linux:

export EnvironmentVariableName=foo

Các biến chưa được báo cáo trống trong CMAKE.


5
Bạn không cần phải xuất chúng! Ví dụ: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), invocation : COVERAGE=1 cmake ... Được, tôi không kiểm tra nội dung và tôi không biết nó có được không. Nhưng nó chắc chắn hoạt động để kiểm tra nếu nó được xác định hay không!
Janus Troelsen

1
Nếu bạn xác định các biến trên các dòng trước đó, thì bạn cần xuất. Chỉ các biến được xác định trên cùng một dòng không yêu cầu xuất, nhưng câu hỏi chúng tôi không thể suy ra bạn làm theo cách này hay cách khác.
Alexis Wilke

1

Các biến môi trường (mà bạn sửa đổi bằng cách sử dụng Thuộc tính hệ thống) chỉ được truyền tới các trang con khi bạn tạo một vỏ con mới.

Nếu bạn có một dấu nhắc dòng lệnh (DOS hoặc cygwin) mở khi bạn thay đổi User env vars, thì chúng sẽ không hiển thị.

Bạn cần mở lời nhắc dòng lệnh mới sau khi thay đổi cài đặt người dùng.

Tương tự trong Unix / Linux là thêm một dòng vào .bash_rc của bạn: bạn cần bắt đầu một trình bao mới để nhận các giá trị.


Đối với Windows, bạn cũng có thể chạy SET var_name=var_valueđể đặt biến môi trường trong phiên DOS hiện tại hoặc SETX var_name var_valueđể đặt nó vĩnh viễn: xem setsetx . thiết lập địa phương cũng có thể là thú vị.
WillC

Đối với Unix / Linux, bạn cũng có thể chạy source ~/.bashrcđể chạy lại .bashrctệp đã sửa đổi và nhận các giá trị mới vào phiên hiện tại của mình.
WillC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.