הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
נפלאות התמיכה בחלונות או מדוע CMake לא בדיוק מערכת הבניה איכותית.
פרסמתי מאמר Why CMake sucks... (once more) בבלוג שלי באנגלית.
מומלץ לקריאה לכל אלו שאוהבים CMake ושונאים auto*.
קצת רקע לאנשים שלא רגילים לעולם חלונות: בחלונות לא עושים linking ישירות מול dll אלא תמיד מול import-library מיוחדת שיודעת לעשות טעינה ל־dll. כך שאם בלינוקס בד"כ כל ספריה באה בגרסאות: דינאמית וסטטית, בחלונות (כולל mingw ו־cygwin) כל ספריה באה בגרסאות: דינאמית, ספריית import לספריה דינאמית וגרסה סטטית.
עכשיו תקראו את המאמר ותיהנו ;-)
.
לטובת מפתחי CMake ייאמר: אחרי שדיווחתי על הבאג הם עדכנו את הויקי שלהם כדי להמנע מהבעיה הזו.
מחשבות על Boost.
ספריית Boost היא אחת הספריות הגדולות של C++ הן מבחינת הגודל הפיזי והיקף הספריות והן מבחינת המרכיבים החשובים שהיא מספקת.
Boost ל־C++ היא היום אחת הספריות הנחוצות ביותר הכללת בין היתר: טיפול בחוטים, ביטויים רגולריים, סינגנלים, סוקטים ועוד עשרות מודולים חשובים ושימושיים; ומה שעוד יותר חשוב הם בנויים בצורה טובה, הגיונית ודי איכותית.
למעשה, המתכנת C++ המודרני שהתרגל לנוחות ש־Boost מספקת יתקשה לכתוב בלעדיה את הקוד.
כמובן שהיא לא הספרייה היחידה, גם כלים כמו Qt, GTKmm ואחרים מספקים כלים בהיקף דומה... אבל ל־Boost יש יתרון גדול: חלק מהכלים שקיימים היום ב־Boost כבר עברו כפי-שהם ל־STL החדש. למעשה, יש ערך מוסף לעבודה עם Boost: אם אתה רגיל לעבוד עם boost:function, boost::bind, boost::regex, boost::thread אתה תמצא את עצמך יום אחד משתמש ב־std::function, std::bind בצורה שקופה לחלוטין בלי תלות בספריית צד ג'.
אבל מה? בניגוד לספריית STL שבאה עם קומפיילר ומבטיחה לך תאימות לאחור ואפשרת לא לדאוג ומגרסאות... Boost היא לא כזו:
- כל מספר חודשים יוצאת גרסה חדשה שלא תואמת לקודמת!
- אתה יכול לצפות שאיזושהי גרסת Boost תסופק עם הפצת לינוקס, אבל אתה לא יודע איזו?
למעשה, לצורך עבודה באוניברסיטה הייתי צריך לכתוב תכנה שעובדת עם ביטויים רגולריים, עם חוטים, עם טעינה ושמירה של תמונות.
התכנה הייתה בשתי גרסאות (עם ifdefים): כזו שהשתמשה ב־Qt4 בלבד (וסיפקה GUI), וכזו שהשתמשה ב־Boost ולא סיפקה GUI.
היה לי קל מאוד לקמפל את התכנה שעבדה עם GUI ולשלוח למישהו אחר לבדיקה, כי לא היה לי אכפת איזו גרסת Qt4 מותקנת אצלו, כל עוד היא מספיק חדשה!
עם Boost לא היה שום סיכוי לעשות דבר כזה... הייתי צריך או לקמפל סטטית הכל, או לקמפל בדיוק עבור הגרסה שמותקנת אצל אותו האדם.
Boost היא ספרייה נהדרת. אבל, היא גורמת לי להתרחק ממנה יותר ויותר - כי יש פרויקטים שהיא פשוט לא רלוונטית עבורם בגלל שהיא שוברת API/ABI לעתים קרובות.
שוחררה גרסת 0.0.5 של CppCMS (ענף יציב)
שוחררה גרסה חדשה של ענף יציב של CppCMS, שינויים:
תיקוני בעיות אבטחה:
- נכתב מעקף לבעיה של ספריית CgiCC שהיה יכול לגרום ל־DoS.
- תוקנה בעיה שהייתה עלולה לגרום להווצרות SID בעלי אנטרופיה נמוכה.
תיקוני באגים:
- תוקן זמן חיים של ערכים "חשופים" בניהול מצב (sessions)
- תוקן באג שמנע אפשרות עבודה ב־FastCGI/SCGI מעל TCP/IP
- תוקנו בעיות בניה עם גרסאות Boost לא סטנדרטיות.
- תוקנו בעיות ביצירת HTTP Status Headers לא נכונים במקרה של שגיאות.
- תוקנו בעיות בניה עם גרסאות gcc שונות ועם קומפיילר של אינטל.
שיפורים:
- שופרו זמני בעיות views בצורה משמעות.
ל־CppCMS יש קהילה פעילה
בחודש חודשיים אחרונים אני רואה פעילות ערה מסביב ל־CppCMS. רשימת התפוצה הפכה להיות פעילה, דיווחי באגים מגיעים ואפילו...
לפני ימים אחדים קיבלתי מספר דיווחי באגים ותרגום של הבלוג הזה לסינית, כך שאם מישהו רוצה בלוג שמיליארד סינים יוכלו לקרוא אותו בלי ליצור עומסים, זאת לא בעיה ;-).
האמת היא, אני שמח ש־CppCMS לאט־לאט צובר תאוצה והקהילה נבנית מסביבו.
למה להמציא גלגל מחדש זה לא תמיד עובד טוב
לאחרונה אני מנסה להגר ל־CMake מ־autotools בפרויקט CppCMS בעיקר כדי להבטיח תמיכה טובה יותר בסביבת Windows ובפרט ב־MSVC מתישהו בעתיד.
עשיתי כבר הרבה עובדה והענף הניסיוני עבר ל־CMake. אפילו לא מעט אנשים ברשימת התפוצה התלהבו מהעובדה שהמערכת תעבוד על CMake... רבים חוץ ממני. אחרי שהתחלתי לעבוד אתה בצורה יותר עניינית הבנתי: היא באמת יותר מוצלחת בפיתוח ל־Windows מאשר autotools בעיקר בגלל שהיא קצת יותר גמישה בנושא ה־exports וכמובן התמיכה ב־MSVC.
אבל פה בערך נגמר היתרון. עכשיו אני אתלונן על דברים שמעצבנים אותי:
המהירות שאנשי CMake מתלהבים ממנה זאת גם עקב אכילס שלה. יש לזה מספר נקודות:
ב־autotools הייתה הפרדה ברורה בין automake שמגדיר את מבנה הפרויקט לבין autoconf שמגדיר את קונפיגורציית הפלטפורמה. מצד אחד זה היה קצת מפריע אבל מצד שני זה היה מאוד נוח: הוספת קובץ חדש לא פרויקט לא דרשה הרצת configure מחדש מצד אחד, מצד שני כל שינוי בצורת הקונפיגורציה ביצע הרצת configure שלמה.
לעומת זאת, CMake אף פעם לא מנקה את ה־Cache שלו (אלא אם אתה עושה את זה במפורש). מה שגורם לכך ששינויים בקונפיגורציה לא תמיד יבואו לידי ביטוי כי ב־cache שלו הוא זוכר משהו אחר (אולי בדיקה אחרת לא תקינה).
מצד שני, אם אני מוחק CMakeCache ומעדכן את CMakeLists.txt הוא לא זוכר את הפרטרים המקורים שהרצתי אתו את cmake כמו "איפה נמצאות הספריות או איזו אופציה שאני העברתי"
- מנגנון מעקב אחרי התלויות של CMake לא בודק את הקובץ config.h משמע... אם עשיתי שינויים בקונפיגורציה הקוד לא ייבנה מחדש. צריך להריץ make clean ו־make שוב! העיקר שיש להם cache חזק.
הרבה מגנונים הקיימים לוקים בחסר או לא מתוכננים היבט. לדוגמה:
- משהו מאוד פופולרי כמו
AC_SEARCH_LIBS
שמאפשר לך לבדוק אם פוקנציה מסוימת קיימת, אם כו אז אל תעשה דבר, חפש אותה בספריות. דוגמה קלאסית. pthreads, iconv, dlopen, socket שלפעמים מהווים חלק מהספרייה הסטנדרטית ולפעמים דורשים ספריות חיצוניות. אין פונקציונליות כזו בכלל. בדיקת sizeof היא בכלל פנינת CMake. יש לה מספר בעיות:
- היא נעשית ע"י הרצת קוד מה שאומר היא לא תעבוד בקרוס־קומפילציה. כאשר ב־autotools עושים טריק מאוד יפה המאפשר לבצע בדיקה כזו ללא הרצת קוד אלא קומפילציה בלבד.
- היא לא מאפשרת להוסיף header כך שלא ניתן לבדוק sizeof של טיפוסים הנמצאים ב־includes לא סטנדרטיים.
- אין פונקציונליות דומה ל־
AC_ARG_ENABLE
המאפשרת להציג רשימת הפרמטרים לקונפיגורציה והערות לגביהם -- קרי אין כלי כמו ./configure --help שמאוד עוזר בהרבה מקרים.
ועוד, ועוד, ועוד... הבעיה היא שהם ממציאים גלגל מחדש; וכשעושים את זה, לא עושים את בצורה הטובה ביותר, מפספסים הרבה נקודות שרבים כבר חשבו עליהם קודם.
אני מקווה שיום אחד autotools ידעו לתמוך גם ב־MSVC בסה"כ זה לא אמור להיות מי יודע מה מסובך... ICU משתמשים ב־autotools יחד עם MSVC בצורה מוצלחת למידי (למעשה הבעיה היא אפילו לא automake ו־autoconf הם דווקא איכשהו עובדים עם הקומפיילר, (הוא מסתבר כן תומך בהרבה דגלונים הרגילים כמו "-o -I" ועוד) הבעיה היא בעיקר libtool.
במילים אחרות... אם אתם לא מתכוונים לתמוך ב־MSVC תתרחקו מ־CMake, אבל ממש תתרחקו ממנו.