CMake (विंडोज) में एक उपयोगकर्ता पर्यावरण चर कैसे प्राप्त करें


104

मुझे पता है कि CMAKE का उपयोग करके एक सामान्य मशीन चौड़े पर्यावरण चर को कैसे प्राप्त किया जाए

$ENV{EnvironmentVariableName}

लेकिन मैं एक उपयोगकर्ता विशिष्ट पर्यावरण चर प्राप्त नहीं कर सकता। क्या यह संभव है और कैसे?


2
मुझे लगता है कि आपको इस प्रश्न को हटा देना चाहिए, क्योंकि यह दिए गए उत्तर के साथ कुछ नहीं जोड़ता है।
टॉम ब्रिटो

11
यह सीएमके में पर्यावरण संस्करण को पुनः प्राप्त करने का पहला Google हिट है। यह थोड़ा अजीब हो सकता है कि सवाल में पहले से ही उत्तर है, लेकिन इसे आईएमओ को नहीं हटाया जाना चाहिए।
एंड्रियास हैफेरबर्ग

2
यह सवाल और जवाब कितने उथल-पुथल में है, जब जवाब पूरी तरह से "कुछ नहीं" है?
लुडविक

3
@Ludwik क्योंकि यह इस समस्या का जवाब देता है कि उपयोगकर्ता विशिष्ट पर्यावरण चर CMake लिपियों में उपलब्ध नहीं हैं।
रॉबर्ट

3
समस्या का हिस्सा यह है कि "उपयोगकर्ता विशिष्ट पर्यावरण चर" और "सामान्य मशीन विस्तृत पर्यावरण चर" के बीच विभाजन एक अवधारणा है जो विंडोज के लिए बहुत विशिष्ट है। यूनिक्स जैसी प्रणालियां परवाह नहीं करतीं कि पर्यावरण चर कहां सेट होते हैं; वे सभी समान हैं।
जेम्स मूर

जवाबों:


83

अपने CMake स्क्रिप्ट में चर प्राप्त करना

आप cmake मंगलाचरण के साथ लाइन पर एक चर पारित कर सकते हैं:

FOO=1 cmake

या BASH में एक चर निर्यात करके:

export FOO=1

तब आप इसका उपयोग करके एक cmake स्क्रिप्ट में चुन सकते हैं:

$ENV{FOO}

13

तुम भी आह्वान कर सकते हैं स्वयं इसे क्रॉस-प्लेटफ़ॉर्म तरीके से करने के लिए:

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

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

संशोधित वातावरण में कमांड चलाएँ।


बस ध्यान रहे कि यह केवल पहली बार काम कर सकता है। यदि सीएमके लगातार बिल्ड में से एक के साथ फिर से कॉन्फ़िगर करता है (आप सिर्फ उदाहरण के लिए कॉल करते हैं make, तो एक CMakeLists.txtको बदल दिया गया था और सीएमके फिर से पीढ़ी प्रक्रिया के माध्यम से चलता है), उपयोगकर्ता परिभाषित पर्यावरण चर अब (सिस्टम वाइड पर्यावरण चर की तुलना में) नहीं हो सकता है।

इसलिए मैं अपनी परियोजनाओं में सीएमके कैश्ड वैरिएबल में उन उपयोगकर्ता परिभाषित पर्यावरण चर को हस्तांतरित करता हूं:

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

आपको अपने चर का निर्यात करना होगा। तो उदाहरण के लिए लिनक्स में:

export EnvironmentVariableName=foo

CMAKE में अनएक्सपोर्टेड वैरिएबल खाली हैं।


5
आप उन्हें निर्यात नहीं है! उदाहरण: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), आह्वान COVERAGE=1 cmake ..:। दी, मैं सामग्री की जाँच नहीं करता, और मुझे नहीं पता कि यह होगा या नहीं। लेकिन यह निश्चित रूप से परीक्षण के लिए काम करता है कि क्या यह परिभाषित है या नहीं!
Janus Troelsen

1
यदि आप पिछली लाइनों पर चर को परिभाषित करते हैं, तो आपको निर्यात की आवश्यकता है। केवल एक ही लाइन पर परिभाषित चर को निर्यात की आवश्यकता नहीं होती है, लेकिन सवाल यह नहीं है कि आप इसे एक तरह से या दूसरे तरीके से कर सकते हैं।
एलेक्सिस विलके

1

पर्यावरण चर (जो कि आप सिस्टम गुण का उपयोग करके संशोधित करते हैं) केवल एक नया उप-संस्करण बनाते समय उपखंडों के लिए प्रचारित किया जाता है।

यदि आपके पास एक कमांड लाइन प्रॉम्प्ट (डॉस या साइबरविन) खुला है जब आपने उपयोगकर्ता एनवी संस्करण बदल दिए हैं, तो वे दिखाई नहीं देंगे।

उपयोगकर्ता सेटिंग्स बदलने के बाद आपको एक नई कमांड लाइन प्रॉम्प्ट खोलने की आवश्यकता है।

यूनिक्स / लिनक्स में बराबर आपके .bash_rc में एक पंक्ति जोड़ रहा है: आपको मूल्यों को प्राप्त करने के लिए एक नया शेल शुरू करने की आवश्यकता है।


Windows के लिए आप भी चला सकते हैं SET var_name=var_valueवर्तमान डॉस सत्र में वातावरण चर सेट करने के लिए, या SETX var_name var_valueदेखें: यह स्थायी रूप से स्थापित करने के लिए सेट और setxस्थानीय सेट भी दिलचस्प हो सकता है।
2

यूनिक्स / लिनक्स के लिए आप आम तौर पर source ~/.bashrcसंशोधित .bashrcफ़ाइल को फिर से चलाने और अपने मौजूदा सत्र में नए मान प्राप्त करने के लिए दौड़ सकते हैं ।
WillC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.