windows - Bazel miljøvariabler i bygge regler

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil henvise til en DirectX SDK i filen BUILD. Problemet er, at (så vidt jeg forstår) understøtter Bazel forbigående miljøvariabler kun gennem --action\_env=DXSDK\_DIR argument for Basel, og det er meningen at blive brugt i handlinger, som skal defineres i en plugin (.bzl fil ).


Er der en nemmere måde at henvise til miljøvariablen ved at bruge den som Make variable (includes = [ "$(DXSDK\_DIR)/Include" ]) eller skal jeg skrive et plugin?

Bedste reference


I princippet har du brug for en cc\_library regel, hvis hdrs attributter globs DirectX headers. For det skal du lade ud som om DX SDK er en del af dit kildetræ. Basel tilbyder 'repository rules' til dette formål.


1. Opret en lagerregel for DirectX SDK



Afhængigt af om SDK'ens placering er kendt eller skal opdages, har du to muligheder.


en. Fast SDK-placering



Du kan bruge denne fremgangsmåde, hvis du ikke behøver at læse eventuelle miljøvariabler, køre nogen binære filer eller spørge registreringsdatabasen for at finde, hvor SDK er. Dette er tilfældet, hvis alle, der bygger dine regler, vil installere SDK'en til samme sted .


Tilføj blot en new\_local\_repository regel til din WORKSPACE fil, peg reglen s path på SDK'ens mappe og skriv en simpel build\_file\_content for den. [25]]]


Eksempel:


new\_local\_repository(
    name = "directx\_sdk",
    path = "c:/program files/directx/sdk/includes",
    build\_file\_contents = """
cc\_library(
    name = "sdk",
    hdrs = glob(["**/*.h"]),
    visibility = ["//visibility:public"],
)
""")


Denne regel opretter @directx\_sdk repository med en regel i sin root-pakke, @directx\_sdk//:sdk.


b. SDK-opdagelse



Du skal følge denne fremgangsmåde, hvis du skal læse miljøvariabler, køre binære filer eller spørge registreringsdatabasen for at finde, hvor SDK er.


I stedet for at bruge en new\_local\_repository regel, skal du implementere din egen. Mere info og eksempler er her.


Centrale punkter:



  • Hvis din lagerregel skal læse miljøvariabler, skal du føje dem til listen repository\_rule(environ), f.eks. repository\_rule(..., environ = ["DXSDK\_DIR"])

  • Hvis du skal køre nogle binære filer, der fortæller dig, hvor SDK'en er, skal du bruge repository\_ctx.execute. Du kan bruge repository\_ctx.which til at finde binære filer på PATH. [27] [28]

  • Hvis du skal gøre registreringsforespørgsler, skal du bruge repository\_ctx.execute med reg.exe /query <args> [29]



2. Afhængig af SDK'ens cc\_library



I dit projekt er du bare afhængig af SDKs bibliotek som om det var en almindelig cc\_library:


cc\_library(
    name = "render",
    ...
    deps = [
        ...
        "@directx\_sdk//:sdk",
    ],
)