מטרת מדריך זה להשלים את הפער בין החומר התאורטי הנלמד בכתה או מספר לימוד, לבין העבודה המעשית על המערכת.
המדריך מיועד לתלמידים המתחילים את הלימוד התאורטי של שפת C, וזקוקים להדרכה כיצד לכתוב ולהדר את התכניות הראשונות שלהם במערכת GNU/Linux.
המדריך נבנה על מערכת Debian GNU/Linux אך כל מערכת לינוקס תתאים. הוראות ההתקנה המדוייקות ספציפיות למערכת מבוססת Debian GNU/Linux, אך ינתנו הסברים כלליים גם עבור מערכות אחרות.
עברו על המדריך לכתיבת תכנית בשפת C ובשימוש במהדר gcc ובדקו שאתם שולטים בכתיבה, הידור והרצה של תכניות C פשוטות:
כמו שראינו במדריכים לשימוש ב gcc ו make, הידור בעדרת פקודות ישירות ל gcc ו make עלול להיות משעמם כאשר מדובר בפרויקט גדול המכיל קבצים רבים. לשם כך נבנו מספר מערכות שבאות למכן את התהליך, מדריך זה ידגים שימוש ב gnu autotools לצורך מיכון התהליך.
כלי האוטומציה של גנו הם מערכת של כלים המקלים על יצירה ותחזוקה של פרוייקטים גדולים. מדריך זה יסביר רק שימוש פשוט ב autotools כדאי לקרוא על שימושים מתקדמים יותר בתכנה באתר gnu
כאשר מדברים על כלי האוטומציה של גנו מתכוונים בד”כ לאוסף כלי עזר, בין הכלים השימושיים יותר:
autoconf
automake
libtool
gettext
מדריך זה יעסוק בעיקר בשני הכלים הראשונים.
כלי האוטמציה עוזרים למפתחים לייצר קוד קל יותר לתחזוקה המתאים למערכות רבות. הכלים גם עוזרים לאורזי החבילות ליצור חבילות שלמות ונוחות יותר לשימוש. יש מספר רב של כלי אוטומציה, מדריך זה יעסוק בכלי האוטומציה של גנו.
נפוצות כלי האוטומציה של גנו, איפשרה את התיקנון של תהליך ההתקנה של חבילת קוד חדש:
./configure make sudo make install
אנו מכירים ממדריך ה make את הפקודות make ו make install אך פה קיימת פקודה חדשה.
תסריט ההגדרות בוחן את המערכת עליה ניבנה הקוד ומשנה קבצי קוד (בד”כ config.h) ו Makefile כך ש make ישתמש בכלים המצויים במערכת והתכנה שתבנה תתאים למערכת.
נכתוב את הפרויקט hello world, הפרויקט יכלול קובצי קוד c ואת הקבצים הדרושים עבור כלי האוטומציה של גנו.
תחילה נבנה עץ מדריכים סטנדרטי, מדריך שורש בשם הפרויקט ובתוכו מדריך בשם src שיכיל את קבצי הקוד שלנו. הפקודה:
~$ mkdir helloworld ~$ mkdir helloworld/src ~$ cd helloworld/
תייצר את עץ המדריכים שלנו:
~/helloworld$ ls -R .: src ./src:
נכנס למדריך המכיל את הקוד ונכתוב קובץ main.c
/* file: helloworld/src/main.c */
#include <config.h>
#include <stdio.h>
int
main (int argc, char* argv[])
{
printf ("%s\n", PACKAGE_STRING);
printf ("Hello world\n");
return 0;
}
בדוגמה זו אנו משתמשים ב config.h כדי לקבל את המקרו PACKAGE_STRING. קובץ זה מכיל הגדרות שנוצרו בעת הרצת תסריט ה configure , כדאי לפתוח את הקובץ config.h ולראות אלו הגדרות בדיוק מופיעות בו.
בספרית השורש (helloworld) נכתוב את הקובץ configure.ac שישמש כבסיס עבור תכנות האוטומציה להכנת תסריט ה configure.
dnl file: configure.h AC_INIT([helloworld],[1.0], [bugs@project_mail.com]) AM_INIT_AUTOMAKE([-Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT
בספרית השורש נכתוב קובץ Makefile.am פשוט שרק מדווח על ספרית הקוד שלנו
# file: Makefile.am SUBDIRS = src
בספרית הקוד נכתוב קובץ Makefile.am שמסביר מה אנו רוצים להדר ואיך
# file: src/Makefile.am bin_PROGRAMS = hello hello_SOURCES = main.c
~/helloworld$ touch NEWS README AUTHORS ChangeLog
ראשית נראה מה יש לנו
~/helloworld$ ls -R .: AUTHORS ChangeLog Makefile.am NEWS README configure.ac src ./src: Makefile.am main.c
נפעיל את כלי האוטומציה autoreconf ונבקש ממנו להתקין את הקבצים החסרים בפרויקט שלנו
~/helloworld$ autoreconf --install
זהו, סיימנו את הכנת הפרויקט. נתבונן בקבצים שמערכת כלי האוטומציה יצרה עבורנו
:~/helloworld$ ls -R .: AUTHORS INSTALL NEWS autom4te.cache configure.ac missing COPYING Makefile.am README config.h.in depcomp src ChangeLog Makefile.in aclocal.m4 configure install-sh ./autom4te.cache: output.0 output.1 requests traces.0 traces.1 ./src: Makefile.am Makefile.in main.c
./configure make
במידה ונרצה נוכל גם להתקינו במערכת
make install
והרצתו
./src/hello
לפי הדוגמה שהבאנו נדמה כי שימוש בכלי האוטומציה מסורבל ובזבזני. בפרוייקטים מסובכים יותר שימוש בכלי אוטומציה יכול לחסוך עבודה רבה.
תמונות המראות את הפרוייקט שלנו במהלך ההכנה
תמונה המציגה את קבצי המקור שכתבנו
תמונה המציגה את קובץ ה config.h שנוצר ע”י כלי האוטומציה
(לחץ על התמונות כדי לקבל תמונה מוגדלת)
(*) יצירת ספריות משותפות מתבצע בצורה דומה, אך ע”י שימוש בכלי נוסף libtool.
אנו נשתמש בפרוייקט שכבר כתבנו ונוסיף לו ספריה קבועה libmyprint שתבצע עבורנו את הדפסת מחרוזות הפלט.
myprint.h
/* file: src/myprint.h */ #ifndef MYPRINT_H #define MYPRINT_H int myprint (const char* string); #endif /* MYPRINT_H */
myprint.c
בקוד של הספריה נשתמש במקרו חדש TEXT_TEMPLATE שניצור מאוחר יותר בעזרת תסריט ה configure בתוך הקובץ config.h
/* file: src/myprint.c */
#include <config.h>
#include <stdio.h>
#include <myprint.h>
int
myprint (const char* string)
{
printf (TEXT_TEMPLATE, string);
return 0;
}
/* file: helloworld/src/main.c */
#include <config.h>
#include <myprint.h>
int
main (int argc, char* argv[])
{
myprint (PACKAGE_STRING);
myprint ("Hello world");
return 0;
}
נשנה את קובץ ה Makefile.am כך שתיווצר לנו ספריה libmyprint
כדי להדגים שימוש בדגלים עבור תסריט ה configure הכננו קובץ Makefile.am שמסוגל לייצר שני סוגים שונים של Makefile הראשון מתקין את הספריה במערכת והשני משתמש בספריה שימוש פרטי ליצירת תכנית הריצה שלנו ואינו מתקין את הספריה במערכת.
# file: src/Makefile.am # check user configure flags if ENABLE_INSTALL_LIB # make the library myprint and install it lib_LIBRARIES = libmyprint.a libmyprint_a_SOURCES = myprint.c myprint.h include_HEADERS = myprint.h else # make the library myprint but do not install it noinst_LIBRARIES = libmyprint.a libmyprint_a_SOURCES = myprint.c myprint.h endif # make the program hello bin_PROGRAMS = hello hello_SOURCES = main.c # the program hello is using the myprint library hello_LDADD = libmyprint.a
לפני שאפשר שוב להפעיל את מערכת ה autotools צריך גם לשנות את קובץ ה configure.ac.
א. לצורך הידור ספריה קבועה, נעשה שימוש במקרו AC_PROG_RANLIB.
ב. מאחר ורצינו שני סוגים של קבצי Makefile, נגדיר גם פרמטר חדש עבור תסריט ה configure ע”י שימוש במקרו AC_ARG_ENABLE
ג. הוספת המקרו TEXT_TEMPLATE שבו השתמשנו בספריה החדשה שיצרנו
dnl file: configure.h AC_INIT([helloworld],[1.0], [bugs@project_mail.com]) AM_INIT_AUTOMAKE([-Wall -Werror]) AC_PROG_CC AC_PROG_RANLIB AC_CONFIG_HEADERS([config.h]) dnl add --enable-install-lib parameter to the configure script AC_ARG_ENABLE([install-lib], [AS_HELP_STRING([--enable-install-lib], [install the myprint library])], [installlibs=yes], [installlibs=no]) dnl if user enabled lib instalation set ENABLE_INSTALL_LIB to true AM_CONDITIONAL([ENABLE_INSTALL_LIB], [test "$installlibs" = "yes"]) dnl add a text template macro AC_DEFINE([TEXT_TEMPLATE], ["%s\n"], [a text template]) AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT
על המקרואים המוגדרים ואיך להשתמש בהם אפשר לקרוא באתר הגנו http://www.gnu.org/software/autoconf
autoreconf --install
וזהו, יש לנו פרויקט מוכן שיכול או להתקין את הספריה או לא, לפי בקשת המפתח. כדי לראות את הדגל החדש שהוספנו נוכל להריץ את תסריט ה configure
./configure --help ... Optional Features: ... --enable-install-lib install the myprint library ...
אם נריץ את תסריט ה configure עם הדגל enable-install-lib כאשר נתקין את התכנה ע”י הפקודה make install תכנית ההתקנה תתקין גם את הספריה myprint.
המדריך מציג רק קצת מהאפשרויות של מערכת האוטומציה של גנו חומר נוסף על המערכת אפשר למצוא באתר של הגנו
http://www.gnu.org/software/automake/
http://www.gnu.org/software/autoconf/
כך נראה הפרוייקט הסופי במערכת (מסוף פתוח ומנהל קבצים מראה את ספרית הקוד)
(לחץ על התמונה כדי לקבל תמונה מוגדלת)
בהמשך העבודה בודאי תרצו להתקין כלי פיתוח נוספים וספריות פיתוח חדשות. אפשר למצוא מדריכים לשימוש בכלים אלו ברשת ופה באתר.
מדריכי תכנות - אוסף מדריכי התכנות בפנגווין.