مع ظهور البرمجيات مفتوحة المصدر وقبول هذه الحلول في إنشاء أنظمة معقدة، تصبح القدرة على تطوير تطبيقات يمكن أن تعمل بسلاسة عبر منصات الأجهزة المتعددة أمرًا مهمًا بطبيعة الحال. هناك حاجة مستمرة لتطوير البرمجيات على بنية واحدة ولكن مع القدرة على تنفيذها على بنى مستهدفة أخرى. إحدى التقنيات الشائعة لتحقيق ذلك هي الترجمة المتقاطعة لـ التطبيق للبنية المستهدفة.
الترجمة المتقاطعة مهمة في الأنظمة المدمجة حيث الهدف هو تشغيل التطبيقات على أجهزة متخصصة مثل لوحات ARM و PowerPC. هذه الأنظمة محدودة الموارد وبالتالي لا يعتبر التجميع المباشر خياراً. لذلك، سيستفيد المطورون من بنية x86 الشائعة كمضيف ويستخدمون أدوات محددة للأجهزة المستهدفة، مولدين ملفات ثنائية متوافقة مع الأجهزة المستهدفة.
تتناول هذه المقالة حالة دراسة واحدة حيث تم إجراء الترجمة المتقاطعة لحزمة مفتوحة المصدر لـ PowerPC. ستتناول المقالة تفاصيل الأدوات وسلاسل الأدوات المستخدمة ودليل خطوة بخطوة حول كيفية تحقيق الترجمة المتقاطعة لهذه البنية.
البيان المشكلة
بفرض وجود لوحة هدفية بتقنية PowerPC، كان الهدف هو إضافة قدرات توجيه L3 إلى هذه اللوحة. لهذا الغرض، تم النظر في مجموعة بروتوكولات التوجيه مفتوحة المصدر الشهيرة، FRRouting (FRR).
FRR هو مجموعة بروتوكولات تمكن أي آلة تعمل بنظام Linux من التصرف كـ موجه كامل الخصائص. إنه متاح حزمة لـ amd64 وarm64 وarmhf و i386 ولكن ليس لـ PowerPC. هذا استلزم إعادة تجميع FRR عبر الأنظمة.
Build host | target host | |
---|---|---|
معمارية المعالج |
x86_64 |
Powerpc(32-bit) |
نظام التشغيل |
أوبونتو 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12 جيجابايت |
1 جيجابايت |
جدول 1 . الفرق في البناء ومنصة الهدف
رحلة التجميع المتقاطع
هناك مرحلتان رئيسيتان في الترجمة المتقاطعة:
تكوين بيئة البناء وسلسلة أدوات مُعدة مُسبقًا
1. قم بتثبيت أدوات البناء المطلوبة في البيئة. تشمل أدوات البناء الشائعة autoconf، make، cmake، build-essentials، pkg-config، libtool، إلخ.
2. قم بإعداد سلسلة الأدوات المُعدة مُسبقًا المحددة لبيئة الجهاز المستهدف. تقدم شركات المعالج/اللوحة الخاصة بها سلاسل أدوات معمارية خاصة بها. تم الحصول على سلسلة أدوات معينة للوحة الهدف من موقع المنتج للبائع.
3. تأتي سلسلة الأدوات مع ملف بيئي، يُستخدم لتعيين المتغيرات البيئية مثل CC، GCC، PKG_CONFIG_PATH، الخ، المطلوبة للترجمة المتقاطعة. قم بتحرير ملف البيئة /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
وقم بتحديث مسار المتغيرات بالنسبة لمسار دليل سلسلة الأدوات.
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
حل الاعتماديات في مجموعة أدوات ما قبل التجميع
كل برنامج له مجموعة خاصة من الاعتماديات (أدوات/مكتبات)، والتي يجب حلها قبل التجميع المتقاطع.
اعتمادًا على توفر الحزم الخاصة بهذه الأدوات/المكتبات في بنية الهدف، هناك خياران لحلها. إما تثبيتها مباشرة من الحزم المتاحة أو تجميعها أيضًا من المصدر.
بالنسبة لتجميع FRR، يجب بناء مكتبات libpcre2 و libyang و clippy و libelf و json-c من المصدر. بخلاف ذلك، كانت حزم مكتبات protobuf و libcap متاحة لبنية PPC (PowerPC)، والتي يمكن تثبيتها مباشرة في مجموعة أدوات ما قبل التجميع.
1. تثبيت المكتبات من الحزم
يمكن تثبيت حزم المكتبات المتاحة لبنية الهدف في نظام مجموعة أدوات ما قبل التجميع باستخدام طريقتين:
- الطريقة الأولى تستخدم أداة
dpkg-deb
المعتمدة على Ubuntu/Debian لتثبيت حزم Debian مباشرة كما هو مذكور أدناه:شل$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#مثال على libcap:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
ملاحظة:
- قم بتنزيل جميع حزم الاعتماد وثبتها بالترتيب.
- قد يتم تثبيت حزم المكتبة في بنية دليل مختلفة. انسخ تلك الملفات المكتبية إلى الدلائل الصحيحة وفقًا لسلسلة الأدوات.
- بالطريقة الثانية، يتم استخراج حزم Debian/RPM ووضعها يدويًا في مسار دليل أدوات التجميع كما هو مذكور أدناه:
لاستخراج حزمة Debian، استخدم أدواتar
وtar
كما هو مذكور أدناه:ملاحظة: يعتبر هذا الأسلوب مفيدًا للأنظمة التي لا تدعم
dpkg-deb
.لاستخراج حزمة rpm، استخدم أداة
rpm2cpio
كالأمر أدناه:مثال لاستخراج الحزم ووضع الملف مع مثال لـ libcap:
للتحقق مما إذا تم تثبيت الحزم/المكتبات بنجاح، قم بتشغيل الأمر أدناه:
2. تجاوز تجميع المكتبات
الحزم الخاصة بالمكتبات غير متوفرة للهندسة المعمارية المستهدفة ويتم تجميعها من المصدر. قبل بدء التجميع، قم بتحميل ملف البيئة المجمع مع سلسلة الأدوات لتعيين جميع المعلمات اللازمة المطلوبة للتجميع المتقاطع.
$ source <env_file_path>
اتبع خطوات التجميع المعطاة في ملف README الخاص بالمكتبة. بالإضافة إلى ذلك، ضبط المعلمات التالية في خطوات إجراء البناء:
- تعيين
--host parameter
عند تشغيل نصي./configure
Shell$ ./configure --host=<target_host_parameter>
# مثال:
$ ./configure --host=powerpc-fsl-linux
ملاحظة:
- <target_host_parameter> هو النظام الذي يتم بناء المكتبة/الأداة من أجله. يمكن العثور عليه في ملف البيئة الخاص بسلسلة الأدوات. إنه بادئة شائعة توجد في $CC، $LD، إلخ.
- سيكون هناك نوعان من المكتبات التابعة. الأول مطلوب فقط لعملية الجمع، والآخر هو متطلب تبعي للتنفيذ على جهاز الاستضافة المستهدف. قم بتعيين
--host parameter
وفقًا لذلك.
- عند استخدام “make install” لبناء المكتبات المعتمدة، قم بتعيين DESTDIR إلى دليل sysroot الخاص بأداة السلسلة.
شل
$ make DESTDIR=<مسار_دليل_أداة_السلسلة> install
مثال:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
الاستنتاج
تجعل الفروقات في هياكل الأنظمة، والمكتبات، والتبعيات، وأدوات التطوير تقنية التحويل المتقاطع تقنية معقدة للتنفيذ. لتبسيط الأمور، يكشف هذا المقال عن مراحل التحويل المتقاطع. تم اتخاذ FRR و PowerPC كأمثلة عن البرنامج المطلوب والأجهزة المستهدفة على التوالي. ومع ذلك، توفر الخطوات المشمولة في هذا المقال استراتيجية معقولة لتحويل أي برنامج على أجهزة محددة. ستتغير إعدادات البيئة وأدوات التطوير والتبعيات بناءً على المتطلبات.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation