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

תוכן שנמחק תוכן שנוסף
הוספת קישורים פנימיים
תיקון פרטים והקפדה על תאור דקדוקי נכון. הוספת קישורים פנימיים.
שורה 2:
 
== שימוש ==
השימוש ב-make בא לענות על שתי בעיות עיקריות בפיתוח של פרוייקט תכנה המבוסס על קבצים מרובים של קוד מקור. האחת, במקרה של תלויות בין קבצים, להבטיח שאם אחד הקבצים השתנה יבנו מחדש כל הקבצים התלויים בו. תהליך זה ימשיך באופן [[רקורסיה|רקורסיבי]] בשרשרת התלויות עד שכל הקבצים, ובעיקר קוד הביצוע הסופי יהיו מעודכנים ומתואמים. הבעיה השניה, במקרה של פרוייקט גדול, אם אחד הקבצים השתנה אין צורך לבנות מחדש את כל הקבצים בפרוייקט אלא רק את אלה שתלויים בקובץ שהשתנה. make משווה בין קבצים במערכת על פי [[חותם זמן|חותם הזמן]] שלהם.
 
במודל הפשוט ביותר פרוייקט תכנה מורכב מקבצי קוד מקור. כל אחד מהם עובר [[מהדר|הידור]] כדי ליצור [[קוד מטרה]] (object code) תואם ב[[שפת מכונה]], ובסופו של דבר קבצי קוד המטרה [[מקשר (תוכנה)|מקושרים]] יחד כדי ליצור את התכנית להרצה. אם השתנה אחד מקבצי המקור יש להדר וליצור מחדש את קוד המטרה של אותו קובץ, ולאחר מכל לקחת שוב את כל קבצי המטרה וליצור מחדש את קובץ ההרצה. אין צורך ליצור מחדש את קבצי המכונה האחרים.
שורה 28:
 
== Makefile ==
תכנית make קוראת ומבצעת את הוראות הבניה כפי שהן מתוארות בקובץ ה-makefile. makefile מתאר את הפעולות הדרושות באופן של [[תכנות הצהרתי]]. קובץ ה-makefile ספציפי לכל פרוייקט והוא מכיל את רשימת כל הקבצים הנחוצים לבניה, את קשרי התלויות בין הקבצים ואת ההוראות כיצד לבנות קובץ מתוך הקבצים בהם הוא תלוי. ההוראות יהיו בדרך כלל שורת פקודה במעטפת של מערכת ההפעלה. עיקר העבודה של המשתמשים בתכנית make יהיה בבניית קובץ ה-makefile. לעיתים קרובות ניתן ליצור קובץ כזה באופן אוטמטי מתוך עץ הפרוייקט.
 
קובץ makefile מכיל בעיקר רשימה של חוקים לבנית יעדים. היעדים ירשמו כך:
<div class="mw-content-ltr">
target [target ...]: [component ...]
{{keypress|TAB}}[command 1]
.
.
.
{{keypress|TAB}}[command n]
</div>
 
 
קובץ makefile מכיל בעיקר רשימה של יעדים. היעדים ירשמו כך:
<div class="mw-content-ltr">
target: dep1 dep2 dep3 ...
שורה 36 ⟵ 46:
</div>
 
====== '''target''' ======
'''target''' יופיע בתחילת שורה. זה היעד. לעיתים קרובות היעד הוא שם קובץ שצריך לבנות אך אפשרי גם יעד ביניים, שהוא שלב בתהליך הבניה של יעד אחר. ניתן לרשום יחד כמה יעדים אך בדרך כלל יכיל כל חוק יעד יחיד.
 
====== '''component''' ======
'''dep''' זו רשימת התלויות. כל פריט ברשימה יהיה שם קובץ כלשהו או יעד אחר בקובץ makefile. אפשר שהרשימה תהיה ריקה. במקרה זה, היעד יבנה בכל מקרה.
 
====== '''command''' ======
'''rule''' זו שורת הפקודה שיש להפעיל על מנת ליצור את היעד. אם כל הפריטים ברשימת התלויות ישנים יותר מהיעד, הפקודה לא תבוצע. במקרים רבים, למשל בהידור של קובץ מקור, הפקודה הדרושה לבניה היא קבועה וידועה מראש בתכנית ה-make, ואז אין צורך לפרט אותה.
זו שורת הפקודה שיש להפעיל על מנת ליצור את היעד. השורה חייבת להתחיל ב-TAB. ניתן לרשום מספר פקודות ברצף, שורה אחר שורה.
 
אם לפחות אחד הפריטים ברשימת התלויות חדש יותר מהיעד, הפקודות יתבצעו.
 
'''rule''' זו שורת הפקודה שיש להפעיל על מנת ליצור את היעד. אם כל הפריטים ברשימת התלויות ישנים יותר מהיעד, הפקודה לא תבוצע. במקרים רבים, למשל בהידור של קובץ מקור, הפקודה הדרושה לבניה היא קבועה וידועה מראש בתכנית ה-make, ואז אין צורך לפרט אותה.
 
שורת ה-command אינה תמיד הכרחית. עצם הבדיקה של כל התלויות בשורת היעד תביא לעדכון של כל אחת מהן. לפעמים זה יכול להספיק ואין צורך בעוד חוק לבניה מיוחדת של היעד.
 
הפקודה לביצוע יכולה להיות כל פקודה שמאפשרת המעטפת, ולאו דווקא חלק מתהליך הבניה, למשל שליחת הודעת אימייל המעדכנת על ביצוע הפעולה.
 
גם פקודת make שמבוצעת על makefile אחר היא אפשרית.
 
====== כללים נוספים ======
בין יעד ליעד מפרידה שורה ריקה.
 
שורה שמתחילה ב-'''#''' היא שורת הערה.
 
פרט ליעדים ניתן להגדיר ב makefile דברים רבים נוספים כגון משתנים פנימיים, סימנים מיוחדים שמשפיעם על אופי ביצוע הפקודה או חוקים כללים לטיפול בקבצים על פי הסיומת שלהם.
 
=== קובץ makefile לדוגמא ===
שורה 61 ⟵ 87:
rm *.o
all: clean prog
prog: p.exe
שורה 77 ⟵ 105:
</div>
 
מכיוון שהקובץ נקרא בשם makefile הפעלה של פקודת make ללא שום פרמטר תמצא את הקובץ על פי שמו ותבצע את היעד הראשון שמופיע בו. זהו clean, אשר ללא תלות בשום קובץ אחר ימחק (פקודת ''rm'') את כל קבצי המטרה שב[[תיקיית קבצים|תיקיה]]. כדי לבנות את התכנית p.exe נוכל להשתמש למשל בשורת הפקודה הבאה
 
<div class="mw-content-ltr">
שורה 83 ⟵ 111:
</div>
 
<br />
פרט ליעדים ניתן להגדיר ב makefile דברים נוספים כגון חוקים כללים לטיפול בקבצים על פי הסיומת שלהם.
 
== ראה גם ==