שימוש ב-Bazel ב-Windows

דף זה מכסה את השיטות המומלצות לשימוש ב-Bazel ב-Windows. הוראות להתקנה מפורטות במאמר Install Bazel ב-Windows.

בעיות ידועות

בעיות Bazel הקשורות ל-Windows מסומנות בתווית "team-Windows" ב-GitHub. כאן אפשר לראות את הבעיות הפתוחות.

שיטות מומלצות

הימנעו מבעיות במסלול ארוך

בכלים מסוימים יש את הגבלת האורך המקסימלי של הנתיב ב-Windows, כולל מהדר MSVC. כדי למנוע בעיה זו, ניתן לציין ספריית פלט קצרה עבור Bazel באמצעות התכונה --פלט_משתמש_שורש.

לדוגמה, יש להוסיף את השורה הבאה לקובץ ה-bazelrc:

startup --output_user_root=C:/tmp

הפעלת תמיכה בשם קובץ בגרסה 8.3

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

fsutil 8dot3name set 0

כדי להשתמש בחלק מהפיצ'רים, צריך לוודא ש-Bazel יכולה ליצור סמלים לקבצים ב-Windows. לשם כך, צריך להפעיל את מצב פיתוח (ב-Windows 10, גרסה 1703 ואילך) או להפעיל את Bazel כמנהל מערכת. פעולה זו מאפשרת את התכונות הבאות:

כדי להקל על התהליך, הוסיפו את השורות הבאות לקובץ ה-Bazelrc:

startup --windows_enable_symlinks
build --enable_runfiles

הערה: יצירת קישורים סימבוליים ב-Windows היא פעולה יקרה. הסימון של --enable_runfiles עשוי ליצור כמות גדולה של קישורי קישור לקבצים. יש להפעיל את התכונה הזו רק כשצריך.

Bazel פועל: מעטפת MSYS2 לעומת שורת פקודה לעומת PowerShell

המלצה: Run Bazel משורת הפקודה (cmd.exe) או מ-PowerShell.

