CMake'de (Windows) bir kullanıcı ortamı değişkeni nasıl alınır


105

CMAKE'de normal bir makine geniş ortam değişkeninin nasıl alınacağını biliyorum

$ENV{EnvironmentVariableName}

ancak kullanıcıya özel bir ortam değişkeni alamıyorum. Mümkün mü ve nasıl?


2
Verilen cevaba hiçbir şey eklemediği için bu soruyu silmeniz gerektiğini düşünüyorum.
Tom Brito

11
Bu, CMake'de ortam değişkenlerinin nasıl alınacağına dair ilk Google isabeti. Sorunun zaten cevabı içermesi biraz garip olabilir, ancak IMO'yu silinmemesi gerekir.
Andreas Haferburg

2
Cevap tamamen "hiçbir şey" iken, bu soru ve cevabın nasıl bu kadar çok olumlu oyu var?
Ludwik

3
@Ludwik, kullanıcıya özel ortam değişkenlerinin CMake betiklerinde bulunmaması sorununu çözdüğü için.
Robert

3
Sorunun bir kısmı, "kullanıcıya özgü ortam değişkenleri" ve "normal makine geniş ortam değişkeni" arasındaki ayrımın Windows'a çok özgü bir kavram olmasıdır. Unix benzeri sistemler, ortam değişkenlerinin nerede ayarlandığını önemsemezler; hepsi aynı.
James Moore

Yanıtlar:


83

CMake komut dosyanıza değişkenleri alma

Cmake çağrısı ile satırda bir değişken geçirebilirsiniz:

FOO=1 cmake

veya BASH'de bir değişkeni dışa aktararak:

export FOO=1

Daha sonra şunu kullanarak bir cmake betiğinden alabilirsiniz:

$ENV{FOO}

14

Ayrıca çağırabilirsiniz bunu platformlar arası bir şekilde yapmak için:

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

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

Komutu değiştirilmiş bir ortamda çalıştırın.


Sadece farkında bu sadece ilk kez işe olabileceğini. CMake, ardışık derlemelerden biriyle yeniden yapılandırırsa (örneğin make, biri CMakeLists.txtdeğiştirildi ve CMake yeniden üretim sürecinden geçer), kullanıcı tanımlı ortam değişkeni artık orada olmayabilir (sistem genelinde ortam değişkenlerine kıyasla).

Bu yüzden projelerimdeki bu kullanıcı tanımlı ortam değişkenlerini bir CMake önbelleğe alınmış değişkene aktarıyorum:

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}")

Referans


4

Değişkenlerinizi dışa aktarmanız gerekir. Örneğin Linux'ta:

export EnvironmentVariableName=foo

Dışa aktarılmayan değişkenler CMAKE'de boş.


5
Bunları ihraç etmek zorunda değilsiniz! Örnek: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), başlatma: COVERAGE=1 cmake ... Kabul ediyorum, içeriği kontrol etmiyorum ve kontrol edip edemeyeceğini bilmiyorum. Ancak tanımlanmış olup olmadığını test etmek için kesinlikle işe yarar!
Janus Troelsen

1
Değişkenleri önceki satırlarda tanımlarsanız, dışa aktarmaya ihtiyacınız vardır. Yalnızca aynı satırda tanımlanan değişkenler dışa aktarmayı gerektirmez, ancak soruyu şu şekilde mi yoksa başka bir şekilde mi yaptığınızı çıkaramayız.
Alexis Wilke

1

Ortam değişkenleri (Sistem Özelliklerini kullanarak değiştirdiğiniz) yalnızca yeni bir alt kabuk oluşturduğunuzda alt kabuklara yayılır.

Kullanıcı ortam değişkenlerini değiştirdiğinizde açık bir komut satırı isteminiz (DOS veya cygwin) varsa, görünmezler.

Kullanıcı ayarlarını değiştirdikten sonra yeni bir komut satırı istemi açmanız gerekir.

Unix / Linux'taki eşdeğer, .bash_rc dosyanıza bir satır eklemektir: değerleri almak için yeni bir kabuk başlatmanız gerekir.


Windows SET var_name=var_valueiçin, geçerli DOS oturumundaki ortam değişkenini ayarlamak için veya SETX var_name var_valuekalıcı olarak ayarlamak için de çalıştırabilirsiniz : bkz. Set ve setx . yerel ayarlamak da ilginç olabilir.
WillC

Unix / Linux için, genellikle source ~/.bashrcdeğiştirilen .bashrcdosyayı yeniden çalıştırmak ve yeni değerleri mevcut oturumunuza almak için de çalıştırabilirsiniz .
WillC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.