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