يطبع الطرفية نسخة OpenSSL بكل ارتياح، ومع ذلك تظل شجرة المصدر تفشل برسالة عن ترويسات تشفير مفقودة. العبارتان صحيحتان في الوقت نفسه، لأن أداة وقت التشغيل ومجموعة مدخلات البناء تُشحن بشكل منفصل. نفّذ هذه الفحوص الأربعة بالترتيب: الحزم المثبتة، ومخرجات الاكتشاف، ومسارات البحث، ثم ما إذا كان المصدر نفسه متوافقًا. توقّف عند أول فحص يفسّر الفشل بدلًا من لصق قائمة اعتماديات قديمة.

وقت التشغيل ومدخلات البناء حزمتان مختلفتان

تقسّم التوزيعة OpenSSL إلى حزمة وقت تشغيل توفّر المكتبة المشتركة وأداة سطر الأوامر، وحزمة تطوير توفّر الترويسات وأسماء الربط بلا إصدار وبيانات pkg-config الوصفية. تثبيت الأولى لا يثبّت الثانية، والمترجم يحتاج الثانية فقط.

افحص ما هو موجود فعلًا لا ما تتذكر أنك ثبّته. في الأنظمة المشتقة من Debian تكون حزمة التطوير عادةً libssl-dev، بينما وقت التشغيل حزمة مكتبة بإصدار مضافًا إليها ثنائي openssl.

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

يعرض الأمر الأول أي من الثلاثة مثبّت، ويعرض الثاني الإصدار الذي سيكتشفه نظام البناء عبر pkg-config، ويعرض الثالث إصدار وقت التشغيل. سطر مفقود في المخرجات الأولى يفسّر الخطأ فورًا. اختلاف الإصدار بين الثاني والثالث مشكلة أخرى، ويعني عادةً أن تثبيتين يتنافسان.

اقرأ مخرجات الاكتشاف الخاصة بالبناء

معظم حالات الفشل مرئية في سجل الإعداد إذا قرأته قبل الملخص. تُبلّغ وحدة FindOpenSSL في CMake عن دليل التضمين والمكتبات التي وجدتها، وتفشل برسالة محددة عند غياب مكوّن مطلوب.

تأكد من إصدار الوحدة الذي يستخدمه المشروع، لأن نسخة مضمّنة داخل شجرة المصدر قد تتصرف بشكل مختلف عن النسخة المشحونة مع 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 العامة لإرضاء مشروع واحد هو الطريق الذي يحوّل سطح مكتب عاملًا إلى سطح مكتب معطّل. دليل بناء يسجّل البادئة قابل لإعادة الإنتاج؛ أما تغيير على مستوى الجهاز فهو حادثة دعم تنتظر المشروع التالي. احذف دليل البناء عند تغيير التلميح، حتى لا تحتفظ الذاكرة المؤقتة بالجواب القديم.

اعرف متى يكون المصدر هو المشكلة

خطوة إعداد ناجحة تثبت فقط أن الفحوص اكتملت. قد يرفض التجميع واجهة برمجية يتوقعها المصدر، وقد يفشل الربط بسبب رمز مفقود. احتفظ بأول خطأ محدد من كل مرحلة، لأن الأخطاء اللاحقة عادةً نتائج.

أعلن OpenSSL 3 إهمال عدة واجهات وأزالها، وهي واجهات يستخدمها عملاء VPN الأقدم مباشرة، لذا قد تحتاج شجرة مصدر من تلك الحقبة تغييرات حقيقية بدلًا من مسار تضمين جديد. إذا كان المشرفون يدعمون إصدارًا حاليًا فاستخدمه. وإذا لم يفعلوا، فالقرار يخص من يملك الخدمة، لا البحث عن اسم ملف مكتبة أقدم.

مكوّنات سطح المكتب الاختيارية لها متطلباتها أيضًا. هدف سطر أوامر يُعدّ بنظافة لا يقول شيئًا عن إمكانية بناء مجموعة أدوات الواجهة الرسومية والمحرر، لذا تعامل مع قائمة حزم Qt القديمة كتاريخ لا كمواصفات. تحقق من خيارات مراجعة المصدر نفسها لمعرفة الواجهات الممكّنة افتراضيًا. ثم ابنِ فقط ما تحتاجه، لأن كل اعتمادية اختيارية مشكلة اكتشاف أخرى تنتظر الحدوث.

مقالات ذات صلة