פורסם: 12/10/2009 - 12:46
נושא ההודעה: [makefile] קימפול לתיקייה שאינה תיקיית הsources
|
אני מנסה להשתמש בmakefiles ע"מ לקמפל קוד ממקום מסויים למקום אחר על הכונן,
לדוגמא, הקוד נמצא ב /src ואני רוצה את האובייקטים (.o) ב /obj
זה שימושי, למשל, אם רוצים לקמפל מספריות שהן read only, או למנוע מצב שבו הקוד מתלכלך ב commit עם אובייקטים בגלל טעות מפתח.
איך מוסיפים את זה ל rules באופן גנרי? (בסגנון $(CPP_OBJECTS):%.cpp )
תודה!
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 13:33
נושא ההודעה:
|
אוקיי, הבנתי חלק מבעייה.
אני צריך לבדוק כתנאי אם נגעו בקובץ.. השאלה אם אני יכול להוסיף if כלשהו, ולתקוע את הבדיקה אם הקובץ התקמפל קודם לספרייה אליה אני זורק את קבצי ה .o?
תודה!
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 13:43
נושא ההודעה:
|
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 17:18
נושא ההודעה:
|
טוב, מצאתי כמה דברים שאמורים לעבוד (אבל אמור זה שם של באג, אז כלום חיובי לא קורה)
קוד: | $(C_OBJECTS): %.o: $(addprefix $(dir %.c)../, $(notdir %.c) ) |
או
קוד: | $(C_OBJECTS): %.o : $(subst /Obj/,/,%.c) |
אבל אני מקבל הודעת שגיאה:
קוד: | blah/obj/A.c required by blah/obj/A.o cannot be found |
הקובץ A.c יושב ב blah
יש למישהו רעיון?
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 17:43
נושא ההודעה:
|
הפתרון הנכון למצב כזה הוא לא לייצר MAKEFILE ישיר אלא להשתמש במערכת שמחוללת אותו (cmake, qmake, autotools). מערכות כאלו מאפשרות מאד בקלות לחולל את הMAKEFILE בתיקיה אחרת ואז להריץ אותו בה, כך שהאובייקטים יווצרו בתוכה וקוד המקור לא ישתנה.
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 17:51
נושא ההודעה:
|
אני עובד בתוך מסגרת קיימת (ואני לא אינטגרטור או CM..). האם יש דרך לפתור את הבעייה בלי להוסיף עוד כלים?
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 18:26
נושא ההודעה:
|
כן , יש
אתה לא חייב להשתמש ה cmake , autoconf וכו כדי לעשות זאת
תגדיר חוק משלך עבור הקימפול, הרי אפשר לתת לgcc פרמטר -o שמדגיר את שם ומיקום קובץ המטרה, רק תדאג שהספרייה אליה אתה מקמפל קיימת ואם היא לא קיימת תייצר אותה כחוק בmakefile .
_________________ http://ved.mybrute.com
נערך לאחרונה על-ידי Vedder בתאריך 12/10/2009 - 18:30, סך-הכל נערך פעם אחת
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 18:28
נושא ההודעה:
|
הספרייה קיימת
|
|
חזרה לתוכן הדיון |
פורסם: 12/10/2009 - 20:22
נושא ההודעה:
|
ננסה משהו
קוד: |
mkdir /tmp/maketest
cd /tmp/maketest
cat <<EOF >Makefile
all: a.third
a.third: a.second
a.third: b.second
a.third: c.second
%.second: %.first
cat $< $< | perl -p -e 's/@([^@]+)@/$$ENV{$$1}/g' >$@
%.third: %.second
cat $^ | perl -p -e 's/_([^_]+)_/$$ENV{$$1}/g' >$@
clean:
rm -f *.second *.third
EOF
echo '_HOME_ @HOME@' >a.first
echo '_SHELL_ @SHELL@' >b.first
echo 'Hi there' >c.first
# make time
$ ls
a.first b.first c.first Makefile
$ make
$ make
cat a.first a.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >a.second
cat b.first b.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >b.second
cat c.first c.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >c.second
perl -p -e 's/_([^_]+)_/$ENV{$1}/g' <a.second >a.third
$ cat a.second
_HOME_ /home/tzafrir
_HOME_ /home/tzafrir
$ cat a.third
/home/tzafrir /home/tzafrir
/home/tzafrir /home/tzafrir
/bin/bash /bin/bash
/bin/bash /bin/bash
Hi there
Hi there
$ make clean
rm -f *.second *.third
|
עכשיו מגיעים לתכל'ס:
קוד: |
$ mkdir obj
$ cd obj
obj$ make -f ../Makefile VPATH=..
cat ../a.first ../a.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >a.second
cat ../b.first ../b.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >b.second
cat ../c.first ../c.first | perl -p -e 's/@([^@]+)@/$ENV{$1}/g' >c.second
cat a.second b.second c.second | perl -p -e 's/_([^_]+)_/$ENV{$1}/g' >a.third
obj$ cat a.third
/home/tzafrir /home/tzafrir
/home/tzafrir /home/tzafrir
/bin/bash /bin/bash
/bin/bash /bin/bash
Hi there
Hi there
|
פשוט עובד. לא נדרש שום שינוי ב־Makefile. כמובן שצריך לכתוב אותו בזהירות.
|
|
חזרה לתוכן הדיון |
|