שימוש בסיסי ב autotools

מטרת המדריך

מטרת מדריך זה להשלים את הפער בין החומר התאורטי הנלמד בכתה או מספר לימוד, לבין העבודה המעשית על המערכת.

למי מיועד המדריך

המדריך מיועד לתלמידים המתחילים את הלימוד התאורטי של שפת C, וזקוקים להדרכה כיצד לכתוב ולהדר את התכניות הראשונות שלהם במערכת GNU/Linux.

על איזו מערכת נבנה המדריך

המדריך נבנה על מערכת Debian GNU/Linux אך כל מערכת לינוקס תתאים. הוראות ההתקנה המדוייקות ספציפיות למערכת מבוססת Debian GNU/Linux, אך ינתנו הסברים כלליים גם עבור מערכות אחרות.

לפני תחילת העבודה

עברו על המדריך לכתיבת תכנית בשפת C ובשימוש במהדר gcc ובדקו שאתם שולטים בכתיבה, הידור והרצה של תכניות C פשוטות:

הידור בעזרת gcc ו make

כמו שראינו במדריכים לשימוש ב gcc ו make, הידור בעדרת פקודות ישירות ל gcc ו make עלול להיות משעמם כאשר מדובר בפרויקט גדול המכיל קבצים רבים. לשם כך נבנו מספר מערכות שבאות למכן את התהליך, מדריך זה ידגים שימוש ב gnu autotools לצורך מיכון התהליך.

autotools

כלי האוטומציה של גנו הם מערכת של כלים המקלים על יצירה ותחזוקה של פרוייקטים גדולים. מדריך זה יסביר רק שימוש פשוט ב autotools כדאי לקרוא על שימושים מתקדמים יותר בתכנה באתר gnu

מדריך שימוש ב gnu automake

מדריך שימוש ב gnu autoconf

מהם כלי האוטמציה של גנו ?

כאשר מדברים על כלי האוטומציה של גנו מתכוונים בד”כ לאוסף כלי עזר, בין הכלים השימושיים יותר:

autoconf

automake

libtool

gettext

מדריך זה יעסוק בעיקר בשני הכלים הראשונים.

מדוע משתמשים בכלי אוטומציה ?

כלי האוטמציה עוזרים למפתחים לייצר קוד קל יותר לתחזוקה המתאים למערכות רבות. הכלים גם עוזרים לאורזי החבילות ליצור חבילות שלמות ונוחות יותר לשימוש. יש מספר רב של כלי אוטומציה, מדריך זה יעסוק בכלי האוטומציה של גנו.

נפוצות כלי האוטומציה של גנו, איפשרה את התיקנון של תהליך ההתקנה של חבילת קוד חדש:

./configure
make
sudo make install

אנו מכירים ממדריך ה make את הפקודות make ו make install אך פה קיימת פקודה חדשה.

מה עושה תסריט ה configure ?

תסריט ההגדרות בוחן את המערכת עליה ניבנה הקוד ומשנה קבצי קוד (בד”כ config.h) ו Makefile כך ש make ישתמש בכלים המצויים במערכת והתכנה שתבנה תתאים למערכת.

פרויקט לדוגמה 1, תכנית להרצה:

נכתוב את הפרויקט hello world, הפרויקט יכלול קובצי קוד c ואת הקבצים הדרושים עבור כלי האוטומציה של גנו.

1. בנית עץ מדריכים בסיסי:

תחילה נבנה עץ מדריכים סטנדרטי, מדריך שורש בשם הפרויקט ובתוכו מדריך בשם src שיכיל את קבצי הקוד שלנו. הפקודה:

~$ mkdir helloworld
~$ mkdir helloworld/src
~$ cd helloworld/

תייצר את עץ המדריכים שלנו:

~/helloworld$ ls -R
.:
src

./src:

2. כתיבת הקוד:

נכנס למדריך המכיל את הקוד ונכתוב קובץ 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 ולראות אלו הגדרות בדיוק מופיעות בו.

3. כתיבת שלד תסריט ה configure :

בספרית השורש (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

4. כתיבת שלד תסריטי ה Makefile (עבור כל מדריך בפרויקט) :

בספרית השורש נכתוב קובץ Makefile.am פשוט שרק מדווח על ספרית הקוד שלנו

# file: Makefile.am
SUBDIRS = src

בספרית הקוד נכתוב קובץ Makefile.am שמסביר מה אנו רוצים להדר ואיך

# file: src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c

5. נוסיף קבצי תעוד הנדרשים כאשר כותבים פרויקט לפי התקנים של גנו

~/helloworld$ touch NEWS README AUTHORS ChangeLog

6. עכשיו אפשר להפעיל את מערכת האוטומציה של הגנו:

ראשית נראה מה יש לנו

~/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

7. בנית הפרויקט שלנו

./configure
make

במידה ונרצה נוכל גם להתקינו במערכת

make install

והרצתו

./src/hello

לפי הדוגמה שהבאנו נדמה כי שימוש בכלי האוטומציה מסורבל ובזבזני. בפרוייקטים מסובכים יותר שימוש בכלי אוטומציה יכול לחסוך עבודה רבה.

תמונות המראות את הפרוייקט שלנו במהלך ההכנה

תמונה המציגה את קבצי המקור שכתבנו

תמונה המציגה את קובץ ה config.h שנוצר ע”י כלי האוטומציה

(לחץ על התמונות כדי לקבל תמונה מוגדלת)

פרויקט לדוגמה 2, שימוש בספריות קבועות:

(*) יצירת ספריות משותפות מתבצע בצורה דומה, אך ע”י שימוש בכלי נוסף libtool.

אנו נשתמש בפרוייקט שכבר כתבנו ונוסיף לו ספריה קבועה libmyprint שתבצע עבורנו את הדפסת מחרוזות הפלט.

1. נוסיף את הקבצים myprint.h ו myprint.c למדריך הקוד

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;
}

2. נשנה את קובץ ה main שלנו כך שישתמש בספריה החדשה שיצרנו

/* 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;
}

3. כעת צריך גם להגדיר את הידור הפרויקט.

נשנה את קובץ ה 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

4. שינויים שצריך לבצע בקובץ ה configure.ac

לפני שאפשר שוב להפעיל את מערכת ה 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

5. כעת שוב נשתמש במערכת האוטומציה של הגנו

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/

כך נראה הפרוייקט הסופי במערכת (מסוף פתוח ומנהל קבצים מראה את ספרית הקוד)

(לחץ על התמונה כדי לקבל תמונה מוגדלת)

איך להמשיך

בהמשך העבודה בודאי תרצו להתקין כלי פיתוח נוספים וספריות פיתוח חדשות. אפשר למצוא מדריכים לשימוש בכלים אלו ברשת ופה באתר.

מדריכי תכנות

מדריכי תכנות - אוסף מדריכי התכנות בפנגווין.

מדריכים/שימוש_בסיסי_ב_autotools.txt · שונה לאחרונה ב: 2008/06/19 18:34 (עריכה חיצונית)
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0