2016-01-27 4 views
15

शायद मुझे कुछ स्पष्ट याद आ रहा है, लेकिन मुझे लगता है कि add_custom_target() के माध्यम से लॉन्च की गई प्रक्रियाओं द्वारा पर्यावरण चर को स्पष्ट रूप से सेट करने का तरीका नहीं लगता है।कस्टम सीएमके लक्ष्य को पारित पर्यावरण चर को कैसे संशोधित करें?

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}") 
add_custom_target(newtarget somecommand) 

दुर्भाग्य से, %PATH% वातावरण चर somecommand को अपरिवर्तित प्रकट होता है:

मैं निम्नलिखित की कोशिश की। (मैंने एक गिस्ट स्थापित किया है जो here समस्या को पुन: उत्पन्न करता है।)

मैं क्या गलत कर रहा हूं?

+0

मैं सुझाव दूंगा कि चूंकि आप एक नई प्रक्रिया (अपनी टिप्पणियों से) बना रहे हैं, तो नई प्रक्रिया को अपना स्वयं का वातावरण प्रदान किया जाएगा, मुख्य प्रक्रिया के पर्यावरण का वारिस नहीं होगा। यदि आप मुख्य प्रक्रिया की बाल प्रक्रिया बनाते हैं, तो पर्यावरण विरासत में होना चाहिए - लेकिन मुझे 'सेमेक' के कुछ भी नहीं पता है, इसलिए मैं यहां से निकल सकता हूं। हालांकि आपको 'बैकस्लैश' का उपयोग निर्देशिका-विभाजक के रूप में करना चाहिए, न कि '/' '/' एक स्विच-उपसर्ग है। कभी-कभी '/' खुशी से काम करता है, लेकिन यह विश्वसनीय नहीं है। – Magoo

उत्तर

13

एक कस्टम लक्ष्य के लिए वातावरण चर की स्थापना का एक पोर्टेबल तरीका कमांड लाइन उपकरण मोड आदेश env CMake का उपयोग करने के लिए है।

12

आप विन्यास कदम पर वातावरण चर सेट है, लेकिन add_custom_target के लिए निर्दिष्ट कमांड निर्माण कदम पर निष्पादित किया जाता है। यह भी देखें CMake पूछे जाने वाले प्रश्न: How can I get or set environment variables?

[...]
वातावरण चर SET CMakeLists.txt में केवल cmake ही (कॉन्फ़िगर समय) के लिए प्रभावी हो, तो आप इस का उपयोग नहीं कर सकते एक पर्यावरण चर सेट करने के लिए विधि कि एक कस्टम कमांड की आवश्यकता हो सकती है (बिल्ड-टाइम)। विभिन्न सीएमके आदेशों द्वारा पर्यावरण परिवर्तनीय समर्थन को छोड़कर (उदा। add_custom_command(), वर्तमान में अभी तक समर्थित नहीं है), एक स्वीकार्य कामकाज के बजाय शेल स्क्रिप्ट को आमंत्रित करने के लिए हो सकता है जो कमांड को निष्पादित करने के लिए लपेटता है।

वर्तमान में add_custom_target (और अन्य आदेशों, जो निर्माण चरण के लिए कार्यों को निर्धारित करता है, उदा add_custom_command) सरल सेटिंग वातावरण चर का समर्थन नहीं करता। लिनक्स पर रिक्त स्थान के बिना सेट वैरिएबल के मान के लिए this bugreport में सलाह दी गई है, तो आप "VAR = VAL" खंडों के साथ कमांड को प्रीपेड कर सकते हैं। सामान्य मामलों के लिए आप आवरण स्क्रिप्ट, जो पर्यावरण setups तैयार करने और वास्तविक आदेश चला सकते हैं:

विंडोज पर:

wrapper.bat:

@ECHO OFF 
set PATH="C:\\Some\\Path;%PATH%" 
%* 

CMakeLists.txt:

add_custom_target(... 
    COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args... 
) 

हे n लिनक्स:

wrapper.sh:

export "PATH=/Some/Path:$PATH" 
eval "$*" 

CMakeLists.txt:

add_custom_target(... 
    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args... 
) 

तो चर का मान विन्यास पर निर्भर करता है, तो आप configure_file साथ आवरण स्क्रिप्ट कॉन्फ़िगर कर सकते हैं।

अद्यतन:

@sakra द्वारा बताया गया है, cmake निष्पादन की env उपकरण मोड एक आवरण स्क्रिप्ट के रूप में इस्तेमाल किया जा सकता:

add_custom_target(... 
    COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args... 
) 

इस तरह CMake 3.2 के बाद उपलब्ध है।

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]... 
Run command in a modified environment. 

उदा .:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand) 

इसके अलावा Command Line Tool Mode देखें:

संबंधित मुद्दे