עם הגעת התוכנה קוד פתוח והקבלה של פתרונות אלו ביצירת מערכות מורכבות, היכולת לפתח אפליקציות שיכולות לרוץ בצורה חלקה על מספר פלטפורמות חומרה הופכת לחשובה מאוד. קיימת צורך קבוע לפתח את התוכנה על ארכיטקטורה אחת אך לקבל את היכולת להריץ אותם על ארכיטקטורות יעד אחרות. טכניקה נפוצה להשגת כך היא קריסה מרובה של האפליקציה עבור ארכיטקטורת היעד.
קרוס-קומפילציה חשובה במערכות מוטבעות שבהן המטרה היא להריץ אפליקציות על חומרה מותאמת כמו לוחות ARM ו-PowerPC. מערכות אלה מוגבלות במשאבים ולכן קומפילציה ישירה אינה אופציה. לכן, מפתחים יעשו שימוש בארכיטקטורת x86 המקובלת כמארח וישתמשו בצרפי כלים ספציפיים לחומרה היעד, יוצרים בינאריים שתואמים את החומרה היעד.
מאמר זה מכסה מקרה מחקר אחד בו נעשתה קרוס-קומפילציה של חבילת קוד פתוח עבור PowerPC. המאמר יכסה את פרטי כלי העבודה והצרפים שנעשה בהם שימוש ומדריך שלב אחר שלב על איך הושגה קרוס-קומפילציה עבור ארכיטקטורה זו.
Tההצהרת בעיה
בנתונה לוח מטרה עם ממשק PowerPC, הכוונה הייתה להוסיף יכולות ניתוב לשכבת L3 ללוח זה. למטרה זו, נחשב פרוטוקול ניתוב פתוח פופולרי, FRRouting (FRR).
FRR הוא סוויטת פרוטוקולים שמאפשרת לכל מכונת Linux להתנהג כמו נתב מלא. הוא מועטר עבור amd64, arm64, armhf, ו-i386 אך לא עבור PowerPC. כל זה דרש את הקמתו של FRR באמצעות צלילה.
Build host | target host | |
---|---|---|
מניאת מעבד |
x86_64 |
Powerpc(32-ביט) |
מערכת הפעלה |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12GB |
1GB |
Table 1. Difference in Build and Target platform
The Cross-Compilation Journey
ישנם שני שלבים עיקריים בצינור ההרכבה הצלבית:
הגדרת סביבת הבנייה וצינור הכלים המקדים שהורכבו מראש
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. התקנת ספריות מהחבילות
חבילות הספריות הזמינות עבור ארכיטקטורת היעד ניתן להתקין לתוך sysroot של סביבת הכלי בשתי דרכים:
- הדרך הראשונה משתמשת בכלי
dpkg-deb
המבוסס על Ubuntu/Debian כדי להתקין חבילות Debian ישירות כפי שמופיע למטה:Shell$ 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
כפי שמוצג להלן:Plain Text$ ar -x <package>.deb
$ tar -xJf data.tar.xz
הערה: השיטה זו שימושית למערכות ללא תמיכה ב־
dpkg-deb
. - לחילוץ חבילת RPM, יש להשתמש בכלי
rpm2cpio
כפי שמופיע בפקודה הבאה:Plain Text$ rpm2cpio <package>.rpm | cpio -idmv
-
דוגמא לחילוץ חבילות והצבת קבצים עם libcap:
Shell# חילץ חבילת .deb
$ ar -x libcap-dev_2.24-12_powerpc.deb
# יוחלצו שלושה קבצים (control.tar.gz, data.tar.xz, debian-binary)
$ ls
control.tar.gz data.tar.xz debian-binary libcap-dev_2.24-12_powerpc.deb
# data.tar.xz מכיל את קבצי התוכנית של החבילה
# control.tar.gz מכיל מטא-נתונים של החבילה
# debian-binary מכיל את גרסת פורמט קובץ deb
# פתח את data.tar.xz כדי לחלץ את קבצי התוכנית של החבילה.
$ tar -xJf data.tar.xz
# הערה: rpm2cpio <package>.rpm יחלץ ישירות קבצי תוכנית.
# עשה את אותו הדבר עבור כל חבילות Debian או RPM תלויות באותו נתיב, זה יחלץ את כל קבצי התוכנית והסמלינקים הנחוצים באותה מבנה ספרייה.
# הקבצים שחולצו תחת usr/lib, usr/include ו־usr/bin יש להעתיק אותם לנתיב הספריית הכלים /usr, לצד הקבצים הקיימים כבר.
$ cp usr/include/sys/capability.h /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/usr/include/sys/
-
כדי לוודא אם החבילות/ספריות הותקנו בהצלחה, יש להפעיל את הפקודה הבאה:
Shell# וודא שניתן לייצא את משתנה הסביבה PKG_CONFIG_PATH מקובץ env של הכלי
$ pkg-config --list-all | grep <package_library_name>
הערה: התקן
pkg-config
אם עדיין לא מותקן.
- לחילוץ חבילת Debian, יש להשתמש בכלים
2. ספריות קרוס-קומפייל
חבילות הספריות לא זמינות עבור ארכיטקטורת היעד וממומשות מהמקור. לפני התחלת הקימופלציה, טען את קובץ הסביבה שאוחסן עם כלי הפיתוח כדי להגדיר את כל הפרמטרים הדרושים לקרוס-קומפילציה.
$ source <env_file_path>
עקוב אחר השלבים לקימופלציה המצוינים בקובץ ה-README של הספרייה. בנוסף, הגדר את הפרמטרים הבאים בשלבי הנצירה:
- הגדר את הפרמטר
--host
בעת הרצת התסריט./configure
Shell$ ./configure --host=<target_host_parameter>
# Example:
$ ./configure --host=powerpc-fsl-linux
הערה:
- <target_host_parameter> הוא המערכת שבה הספרייה/הכלי מועברים. ניתן למצוא את המילה המשותפת בקובץ הסביבה של כלי הכלים. זוהי תחילית נפוצה הנמצאת ב-$CC, $LD וכו'
- ישנם שני סוגי ספריות תלויות. האחד דרוש רק לתהליך ההידור, והשני הוא דרישת תלות לביצוע במארח היעד. עליך להגדיר את הפרמטר
--host
בהתאם.
- כאשר משתמשים ב־"make install" כדי לבנות ספריות תלויות, יש להגדיר את DESTDIR לתיקיית sysroot של הכלי.
Shell
$ make DESTDIR=<toolchain_directory_path> install
Examlple:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
הסיכום
ההבדלים בארכיטקטורת המערכת, בספריות, בתלות ובצרופים של כלי הפיתוח עושים את הצלחת כיבוי מרובה להיות טכניקה מורכבת לביצוע. כדי להקל על המורכבויות, מאמר זה חושף את שלבי ההפעלה האטרקטיים. FRR ו-PowerPC נלקחו כדוגמאות לתוכנה הרצויה ולחומרת היעד, בהתאם. עם זאת, השלבים שכוספרו במאמר זה מספקים אסטרטגיה סבירה לכיבוי מרובה של כל תוכנה על חומרת מסוימת. ההגדרות של הסביבה, הצרפים והתלות עשויות להשתנות בהתאם לדרישות.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation