আমি কীভাবে মেকফাইলে $ পাথের সাথে দির যুক্ত করতে পারি?


91

আমি একটি মেকফিল লিখতে চাই যা পরীক্ষাগুলি চালাবে। পরীক্ষাগুলি একটি ডিরেক্টরি './tests' এ রয়েছে এবং পরীক্ষা করতে হবে এক্সিকিউটেবল ফাইলগুলি ডিরেক্টরি './bin' এ রয়েছে।

আমি যখন পরীক্ষাগুলি চালাই, তারা এক্সিকিউটিভ ফাইলগুলি দেখতে পাবে না, ডিরেক্টরি হিসাবে ./bin $ PATH তে নেই।

যখন আমি এই জাতীয় কিছু করি:

EXPORT PATH=bin:$PATH
make test

সবকিছু সচল. তবে আমাকে মেকফাইলে $ PATH পরিবর্তন করতে হবে।

সাধারণ মেকফিল সামগ্রী:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

এটি পাথটি সঠিকভাবে প্রিন্ট করে, তবে এটি x ফাইলটি খুঁজে পায় না।

আমি যখন ম্যানুয়ালি এটি করি:

$ export PATH=bin:$PATH
$ x

সবকিছু ঠিক আছে তখন।

আমি কীভাবে মেকফিলের $ PATH পরিবর্তন করতে পারি?


আপনি কি কেবল এক্সিকিউটেবল ডিরেক্টরি থেকে পরীক্ষাগুলি কল করতে পারবেন না ../test/test_to_run? আমি যদি প্রশ্নটি ভুল বুঝে থাকি তবে দুঃখিত।
ক্রিস

আমি চাইছি এই ফাইলটি সাধারণত পরীক্ষার জন্য দৃশ্যমান হয়। আমি ডিরেক্টরিগুলির সাথে খেলতে চাই না, কারণ আমি রিফ্যাক্টরিং এটি একটি নিকটতম হবে।
সিজমন লিপিস্কি

আপনি এর নিকটে আসতে পারেন কেবলমাত্র মেকফাইলটি ভেরিয়েবল ডিক্স সহ একটি শেল স্ক্রিপ্ট লিখে এবং তারপরে পিতামাতার শেল উত্সের সাথে সেই স্ক্রিপ্টটি থাকে .। এটি সম্ভবত অযৌক্তিক।
মাইকেল স্মিথ

উত্তর:


108

আপনি কী নিজেকে তৈরি করার exportনির্দেশিকা চেষ্টা করেছিলেন (ধরে নিলেন যে আপনি জিএনইউ মেক ব্যবহার করেন)?

export PATH := bin:$(PATH)

test all:
    x

এছাড়াও, আপনার মধ্যে একটি বাগ রয়েছে উদাহরণস্বরূপ:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

প্রথমত, মান হচ্ছে echoএড PATHশেল নয়, মেক দ্বারা সম্পাদিত ভেরিয়েবলের সম্প্রসারণ expansion যদি এটি তখন প্রত্যাশিত মানটি প্রিন্ট করে, আমার ধারণা, আপনি PATHআগে নিজের মেকফিল বা মেককে অনুরোধ করা একটি শেল দিয়ে কিছু পরিবর্তনশীল স্থাপন করেছেন । এই জাতীয় আচরণ রোধ করতে আপনার ডলার এড়ানো উচিত:

test all:
    PATH=bin:$$PATH
    @echo $$PATH
    x

দ্বিতীয়ত, কোনও ক্ষেত্রে এটি কাজ করবে না কারণ মেক রেসিপিটির প্রতিটি লাইন একটি পৃথক শেলের মধ্যে কার্যকর করে । একক লাইনে রেসিপি লিখে এটি পরিবর্তন করা যেতে পারে:

test all:
    export PATH=bin:$$PATH; echo $$PATH; x

7
$(PATH)PATHশেল ইনভোকেটিং মেকের মান সেট করবে । অনুযায়ী ম্যানুয়াল , "প্রত্যেক এনভায়রনমেন্ট ভেরিয়েবল করতে দেখেন যে, যখন সেটি শুরুর একই নাম ও মান একটি মেক পরিবর্তনশীল রুপান্তরিত করা হয়েছে।"
এমিল সিট

রফতানি নির্দেশনাটি আমার জন্য কাজ করেছে (ধন্যবাদ!) তবে আমি জিএনইউ মেক 4.3 ইনস্টল করার পরেই। সংস্করণ 3.81 (MacOS মধ্যে Catalina উপর ডিফল্ট) সালে, আপডেট PATHসঠিকভাবে ভেরিয়েবল (প্রতিফলিত হয় echo $(PATH)) এবং কমান্ড কাজের পরিবেশ (মধ্যে env, which python, bash -c python), কিন্তু যখন কমান্ডের জন্য এক্সিকিউটেবল লোকেটিং ব্যবহার করা যেতে বলে মনে হচ্ছে না: COMMAND pythonএখনো সঞ্চালিত হয় পাইথন আসল উপর নির্বাহযোগ্য PATH
ডক্টফ্রেড

