অন্য মেকফাইল থেকে মেকফিলকে কীভাবে কল করবেন?


125

আমি অন্য থেকে এক মেকফিলকে কল করে কিছু অপ্রত্যাশিত ফলাফল পাচ্ছি। আমার দুটি মেকফাইল রয়েছে, একটি কল /path/to/project/makefileএবং একটি কল /path/to/project/gtest-1.4.0/make/Makefile। আমি প্রাক্তন কলটি পরে থাকার চেষ্টা করছি। ইন / পাথ / টু / প্রজেক্ট / মেকফিল, আমার আছে

dev: $(OBJ_FILES)
  $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)
  $(MAKE) -f ./gtest-1.4.0/make/Makefile

clean:
  rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
  rm -f ../svn-commit.tmp~
  rm -f $(BIN_DIR)/$(PROJECT)
  make -f gtest-1.4.0/make/Makefile clean

এবং /path/to/project/gtest-1.4.0/make/Makefileআমি আছে

all: $(TESTS)

clean:
  rm -f $(TESTS) gtest.a gtest_main.a *.o

নিম্নলিখিত জারি:

cd /path/to/project
make

আউটপুট:

make -f ./gtest-1.4.0/make/Makefile
make[1]: Entering directory `/path/to/project'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/path/to/project'

যাইহোক, আমি যখন এই আদেশগুলি জারি করি:

cd /path/to/project
make clean

আমি দেখি:

make -f gtest-1.4.0/make/Makefile clean
make[1]: Entering directory `/path/to/project'
rm -f  gtest.a gtest_main.a *.o
make[1]: Leaving directory `/path/to/project'

আমি বুঝতে পারি না: উভয় ক্ষেত্রেই, /path/to/project/makefileএটি আমাকে বলছে এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে প্রবেশ করছে। প্রথম ক্ষেত্রে, এটি এটি করার কাজ করে বলে মনে করে না (যখন এটি করে) এবং দ্বিতীয় ক্ষেত্রে এটি উপযুক্ত নির্দেশ খুঁজে পেতে সক্ষম হয় (যখন আউটপুট আমাকে বলছে যে এটি ভুল ডিরেক্টরিতে দেখছে) তবুও এটি চেষ্টা করে rmকমান্ড চালাতে /path/to/project, পরিবর্তে /path/to/makefile/gtest-1.4.0/make/

আমি কি একে অপরের কাছ থেকে মেকফিলগুলি কল করার জন্য মৌলিক কিছু অনুভব করছি? আমি কি একটি প্রচলিত ধারণাগত ভুল করেছি, বা একটি সাধারণ ক্ষতি করেছি? আমি কীভাবে কার্যকরভাবে ডিরেক্টরিগুলি পরিবর্তন করব এবং প্রথম থেকে দ্বিতীয় মেকফিল কল করব? আমার বোঝা ছিল যে কেবল কল make -f <name>করা যথেষ্ট হবে be

এটি বেশে 3.81 মেক / গেমেক।


3
আমি মনে করি, আপনার পরিবর্তে make -f gtest-1.4.0/make/Makefile cleanআরও ভাল বলুন $(MAKE) -C gtest-1.4.0/make clean। কেন আপনি নকল লক্ষ্য নির্ধারণ করেন নি?
dma_k

উত্তর:


112

আপনি যা জিজ্ঞাসা করছেন তা আমি সত্যিই পরিষ্কার করছি না, তবে -fকমান্ড লাইন বিকল্পটি ব্যবহার করে কেবল একটি ফাইল নির্দিষ্ট করা হয় - এটি ডিরেক্টরি পরিবর্তন করতে বলে না। আপনি যদি অন্য ডিরেক্টরিতে কাজটি করতে চান তবে আপনাকে ডিরেক্টরিতে যেতে cdহবে:

clean:
    cd gtest-1.4.0 && $(MAKE) clean

নোট করুন যে প্রতিটি লাইন Makefileএকটি পৃথক শেলের মধ্যে চলে, সুতরাং ডিরেক্টরিটি ফিরে ফেরার দরকার নেই।


67
ম্যানুয়ালি cdদিরের সাথে যুক্ত হওয়ার পরিবর্তে gtest-1.4.0আপনার -Cবিকল্পটি ব্যবহার করা উচিত make
টেডার

29
অথবা খুব কমপক্ষে, আপনার অবশ্যই &&সিডি এবং মেক কমান্ডের মধ্যে ব্যবহার করা উচিত । অন্যথায় সিডি ব্যর্থ হলে এটি এখনও চলবে make clean... ভুল ডিরেক্টরিতে !! $(MAKE)পুনরাবৃত্তি করার makeসময় আপনার কেবল সর্বদা ব্যবহার করা উচিত , কখনই খালি শব্দ নয়। সুতরাং এর মতো কিছু: cd gtest-1.4.0 && $(MAKE) clean
ম্যাডসায়েন্টিস্ট


1
এই প্রশ্নটি জিনু -মেক সম্পর্কে -Cএবং এই অনুচ্ছেদে রয়েছে
Cas

123

পরিবর্তে -fএর makeআপনি ব্যবহার করতে চাইতে পারেন -C <path>বিকল্প। এটি প্রথমে পথে ' <path>' তে পরিবর্তন করে এবং তারপরে makeসেখানে কল করে।

উদাহরণ:

clean:
  rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
  rm -f ../svn-commit.tmp~
  rm -f $(BIN_DIR)/$(PROJECT)
  $(MAKE) -C gtest-1.4.0/make clean

1
এই উপায়টি সেরা বলে মনে হচ্ছে। অন্যান্য উত্তরগুলি আসুন যা ব্যবহার cdকরে টার্মিনালটি অসীম লুপে প্রবেশ করবে।
gbmhunter

M (মেক করুন) -সি গেস্ট-১.৪.০ / ক্লিন মেক করা আমার পক্ষে কাজ করে না। আমি মনে করি এটি $ (MakeE) হওয়া উচিত
C গেস্ট-১.৪.০


1

এটি পরিষ্কার বলে মনে হচ্ছে $(TESTS)এটি খালি তাই আপনার 1.4.0 মেকফিলটি কার্যকরভাবে কার্যকর

all: 

clean:
  rm -f  gtest.a gtest_main.a *.o

আসলে, কিছুই করার কিছু নেই। এবং পরিষ্কার এটি যা বলে ঠিক তাই করেrm -f gtest.a ...


T (টেস্টস) a wildcardএবং a দিয়ে সংজ্ঞায়িত করা হয়েছে patsubst, তবে এগুলি মূল মেকফাইল থেকে খালি ফিরে আসছে, কারণ ডিরেক্টরিটি কার্যকরভাবে পরিবর্তন করা হচ্ছে না। ভালো চোখে।
ক্রিস টংকিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.