วิธีการดึงตัวแปรสภาพแวดล้อมผู้ใช้ใน CMake (Windows)


105

ฉันรู้วิธีดึงตัวแปรสภาพแวดล้อมเครื่องกว้างปกติใน CMAKE โดยใช้

$ENV{EnvironmentVariableName}

แต่ฉันไม่สามารถดึงตัวแปรสภาพแวดล้อมเฉพาะผู้ใช้ เป็นไปได้หรือไม่และอย่างไร


2
ฉันคิดว่าคุณควรลบคำถามนี้เพราะไม่มีอะไรเพิ่มในคำตอบที่ระบุ
Tom Brito

11
นี่เป็นความนิยมครั้งแรกของ Google ในการดึงสภาพแวดล้อม vars ใน CMake อาจเป็นเรื่องแปลกที่คำถามมีคำตอบอยู่แล้ว แต่ไม่ควรลบ IMO
Andreas Haferburg

2
คำถามและคำตอบนี้มีการโหวตเพิ่มขึ้นมากมายได้อย่างไรเมื่อคำตอบคือ "ไม่มีอะไร"?
Ludwik

3
@Ludwik เนื่องจากตอบปัญหาที่ตัวแปรสภาพแวดล้อมเฉพาะของผู้ใช้ไม่มีในสคริปต์ CMake
Robert

3
ส่วนหนึ่งของปัญหาคือการแยกระหว่าง "ตัวแปรสภาพแวดล้อมเฉพาะผู้ใช้" และ "ตัวแปรสภาพแวดล้อมปกติของเครื่อง" เป็นแนวคิดที่เฉพาะเจาะจงสำหรับ Windows ระบบที่เหมือน Unix ไม่สนใจว่าจะตั้งค่าตัวแปรสภาพแวดล้อมไว้ที่ใด มันเหมือนกันหมด
James Moore

คำตอบ:


83

รับตัวแปรเข้าสู่สคริปต์ CMake ของคุณ

คุณสามารถส่งผ่านตัวแปรในบรรทัดด้วยการเรียกใช้ cmake:

FOO=1 cmake

หรือโดยการส่งออกตัวแปรใน BASH:

export FOO=1

จากนั้นคุณสามารถหยิบมันขึ้นมาในสคริปต์ cmake โดยใช้:

$ENV{FOO}

14

คุณยังสามารถเรียกใช้ เพื่อทำสิ่งนี้ด้วยวิธีข้ามแพลตฟอร์ม:

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

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

เรียกใช้คำสั่งในสภาพแวดล้อมที่แก้ไข


โปรดทราบว่าสิ่งนี้อาจใช้ได้ผลในครั้งแรกเท่านั้น หาก CMake กำหนดค่าอีกครั้งด้วยหนึ่งในบิลด์ที่ต่อเนื่องกัน (คุณแค่เรียกเช่นmakeหนึ่งCMakeLists.txtถูกเปลี่ยนและ CMake ทำงานผ่านกระบวนการสร้างอีกครั้ง) ตัวแปรสภาพแวดล้อมที่ผู้ใช้กำหนดอาจไม่มีอีกต่อไป (เมื่อเปรียบเทียบกับตัวแปรสภาพแวดล้อมทั้งระบบ)

ดังนั้นฉันจึงโอนตัวแปรสภาพแวดล้อมที่ผู้ใช้กำหนดในโครงการของฉันไปเป็นตัวแปรแคชของ 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}")

ข้อมูลอ้างอิง


4

คุณต้องมีการส่งออกตัวแปรของคุณ ตัวอย่างเช่นใน Linux:

export EnvironmentVariableName=foo

ตัวแปรที่ไม่ได้ส่งออกจะว่างเปล่าใน CMAKE


5
คุณไม่จำเป็นต้องส่งออก! ตัวอย่าง: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), COVERAGE=1 cmake ..ภาวนา: จริงอยู่ฉันไม่ได้ตรวจสอบเนื้อหาและฉันไม่รู้ว่ามันจะเป็นอย่างไร แต่มันใช้งานได้สำหรับการทดสอบว่ามีการกำหนดไว้หรือไม่
Janus Troelsen

1
หากคุณกำหนดตัวแปรในบรรทัดก่อนหน้าคุณจะต้องมีการส่งออก เฉพาะตัวแปรที่กำหนดไว้ในบรรทัดเดียวกันเท่านั้นที่ไม่ต้องการการเอ็กซ์พอร์ต แต่คำถามที่เราไม่สามารถสรุปได้ว่าคุณทำไม่ทางใดก็ทางหนึ่ง
Alexis Wilke

1

ตัวแปรสภาพแวดล้อม (ที่คุณแก้ไขโดยใช้คุณสมบัติของระบบ) จะแพร่กระจายไปยัง subshells เท่านั้นเมื่อคุณสร้าง subshell ใหม่

หากคุณมีพรอมต์บรรทัดคำสั่ง (DOS หรือ cygwin) เปิดอยู่เมื่อคุณเปลี่ยน User env vars ก็จะไม่ปรากฏขึ้น

คุณต้องเปิดพรอมต์บรรทัดคำสั่งใหม่หลังจากที่คุณเปลี่ยนการตั้งค่าผู้ใช้

สิ่งที่เทียบเท่าใน Unix / Linux กำลังเพิ่มบรรทัดใน. bash_rc ของคุณ: คุณต้องเริ่มเชลล์ใหม่เพื่อรับค่า


สำหรับ Windows คุณยังสามารถเรียกใช้SET var_name=var_valueการตั้งค่าตัวแปรสภาพแวดล้อมในเซสชั่นดอสปัจจุบันหรือSETX var_name var_valueที่จะตั้งอย่างถาวร: ดูชุดและsetX การตั้งค่าท้องถิ่นก็น่าสนใจเช่นกัน
WillC

สำหรับ Unix / Linux โดยทั่วไปคุณสามารถเรียกใช้source ~/.bashrcเพื่อเรียกใช้.bashrcไฟล์ที่แก้ไขซ้ำและรับค่าใหม่ในเซสชันปัจจุบันของคุณได้
WillC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.