30

ডিজাইন দ্বারা makeপার্সার পৃথক শেল আহ্বানে রেখাগুলি সম্পাদন করে, একারণে ভেরিয়েবল (উদাহরণস্বরূপ PATH) পরিবর্তন করে, পরবর্তী পংক্তির জন্য পরিবর্তনটি প্রয়োগ করা যাবে না (এই পোস্টটি দেখুন )।

এই সমস্যার সমাধানের জন্য একটি উপায় হ'ল একাধিক কমান্ডকে একক লাইনে রূপান্তর করা (আলাদা করা ;), বা ওয়ান শেল বিশেষ লক্ষ্য ব্যবহার করুন ( .ONESHELLGNU Make 3.82 হিসাবে)।

বিকল্পভাবে আপনি PATHযখন শেলটি চাওয়া হয় তখন চলক সরবরাহ করতে পারেন । উদাহরণ স্বরূপ:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash

4
আমি পদ্ধতির পছন্দ!
অ্যালান ফ্রানজোনি

4
এটি সেরা, কারণ এটি এমনকি $(shell)অনুরোধের সাথেও কাজ করে ! : ডি উদাহরণ: pastebin.com/Pii8pmkD
PsychoX

Dev.azure এ আমি পেয়েছি: env: 'env': এরকম কোনও ফাইল বা ডিরেক্টরি নেই; স্থানীয়ভাবে কাজ করে; /
কামিল ডিজেডজিক

4.2 মেক দিয়ে ডিবিয়ান 10-তে কাজ করে না: make: env PATH = <पथ> / বিন / শ: আদেশ পাওয়া যায় নি। রফতানি কাজ ব্যবহার। ঘরের ডিরের কোনও পথের জন্য not (হোম) এবং না use ব্যবহার নিশ্চিত করুন।
এমকেস্পার

25

আপনি যদি প্রথমে নিজের মেকফাইলে শেল ভেরিয়েবল সেট করেন তবে পাথ পরিবর্তনগুলি অবিচলিত বলে মনে হচ্ছে:

SHELL := /bin/bash
PATH := bin:$(PATH)

test all:
    x

আমি জানি না এটি পছন্দসই আচরণ কিনা or


এটি আমার যা সমস্যা ছিল তা ঠিক করেছে (আমি zsh চালাচ্ছি)। ধন্যবাদ!
জেজেন টমাস

হ্যাঁ, এটি সত্যিই ওপি যা চায় তা করে ... তবে এটি কোনও বৈশিষ্ট্য বা কোনও বাগ? এমনকি মেকুয়ালটির শেল বিভাগটি পড়েও আমি নিশ্চিত নই।
pj

4
এটি আমার পক্ষেও কাজ করে না। whichএবং envএখন নতুন পাঠাও চয়ন করুন, তবে সরাসরি বাইনারি কার্যকর করার পরেও কেবলমাত্র পরিবর্তিত PATH-তে পাওয়া যায় না, কেবলমাত্র মূল প্যাথায়।
কনরাড রুডল্ফ

3

আমি সাধারণত যা করি তা হ'ল এক্সিকিউটেবলের জন্য স্পষ্টভাবে পথ সরবরাহ করা:

EXE=./bin/
...
test all:
    $(EXE)x

আমি এই কৌশলটি কিউইএমইউ-র মতো এমুলেটরের অধীনে অ-নেটিভ বাইনারিগুলি চালানোর জন্য ব্যবহার করি যদি আমি সংকলনটি পার করি:

EXE = qemu-mips ./bin/

যদি মেক শ শেল ব্যবহার করে থাকে তবে এটি কাজ করা উচিত:

test all:
    PATH=bin:$PATH x

হ্যাঁ, শীতল আত্মা, তবে আমি আমার পরীক্ষাগুলিতে পার্ল লিখেছি এবং সরাসরি পারফ স্ক্রিপ্ট থেকে আমার মেকফাইল থেকে নয়, এক্সিকে কল করা দরকার। আমি এই
স্টাফের

গোটচা। কমান্ড লাইনে নিজেই PATH নির্ধারণ সম্পর্কে কীভাবে? উপরের সম্পাদনাটি দেখুন।
রিচার্ড পেনিংটন

-3

PATHভেরিয়েবলটি সেট করতে কেবল মেকফিলের মধ্যেই কিছু ব্যবহার করুন:

PATH := $(PATH):/my/dir

test:
@echo my new PATH = $(PATH)

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