Cara mengambil variabel lingkungan pengguna di CMake (Windows)

104

Saya tahu cara mengambil variabel lingkungan lebar mesin normal di CMAKE menggunakan

$ENV{EnvironmentVariableName}

tetapi saya tidak dapat mengambil variabel lingkungan khusus pengguna. Mungkinkah dan bagaimana caranya?

Lars Bilke
sumber
2
Saya pikir Anda sebaiknya menghapus pertanyaan ini, karena pertanyaan ini tidak menambahkan apa-apa dengan jawaban yang diberikan.
Tom Brito
11
Ini adalah hit Google pertama tentang cara mengambil vars lingkungan di CMake. Mungkin agak aneh bahwa pertanyaan tersebut sudah berisi jawabannya, tetapi tidak boleh dihapus IMO.
Andreas Haferburg
2
Bagaimana bisa pertanyaan dan jawaban ini memiliki banyak suara positif, padahal jawabannya sama sekali "tidak ada"?
Ludwik
3
@Ludwik karena menjawab masalah bahwa variabel lingkungan khusus pengguna tidak tersedia dalam skrip CMake.
Robert
3
Sebagian dari masalahnya adalah pemisahan antara "variabel lingkungan khusus pengguna" dan "variabel lingkungan lebar mesin normal" merupakan konsep yang sangat spesifik untuk Windows. Sistem mirip Unix tidak peduli di mana variabel lingkungan ditetapkan; semuanya sama.
James Moore

Jawaban:

83

Memasukkan variabel ke dalam skrip CMake Anda

Anda dapat mengirimkan variabel di baris dengan doa cmake:

FOO=1 cmake

atau dengan mengekspor variabel di BASH:

export FOO=1

Kemudian Anda dapat mengambilnya dalam skrip cmake menggunakan:

$ENV{FOO}
Cameron Lowell Palmer
sumber
13

Anda juga bisa memohon sendiri untuk melakukan ini dengan cara lintas platform:

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

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

Jalankan perintah di lingkungan yang dimodifikasi.


Hanya akan menyadari bahwa ini hanya dapat bekerja pertama kalinya. Jika CMake mengonfigurasi ulang dengan salah satu build yang berurutan (Anda cukup memanggil misalnya make, satu CMakeLists.txttelah diubah dan CMake menjalankan proses pembuatan lagi), variabel lingkungan yang ditentukan pengguna mungkin tidak ada lagi (dibandingkan dengan variabel lingkungan sistem yang luas).

Jadi saya mentransfer variabel lingkungan yang ditentukan pengguna itu dalam proyek saya ke dalam variabel 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}")

Referensi

Florian
sumber
4

Anda harus mengekspor variabel Anda. Jadi misalnya di Linux:

export EnvironmentVariableName=foo

Variabel yang tidak diekspor kosong di CMAKE.

P51DAce
sumber
5
Anda tidak perlu mengekspornya! Contoh: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), doa: COVERAGE=1 cmake ... Memang, saya tidak memeriksa isinya, dan saya tidak tahu apakah itu akan. Tapi itu pasti berfungsi untuk pengujian apakah itu ditentukan atau tidak!
Janus Troelsen
1
Jika Anda mendefinisikan variabel pada baris sebelumnya, maka Anda membutuhkan ekspor. Hanya variabel yang ditentukan pada baris yang sama tidak memerlukan ekspor, tetapi pertanyaannya kita tidak dapat menyimpulkan apakah Anda melakukannya dengan satu cara atau cara lain.
Alexis Wilke
1

Variabel lingkungan (yang Anda modifikasi menggunakan Properti Sistem) hanya disebarkan ke subkulit saat Anda membuat subkulit baru.

Jika Anda memiliki prompt baris perintah (DOS atau cygwin) terbuka ketika Anda mengubah User env vars, maka mereka tidak akan muncul.

Anda perlu membuka prompt baris perintah baru setelah Anda mengubah pengaturan pengguna.

Yang setara di Unix / Linux adalah menambahkan baris ke .bash_rc Anda: Anda perlu memulai shell baru untuk mendapatkan nilainya.

Mark Lakata
sumber
Untuk Windows Anda juga dapat menjalankan SET var_name=var_valueuntuk mengatur variabel lingkungan dalam sesi DOS saat ini, atau SETX var_name var_valueuntuk mengaturnya secara permanen: lihat set dan setx . mengatur lokal mungkin juga menarik.
WillC
Untuk Unix / Linux biasanya Anda juga dapat menjalankan source ~/.bashrcuntuk menjalankan kembali .bashrcfile yang dimodifikasi dan mendapatkan nilai baru ke sesi Anda saat ini.
WillC