Make – הבדלי גרסאות

שפת תכנות
תוכן שנמחק תוכן שנוסף
גירסא התחלתית. כתיבה ברצף ללא וידוא פרטי הפרטים וללא שום קישורים
(אין הבדלים)

גרסה מ־19:50, 2 בדצמבר 2019

make הוא הוא כלי תכנה המשמש לבניה אוטומטית של קוד ביצוע וספריות מקבצי מקור. התכנית בגירסתה הראשונית נבנתה ב-1976 כחלק מסביבת יוניקס והיא נמצאת בשימוש נרחב עד היום. התכנית מקבלת כקלט קובץ מסוג makefile שמכיל הוראות בניה לפרויקט מסוים ובונה אותו בפועל.

שימוש

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

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

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

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

הסטוריה

make נוצר במקור על ידי סטיוארט פלדמן באפריל 1976 במעבדות בל. סטיוארט מספר שעמיתו סטיב ג'והנסון (היוצר של YACC) התפרץ ערב אחד למשרדו והתלונן שבזבז יום שלם בנסיון לאתר באג שכבר תוקן, רק משום שהקובץ המתוקן לא עבר הידור מחדש והתיקון לא בא לידי ביטוי בתכנית הסופית. פלדמן שנתקל בבעיות דומות בעצמו החליט ליצור כלי שיפתור את הבעיה. במהלך סוף שבוע יצר גירסא פשוטה וקריאה במיוחד. למרות המימוש הפשוט היתה לתכנית תרומה רבה ביעילות של עבודת הפיתוח. על בנית make קיבל פלדמן את פרס אגודת ACM לשנת 2003.

הפעלה

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

make -f [makefile] target


make היא הפקודה להפעלה (ויכולה להשתנות, לפי שם הפקודה בגירסה המקומית, כגון gmake, nmake וכו')

makefile הוא פרמטר אופציונלי שמציין את שם קובץ ה-makefile. אם לא מצויין, ברירת המחדל היא קובץ ששמו makefile.

target הוא שם אופציונלי של היעד לבצוע, המופיע בקובץ ה-makefile. בהעדרו, יבוצע היעד הראשון בקובץ.

Makefile

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

קובץ makefile מכיל בעיקר רשימה של יעדים. היעדים ירשמו כך:


target: dep1 dep2 dep3
   rule

target יופיע בתחילת שורה. זה היעד. לעיתים קרובות היעד הוא שם קובץ שצריך לבנות אך אפשרי גם יעד ביניים, שהוא שלב בתהליך הבניה של יעד אחר.

dep זו רשימת התלויות. כל פריט ברשימה יהיה שם קובץ כלשהו או יעד אחר בקובץ makefile. אפשר שהרשימה תהיה ריקה. במקרה זה, היעד יבנה בכל מקרה.

rule זו שורת הפקודה שיש להפעיל על מנת ליצור את היעד. אם כל הפריטים ברשימת התלויות ישנים יותר מהיעד, הפקודה לא תבוצע. במקרים רבים, למשל בהידור של קובץ מקור, הפקודה הדרושה לבניה היא קבועה וידועה מראש לתכנית ה-make, ואז אין צורך לפרט אותה.

בין יעד ליעד מפרידה שורה ריקה.

שורה שמתחילה ב-# היא שורת הערה.

קובץ makefile לדוגמא

זו דוגמא לקובץ פשוט במיוחד המשמש לבנית תכנית בקוד C.

הפרויקט מכיל שלושה קבצים של קוד מקור - x.c, y.c ו-z.c, ושני קבצי כותרות m.h ו-n.h, ויוצר קוד ביצוע בשם p.exe

#
# This is a simple stupid makefile example
#

clean:
   rm *.o
 
prog: p.exe

p.exe: x.o y.o z.o
   ln a.o b.o c.o p.exe
 
x.o: x.c m.h b.h
   cc x.c -o x.o
  
y.o: y.c m.h b.h
   cc y.c -o y.o
 
z.o: z.c m.h b.h
   cc z.c -o z.o

אם נקרא לקובץ בשם makefile אזי הפעלה של פקודת make ללא שום פרמטר תמצא את הקובץ על פי שמו ותבצע את היעד הראשון שמופיע בו. זהו clean, אשר ללא תלות בשום קובץ אחר ימחק את כל קבצי המכונה שבתיקיה. כדי לבנות את התכנית p.exe נוכל להשתמש למשל בשורת הפקודה הבאה

 make  prog

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

ראה גם