কীভাবে সিএমকে (উইন্ডোজ) ব্যবহারকারীর পরিবেশের পরিবর্তনশীলটি পুনরুদ্ধার করবেন


106

আমি জানি যে কীভাবে CMAKE ব্যবহার করে একটি সাধারণ মেশিন প্রশস্ত পরিবেশের পরিবর্তনশীল পুনরুদ্ধার করতে পারি

$ENV{EnvironmentVariableName}

তবে আমি কোনও ব্যবহারকারী নির্দিষ্ট পরিবেশের পরিবর্তনশীলটি পুনরুদ্ধার করতে পারি না। এটা কি সম্ভব এবং কিভাবে?


4
আমি মনে করি আপনার কেবল এই প্রশ্নটি মুছে ফেলা উচিত, কারণ এটি প্রদত্ত উত্তরের সাথে কোনও কিছুই যুক্ত করে না।
টম ব্রিটো

11
এটি সিএমকে পরিবেশগত ভারগুলি কীভাবে পুনরুদ্ধার করবেন তার প্রথম গুগল হিট। এটি কিছুটা অদ্ভুত হতে পারে যে প্রশ্নটিতে ইতিমধ্যে উত্তর রয়েছে তবে এটি আইএমও মোছা উচিত নয়।
Andreas হাফারবার্গ

4
উত্তরটি পুরোপুরি "কিছুই না" থাকাকালীন এই প্রশ্ন ও উত্তরের এতগুলি উত্স কীভাবে হবে?
লুডভিক

4
@ লুডভিক কারণ এটি সমস্যার উত্তর দেয় যে ব্যবহারকারী নির্দিষ্ট পরিবেশের ভেরিয়েবলগুলি সিএমকে স্ক্রিপ্টগুলিতে উপলব্ধ নয়।
রবার্ট

4
সমস্যার অংশটি হ'ল "ব্যবহারকারী নির্দিষ্ট পরিবেশের ভেরিয়েবল" এবং "নরমাল মেশিন ওয়াইড এনভায়রনমেন্ট ভেরিয়েবল" এর মধ্যে বিভাজন একটি ধারণা যা উইন্ডোজের সাথে খুব নির্দিষ্ট। ইউনিক্স-এর মতো সিস্টেমগুলি পরিবেশের ভেরিয়েবলগুলি সেট করা আছে সেগুলি যত্ন করে না; তারা সব একই।
জেমস মুর

উত্তর:


86

আপনার সিএমকে স্ক্রিপ্টে ভেরিয়েবলগুলি পাওয়া

আপনি চক্রের অনুরোধের সাথে লাইনে একটি ভেরিয়েবল পাস করতে পারেন:

FOO=1 cmake

বা বেসে ভেরিয়েবল রফতানি করে:

export FOO=1

তারপরে আপনি এটিকে ব্যবহার করে একটি চতুর স্ক্রিপ্টে তুলতে পারেন:

$ENV{FOO}

14

আপনি অনুরোধ করতে পারেন ক্রস প্ল্যাটফর্ম উপায়ে নিজেই এটি করতে:

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 ..। মঞ্জুর, আমি বিষয়বস্তুগুলি যাচাই করি না, এবং জানি না এটি কী না। তবে এটি অবশ্যই এটি পরীক্ষার জন্য কাজ করে যদি এটি সংজ্ঞায়িত হয় বা না হয়!
জানুস ট্রয়লসেন

4
আপনি যদি পূর্ববর্তী লাইনে ভেরিয়েবলগুলি সংজ্ঞায়িত করেন তবে আপনার রফতানি দরকার। কেবল একই লাইনে সংজ্ঞায়িত চলকগুলিকে রফতানির প্রয়োজন হয় না, তবে আপনি এটি একভাবে বা অন্যভাবে করেন কিনা তা আমরা নির্ধারণ করতে পারি না।
অ্যালেক্সিস উইল্ক

1

পরিবেশের ভেরিয়েবলগুলি (যেটি আপনি সিস্টেমের বৈশিষ্ট্যগুলি ব্যবহার করে সংশোধন করেছেন) কেবলমাত্র নতুন সাবশেল তৈরি করার সময় কেবল সাব-শেলগুলিতে প্রচার করা হয়।

আপনি যখন ব্যবহারকারী এনভ ভার্স পরিবর্তন করেছেন আপনার যদি কমান্ড লাইন প্রম্পট (ডস বা সাইগউইন) খোলা থাকে, তবে তারা প্রদর্শিত হবে না।

আপনি ব্যবহারকারী সেটিংস পরিবর্তন করার পরে একটি নতুন কমান্ড লাইন প্রম্পট খোলার প্রয়োজন।

ইউনিক্স / লিনাক্সের সমতুল্য আপনার .bash_rc এ একটি লাইন যুক্ত করছে: মানগুলি পেতে আপনার একটি নতুন শেল শুরু করা দরকার।


উইন্ডোজের জন্য আপনি SET var_name=var_valueবর্তমান ডস সেশনে পরিবেশ পরিবর্তনশীল SETX var_name var_valueসেট করতে বা স্থায়ীভাবে সেট করতে চালাতে পারেন: সেট এবং সেটেক্স দেখুনস্থানীয় সেট এছাড়াও আকর্ষণীয় হতে পারে।
উইলসি

ইউনিক্স / লিনাক্সের জন্য আপনি সাধারণত source ~/.bashrcপরিবর্তিত .bashrcফাইলটি আবার চালাতে এবং আপনার বর্তমান সেশনে নতুন মানগুলি পেতে চালাতে পারেন।
উইলসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.