কীভাবে সনাক্ত করতে পারি যে আমি রাস্পবেরি পাইয়ের জন্য সংকলন করছি?


24

যেহেতু রাস্পবেরি পাইকে C/C++কিছু হার্ডওয়্যার বৈশিষ্ট্য অ্যাক্সেসের জন্য (যেমন আমি কল করছি bcm_host_init()) কিছু বিশেষ কোডের প্রয়োজন (আমি কথা বলছি )। আমি এটি স্বয়ংক্রিয়ভাবে সনাক্ত করার জন্য একটি নির্ভরযোগ্য এবং মার্জিত উপায় সন্ধান করছি। আমি মনে করি না এমন কোনও সংকলক #definesরয়েছে যেমন _WIN32আমি অপব্যবহার করতে পারি, সুতরাং এটির CMake( এটি শেল স্ক্রিপ্টগুলি কার্যকর করতে পারে) থেকে এটি সনাক্ত করা যথেষ্ট। আমি পদ্ধতিটিও সবচেয়ে বেশি কাজ করতে চাই যদি সমস্ত ডিস্ট্র্র না হয়।

ওয়ান ওয়ে আমি মনে করতে পারেন যে, আমি যেমন জন্য চেহারা পারে /opt/vc/include/bcm_host.hফাইল (যা কঠিন নয়), এবং এছাড়াও চেক করুন যে স্থাপত্য এআরএম (যা কম্পাইল সময়ে সহজ হিসাবে আছে #defineযে জন্য ম্যাক্রো, যেমন __arm__এর __ARMEL__)। এই অতিরিক্ত খিলান চেকটি যখন অন্য কোনও মেশিনে আপনার ক্রস-সংকলন পরিবেশ থাকে তবে বর্তমানে ক্রস-সংকলন করছেন না তখন মিথ্যা-ইতিবাচক প্রতিরোধ করা। এর চেয়ে আলাদা কি আর ভাল উপায় আছে?

উত্তর:


20

আপনার কোডটির উপর নির্ভর করে বৈশিষ্ট্যগুলির জন্য কনফিগার / সংকলন সময় যাচাইয়ের উপায়। নির্দিষ্ট ডিভাইসগুলির জন্য চেক করা সমস্যাযুক্ত কারণ মিথ্যা-ধনাত্মক বিষয়গুলি এড়ানো কার্যত অসম্ভব (কোনও ব্যক্তি খুব কম চেষ্টা করেও ইচ্ছাকৃতভাবে আপনার সাথে মিথ্যা বলতে পারে) এবং এই ধরনের চেকগুলির উদ্দেশ্য এই প্রশ্নের উত্তর দেওয়া: "আমি কি এখানে তৈরি করতে পারি? হ্যাঁ যদি কোন কোডের পথটি হওয়া উচিত আমি ব্যবহার করছি? " , না "এটি কি এমন একটি ডিভাইস যা আমি নামটি পছন্দ করি?"


এই রেফারেন্স অনুসারে (সাধারণভাবে পূর্বনির্ধারিত ম্যাক্রোর উপর তথ্যের একটি দুর্দান্ত উত্স) আপনি ম্যাক্রোটি ব্যবহার করতে পারেন:

__arm__

জিসিসি / আর্ম সংমিশ্রণ সনাক্ত করতে।

আমি আমার সাথে এটি পরীক্ষা করে দেখলাম:

#include <stdio.h>

int main() {
  #ifdef __arm__
  printf("Why yes it is, thank you\n");
  #endif
  return 0;
}

যা প্রকৃতপক্ষে বার্তাটি মুদ্রণ করেছিল।

নোট করুন যে এটি ফেলবো সব আর্ম ডিভাইস, তাই আমার সুপারিশ আপনার বিল্ড টুল (যেমন অংশ ব্যবহার করতে হবে cmake/autoconfউপস্থিতি চেক করতে) /opt/vc/include/bcm_host.hহিসাবে ভাল।

উদাহরণস্বরূপ সঙ্গে

AC_CHECK_HEADERS
অটোকনফে:

AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)

