ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
מנחם (לא מחובר)אורח · ·
 

הודעה פורסם: 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
נושא ההודעה:

GNU make מאפשר לך לחפש קבצים נדרשים גם בכמה תיקיות אחרות:
http://www.gnu.org/software/make/manual/make.html#Selective-Search
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
מנחם (לא מחובר)אורח · ·
 

הודעה פורסם: 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..). האם יש דרך לפתור את הבעייה בלי להוסיף עוד כלים?
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
Vedderלא בפורום כעת ת.הצטרפות: 15/05/2005 · הודעות: 614 ·
 

הודעה פורסם: 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. כמובן שצריך לכתוב אותו בזהירות.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח [מנחם (לא מחובר)]
  2. אורח [מנחם (לא מחובר)]
  3. אורח [צפריר]
  4. אורח [מנחם (לא מחובר)]
  5. אורח [פינגווין אדום]
  6. אורח [מנחם (לא מחובר)]
  7. Vedder
  8. אורח [מנחם (לא מחובר)]
  9. אורח [צפריר]