החל מ-15 בינואר 2020, אין להריץ Bazel מ-bash – ממעטפת MSYS2 או מ-Git Bash או מ-Cygwin או מכל וריאציה אחרת של Bash. Bazel עשוי לפעול ברוב המקרים, אבל חלק מהדברים לא תקינים, כמו שיבוש של גרסת build עם Ctrl+C מ-MSYS2). כמו כן, אם תבחרו להריץ מתחת ל-MSYS2, תצטרכו להשבית את המרת הנתיב האוטומטית של MSYS2&re. אחרת, מערכת MSYS תמיר את הארגומנטים של שורת הפקודה שנראים כמו נתיבי Unix (כמו //foo:bar) לנתיבי Windows. לפרטים נוספים, ראו את התשובה ב-Stack Overflow.

שימוש ב-Bazel ללא Bash (MSYS2)

שימוש ב-Bazal ללא בד

גרסאות Bazel לפני 1.0 דרשו מ-Bash לבנות כללים מסוימים.

החל מ-Bazel 1.0, ניתן ליצור כל כלל ללא Bash, אלא אם:

  • genrule, מכיוון שכללי יצירת הפקודות באש
  • כלל אחד (sh_binary) או כלל אחד (sh_test), כי מטבעם יש צורך ב-Bassh
  • כלל Starlark שמשתמש ב-ctx.actions.run_shell() או ב-ctx.resolve_command()

עם זאת, לעיתים קרובות הקובץ genrule משמש למשימות פשוטות כמו העתקת קובץ או כתיבת קובץ טקסט. במקום להשתמש ב-genrule (ובהתאם ל-Bash) תוכלו למצוא כלל מתאים במאגר של Bazel-skylib. אם אתם משתמשים ב-Windows, הכללים האלה לא מחייבים שיוך.

שימוש בבדיקת בסיס ללא בס

גרסאות Bazel לפני 1.0 דרשו מ-Bash להירשם למינוי bazel test.

החל מ-Bazel 1.0, ניתן לבדוק כל כלל ללא Bash, למעט כאשר:

  • את/ה משתמש/ת ב---run_under
  • כלל הבדיקה עצמו מצריך Boh (כי קובץ ההפעלה שלו הוא סקריפט קונכיה)

שימוש ב-Bazal ללא Boh

גרסאות Bazel לפני 1.0 דרשו מ-Bash להירשם למינוי bazel run.

החל מ-Bazel 1.0, ניתן להפעיל כל כלל ללא Bash, אלא אם:

  • יש לך --run_under או --script_path
  • כלל הבדיקה עצמו מצריך Boh (כי קובץ ההפעלה שלו הוא סקריפט קונכיה)

משתמשים בכללי shבינארי ו-sh* ו-ctx.actions.run_shell() ללא Boh

כדי ליצור ולבדוק כללי sh_*, צריך להשתמש ב-Bshash ולבנות ולבדוק כללי Starlark שמשתמשים ב-ctx.actions.run_shell() וב-ctx.resolve_command(). הדבר חל לא רק על כללים בפרויקט, אלא גם על כללים בכל אחד מהמאגרים החיצוניים שהפרויקט תלוי בהם (גם באופן זמני).

בעתיד, ייתכן שתהיה אפשרות להשתמש במערכת המשנה של Windows עבור Linux (WSL) כדי לבנות את הכללים האלו, אך כרגע היא לא בעדיפות של צוות המשנה של Bazel-on-Windows.

הגדרת משתני סביבה

משתני סביבה שמגדירים בשורת הפקודה (cmd.exe) של Windows מוגדרים רק בסשן הזה של שורת הפקודה. אם מתחילים cmd.exe חדש, צריך להגדיר שוב את המשתנים. כדי להגדיר תמיד את המשתנים כש-cmd.exe מתחיל, אפשר להוסיף אותם למשתני המשתמש או למשתני המערכת בתיבת הדו-שיח Control Panel > System Properties > Advanced > Environment Variables....

Build ב-Windows

בניית C++ עם MSVC

כדי ליצור יעדים מסוג C++ עם MSVC, עליכם:

  • המהדר החזותי +C+.

  • (אופציונלי) משתנה הסביבה BAZEL_VC ו-BAZEL_VC_FULL_VERSION.

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

    ב-Visual Studio ל-2017 ול-2019, צריך להגדיר אחת מהאפשרויות הבאות: BAZEL_VC. בנוסף, אפשר להגדיר BAZEL_VC_FULL_VERSION.

    • BAZEL_VC ספריית ההתקנה של Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (אופציונלי) רק ל-Visual Studio 2017 ו-2019, מספר הגרסה המלא של כלי ה-Visual C ++ של Build. אפשר לבחור את הגרסה המדויקת של C++ Tools Build דרך BAZEL_VC_FULL_VERSION אם מתקינים יותר מגרסה אחת, אחרת Bazel תבחר את הגרסה האחרונה.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    ב-Visual Studio 2015 או בגרסה ישנה יותר, מגדירים את BAZEL_VC. (אין תמיכה בשדה BAZEL_VC_FULL_VERSION.)

    • BAZEL_VC ספריית ההתקנה של Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • ה-SDK של Windows.

    ב-Windows SDK יש קובצי כותרת וספריות הדרושות בעת בניית אפליקציות של Windows, כולל Bazel עצמה. כברירת מחדל, ה-SDK האחרון של Windows יהיה בשימוש. אפשר גם לציין גרסה של Windows SDK על ידי הגדרת BAZEL_WINSDK_FULL_VERSION. ניתן להשתמש במספר מלא של Windows 10 SDK כגון 10.0.10240.0, או לציין 8.1 כדי להשתמש ב-Windows 8.1 SDK (רק גרסה אחת של Windows 8.1 SDK זמינה). ודאו שהתקנתם את Windows SDK שצוין.

    דרישה: התמיכה הזו זמינה במערכות VC 2017 ו-2019. כלי הפיתוח העצמאי 2015 Build לא תומך בבחירה של Windows SDK, אחרת ההתקנה של Studio Studio 2015 תהיה מלאה, אחרת המערכת תתעלם מ-BAZEL_WINSDK_FULL_VERSION.

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

אם הכול מוגדר, אפשר ליצור עכשיו יעד C++ !

נסו לבנות יעד מאחד מהפרויקטים לדוגמה שלנו:

bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe

כברירת מחדל, הקבצים הבינאריים המובנים מטרגטים את ארכיטקטורת x64. כדי לציין ארכיטקטורת יעד אחרת, הגדירו את אפשרות ה-build של --cpu בארכיטקטורת היעד: * x64 (ברירת מחדל): --cpu=x64_windows או אין אפשרות * x86: --cpu=x64_x86_windows * ARM: --cpu=x64_arm_windows * ARM64: --cpu=arm64_windows

לדוגמה, כדי ליצור יעדים לארכיטקטורת ARM, מבצעים את הפעולות הבאות:

bazel build //examples/cpp:hello-world --cpu=x64_arm_windows

כדי ליצור ולהשתמש בספריות עם קישור דינמי (DLL), ניתן לעיין בדוגמה הזו.

מגבלת אורך שורת פקודה: כדי למנוע את הבעיה במגבלת שורת הפקודה של Windows, צריך להפעיל את תכונת הקובץ של פרמטר המהדר דרך --features=compiler_param_file.

בניית C++ עם Clang

החל מ-0.29.0, Bazel תומכת בבניית עם מהדר MSVC תואם LLVM'clang-cl.exe.

דרישה: כדי לבנות את האפליקציה עם Clang, עליכם להתקין את שני הכלים LLVM ו-Visual C++ Build, כי למרות שאתם משתמשים ב-clang-cl.exe בתור מהדר, עדיין תצטרכו לקשר לספריות +C++.

Bazel יכולה לזהות באופן אוטומטי את התקנת LLVM במערכת שלך, או לציין במפורש ש-Bazel מותקנת על ידי BAZEL_LLVM.

  • BAZEL_LLVM ספריית ההתקנה של LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

כדי להפעיל את כלי Clang לבניית C++, יש כמה מצבים.

  • ב-Bazel 0.28 או בגרסאות ישנות יותר: אין תמיכה ב-Clang.

  • ללא --incompatible_enable_cc_toolchain_resolution: ניתן להפעיל את ארגז הכלים של Clang על ידי סימון build --compiler=clang-cl.

  • עם --incompatible_enable_cc_toolchain_resolution: עליך להוסיף יעד פלטפורמה ל-BUILD file (למשל, הקובץ BUILD ברמה העליונה):

    platform(
        name = "x64_windows-clang-cl",
        constraint_values = [
            "@platforms//cpu:x86_64",
            "@platforms//os:windows",
            "@bazel_tools//tools/cpp:clang-cl",
        ],
    )
    

    לאחר מכן תוכלו להפעיל את ארגז הכלים של Clang באחת משתי הדרכים הבאות:

    • יש לציין את דגלי ה-build הבאים:
    --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
    
    • רישום הפלטפורמה וארגז הכלים בקובץ WORKSPACE:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    הסימון --incompatible_activate_cc_toolchain_resolution מתוכנן לפעול כברירת מחדל בגרסה החדשה של Bazel. לכן מומלץ להפעיל את התמיכה של Clang בגישה השנייה.

בניית Java

כדי ליצור יעדים ב-Java:

ב-Windows, Bazel בונה שני קובצי פלט עבור כללים של java_binary:

  • קובץ .jar
  • קובץ .exe שיכול להגדיר את הסביבה עבור ה-JVM ולהפעיל את הקובץ הבינארי

נסו לבנות יעד מאחד מהפרויקטים לדוגמה שלנו:

  bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
  bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe

Build Python

כדי ליצור יעדים ב-Python:

ב-Windows, Bazel בונה שני קובצי פלט עבור כללים של py_binary:

  • קובץ ZIP שמבצע הוצאה עצמית
  • קובץ הפעלה שיכול להפעיל את המתרגם ב-Python עם קובץ ה-zip לחילוץ עצמי כארגומנט

אפשר להריץ את קובץ ההפעלה (עם סיומת .exe) או להפעיל את Python עם קובץ ה-zip לחילוץ עצמי כארגומנט.

נסו לבנות יעד מאחד מהפרויקטים לדוגמה שלנו:

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

אם אתם רוצים לקבל פרטים על האופן שבו Bazel יוצרת מיקודים ב-Python ב-Windows, מומלץ לעיין במסמך העיצוב הזה.