কারণসমূহ:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

কনফিগার্ডে সংজ্ঞায়িত করা

অথবা সিএমকে:

include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)

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

আপনি যদি সত্যিই এটি দেখতে চান তবে এটি একটি পাই (বা পর্যাপ্তরূপে অনুরূপ) আপনি এমন কিছু সাধারণের মতো অবলম্বন করতে পারেন:

grep -o BCM2708 /proc/cpuinfo

বা (রাস্পেরপি 2 এবং 3 এর জন্য):

grep -o BCM2709 /proc/cpuinfo

কনফিগার সময়, যা এসসির সাথে মিলবে রাস্পবেরি পাই ভিত্তিক।

আপনি আরও কয়েকটি পরীক্ষায় ফেলতে পারেন (উদাহরণস্বরূপ ইউএসবি আপনাকে এটি আরও কিছুটা খুঁজে বের করতে সহায়তা করবে এবং এটি কোনও মডেল এ বা বি ডিভাইস থাকলেও ইঙ্গিত দেবে), তবে কিছুই নিশ্চিতভাবে বলা যথেষ্ট নয়।

আপনি কোনও পরিচিত তালিকার বিপরীতে / বুটে ফাইলগুলির হ্যাশগুলি পরীক্ষা করতে পারেন তবে ফার্মওয়্যার আপডেট বা এমন একটি বেসরকারী তথ্য নেই যা আপনি জানেন না তবে আপনি তৈরি করতে পারবেন না। (বা একই বুটিং সেটআপ সহ অন্যান্য অনুরূপ নন-পাই ডিভাইস)


সম্ভবত আমার ধারণার বর্ণনা যথেষ্ট পরিষ্কার ছিল না, তবে __ARMEL__সংজ্ঞায়িত উপায়টি ঠিক আপনার মতো __arm__। আমি এখনও সেরা ম্যাক্রো সন্ধান করতে বিরক্ত করি নি।
তাপিও

আমি আমার ধারণার বিবরণটি স্পষ্ট করতে সংশোধন করেছিলাম যে ফাইলটিও অনুসন্ধান করা সমস্যা নয় - আমি এটি করার বিভিন্ন উপায় এবং আরও ভাল উপায় খুঁজছি, আমি যে উপস্থাপন করেছি সেটিকে কীভাবে প্রয়োগ করা যায় না।
তাপিও

@ ট্যাপিও - আমি মনে করি না এটি সঠিক সমস্যা - এমনকি আপনি যদি এটি পাই হিসাবে প্রমাণ করেন তবে আপনার পাই নির্দিষ্ট কোড তৈরির জন্য শিরোলেখ ফাইলগুলি ছাড়া তথ্য অকেজো। এমনকি যদি আপনি একটি বিসিএম নন-পাই ডিভাইস খুঁজে পান তবে আপনি পাইটির জন্য যে কোডটি লিখেছেন তা সম্ভবত এটি একই সূত্রে ভিত্তি করে যদি ঠিকঠাক চলবে।
ফ্লেক্সো

তুমি ঠিক. এই চিন্তাটি আমার মনকে অতিক্রম করেছিল, তবে আমি এটি সম্পর্কে যথেষ্ট ভাবিনি। যাইহোক, আপনার সম্পাদনাগুলি এটিকে একটি দুর্দান্ত উত্তর হিসাবে গ্রহণযোগ্যত করে তোলে।
তাপিও

2
পরীক্ষা করুন /opt/vc/include/bcm_host.h- ফাইলটি (সংকলন) হোস্ট মেশিনে সেই জায়গায় থাকার সম্ভাবনা না থাকায় ক্রস-সংকলনের জন্য কীভাবে এটি কাজ করে? একইভাবে grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfoসংকলন হোস্ট সনাক্ত করতে যাচ্ছে লক্ষ্য না ...?
স্লিএসভেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.