Câu hỏi Cách lấy biến môi trường người dùng trong CMake (Windows)


Tôi biết cách lấy một biến môi trường rộng của 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. Có thể và làm thế nào?


76
2018-03-27 15:27


gốc


Tôi nghĩ bạn chỉ nên xóa câu hỏi này, vì nó không thêm gì với câu trả lời đã cho. - Tom Brito
Đây là lần truy cập đầ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 đã chứa câu trả lời, nhưng không nên xóa IMO. - Andreas Haferburg
Câu hỏi và câu trả lời này có quá nhiều upvotes, khi câu trả lời hoàn toàn là "không có gì"? - Ludwik
@ Ludwik vì nó trả lời vấn đề mà các biến môi trường cụ thể của người dùng không có sẵn trong các kịch bản lệnh của CMake. - Robert
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 rộng của 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 các biến môi trường được thiết lập ở đâu; tất cả đều giống nhau. - James Moore


Các câu trả lời:


Đưa 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ệnh gọi cmake:

FOO=1 cmake

hoặc bằng cách xuất biến bằng 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}

57
2017-10-13 08:48



$ENV{FOO} chính xác, đang tìm kiếm. - parasrish


Bạn cũng có thể gọi  chính nó để làm đ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ỉ ý thức rằng điều này chỉ có thể hoạt động lần đầu tiên. Nếu CMake định 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ụ: make, một CMakeLists.txt đã được thay đổi và CMake chạy qua quá trình tạo lại), biến môi trường do người dùng định nghĩa có thể không còn ở đó nữa (so với các biến môi trường rộng của hệ thống).

Vì vậy, tôi chuyển các biến môi trường do người dùng định nghĩa đó trong các dự án của tôi thành một biến được lưu trong 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


6
2018-04-09 19:06





Bạn cần phải xuất các biến của mình. Vì vậy, ví dụ trong Linux:

export EnvironmentVariableName=foo

Các biến chưa được xuất hiện trống trong CMAKE.


3
2017-10-18 19:59



Bạn không phải xuất chúng! Ví dụ: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), gọi: COVERAGE=1 cmake ... Cấp, tôi không kiểm tra các nội dung, và tôi không biết nếu nó sẽ. Nhưng nó chắc chắn hoạt động để thử nghiệm nếu nó được xác định hay không! - Janus Troelsen
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 mà chúng tôi không thể suy ra cho dù bạn thực hiện theo cách này hay cách khác. - Alexis Wilke


Biến môi trường (mà bạn sửa đổi bằng cách sử dụng các thuộc tính hệ thống) chỉ được truyền đến subshells khi bạn tạo một subshell mới.

Nếu bạn có lời 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 bạn thay đổi cài đặt người dùng.

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


1
2017-07-01 23:52



Đố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 vĩnh viễn: xem bộ và setx . đặt địa phương cũng có thể thú vị. - WillC
Đối với Unix / Linux, bạn cũng có thể chạy chung source ~/.bashrc để chạy lại sửa đổi .bashrc và nhận các giá trị mới vào phiên hiện tại của bạn. - WillC