টার্মিনাল সহজেই একটি OpenSSL সংস্করণ জানায়, আর সোর্স ট্রি এখনও অনুপস্থিত ক্রিপ্টো হেডার নিয়ে ব্যর্থ হয়। দুটি বাক্যই একসাথে সত্য, কারণ রানটাইম টুল আর বিল্ড ইনপুট আলাদাভাবে সরবরাহ করা হয়। এই চারটি যাচাই ক্রমানুসারে করুন: ইনস্টল করা প্যাকেজ, ডিসকভারি আউটপুট, সার্চ পাথ, তারপর সোর্স নিজেই সামঞ্জস্যপূর্ণ কি না। পুরোনো নির্ভরতা তালিকা পেস্ট করার বদলে যে যাচাইটি ব্যর্থতার ব্যাখ্যা দেয় সেখানেই থামুন।

রানটাইম ও বিল্ড ইনপুট ভিন্ন প্যাকেজ

একটি ডিস্ট্রিবিউশন OpenSSL-কে ভাগ করে একটি রানটাইম প্যাকেজে, যা শেয়ার্ড লাইব্রেরি ও কমান্ড-লাইন টুল দেয়, এবং একটি ডেভেলপমেন্ট প্যাকেজে, যা হেডার, ভার্সনহীন লিংকার নাম ও pkg-config মেটাডেটা দেয়। প্রথমটি ইনস্টল করলে দ্বিতীয়টি ইনস্টল হয় না, আর কম্পাইলারের শুধু দ্বিতীয়টি দরকার।

আপনি কী ইনস্টল করেছিলেন বলে মনে করেন তার বদলে কী সত্যিই উপস্থিত আছে তা দেখুন। Debian-ভিত্তিক সিস্টেমে ডেভেলপমেন্ট প্যাকেজ সাধারণত libssl-dev, আর রানটাইম হলো একটি ভার্সনযুক্ত লাইব্রেরি প্যাকেজ এবং openssl বাইনারি।

dpkg -l | grep -E 'libssl-dev|libssl3|openssl'
pkg-config --modversion openssl
openssl version

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

বিল্ডের নিজস্ব ডিসকভারি আউটপুট পড়ুন

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

প্রকল্পটি কোন মডিউল সংস্করণ ব্যবহার করে তা নিশ্চিত করুন, কারণ সোর্স ট্রির ভেতরে থাকা বান্ডল করা কপিটি ইনস্টল করা CMake-এর সঙ্গে আসা কপির চেয়ে ভিন্নভাবে আচরণ করতে পারে। তারপর কম্পোনেন্ট তালিকা পড়ুন: যে প্রকল্প শুধু Crypto চায় তার SSL লাইব্রেরি দরকার নেই, আর যে প্রকল্প SSL চায় সেটি ব্যর্থ হবে যদি ডেভেলপমেন্ট প্যাকেজের কেবল একটি অংশ উপস্থিত থাকে।

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
grep -i -E 'openssl|ssl' build/CMakeCache.txt

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

বিল্ডকে সঠিক ইনস্টলেশনের দিকে সংকীর্ণভাবে নির্দেশ করুন

অনুমোদিত OpenSSL যদি ডিফল্ট সার্চ পাথের বাইরে থাকে, FindOpenSSL OPENSSL_ROOT_DIR-কে সেই নির্দিষ্ট বিল্ডের জন্য একটি সংকেত হিসেবে নথিভুক্ত করে। Unix-সদৃশ সিস্টেমে এটি pkg-config-ও দেখে, তাই উপযুক্ত PKG_CONFIG_PATH কিছুই বৈশ্বিকভাবে না বদলে সাহায্য করতে পারে।

cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release
ldd build/vpn_client | grep -i ssl

প্রথম কমান্ডটি সংকেতটিকে একটি বিল্ড ডিরেক্টরিতে সীমাবদ্ধ করে, আর দ্বিতীয়টি দেখায় ফলস্বরূপ বাইনারি রানটাইমে কোন শেয়ার্ড লাইব্রেরি লোড করবে। যে বিল্ড উদ্দিষ্ট প্রিফিক্সের সঙ্গে লিংক করে আর যে বাইনারি ভিন্ন একটি লোড করে, তা রানটাইম পাথের সমস্যা, ডিসকভারির সমস্যা নয়, এবং এর জন্য আরেকটি কনফিগার ফ্ল্যাগের বদলে rpath বা লোডার কনফিগারেশনের সিদ্ধান্ত দরকার।

এই পছন্দগুলো বিল্ডের ভেতরেই সীমিত রাখুন। একটি প্রকল্প খুশি করতে সিস্টেম লাইব্রেরি প্রতিস্থাপন বা বৈশ্বিক pkg-config ফাইল সম্পাদনা করাই একটি কাজ করা ডেস্কটপকে ভাঙা ডেস্কটপে পরিণত করার পথ। যে বিল্ড ডিরেক্টরি প্রিফিক্স রেকর্ড করে তা পুনরুৎপাদনযোগ্য; মেশিনজুড়ে পরিবর্তন হলো পরবর্তী প্রকল্পের অপেক্ষায় থাকা একটি সাপোর্ট ঘটনা। সংকেত বদলালে বিল্ড ডিরেক্টরি মুছে ফেলুন, যাতে ক্যাশে পুরোনো উত্তর ধরে রাখতে না পারে।

কখন সমস্যাটি সোর্সেই তা জানুন

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

OpenSSL 3 পুরোনো VPN ক্লায়েন্টরা সরাসরি ব্যবহার করা কয়েকটি ইন্টারফেস অপ্রচলিত ঘোষণা করেছে এবং সরিয়ে দিয়েছে, তাই সেই যুগের সোর্স ট্রির নতুন include পাথের বদলে সত্যিকারের পরিবর্তন লাগতে পারে। রক্ষণাবেক্ষকরা যদি চলমান সংস্করণ সমর্থন করেন, সেটিই ব্যবহার করুন। যদি না করেন, সিদ্ধান্তটি সেবার মালিকের, পুরোনো লাইব্রেরি ফাইলের নাম খোঁজার নয়।

ঐচ্ছিক ডেস্কটপ কম্পোনেন্টেরও নিজস্ব চাহিদা আছে। পরিষ্কারভাবে কনফিগার হওয়া একটি কমান্ড-লাইন টার্গেট GUI টুলকিট ও এডিটর বিল্ড হবে কি না সে বিষয়ে কিছুই বলে না, তাই পুরোনো Qt প্যাকেজ তালিকাকে স্পেসিফিকেশন নয়, ইতিহাস হিসেবে দেখুন। কোন ইন্টারফেস ডিফল্টে চালু আছে তা সোর্স রিভিশনের নিজস্ব অপশনে দেখুন। তারপর শুধু যা দরকার তাই বিল্ড করুন, কারণ প্রতিটি ঐচ্ছিক নির্ভরতা অপেক্ষায় থাকা আরেকটি ডিসকভারি সমস্যা।

সম্পর্কিত নিবন্ধ