es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo incluir un archivo de cabecera para cada archivo compilado a través de Bazel.

Tengo un proyecto que estoy construyendo utilizando bazel. Mi aplicación hace referencia a otro repositorio bazel como dependencia, en su archivo BUILD, llamémoslo @dep. No puedo realizar cambios en el código en @dep, pero necesito anular una macro C definida en uno de los archivos de encabezado en @dep.

Pensé en usar la opción del compilador -D para definir el símbolo definido en la parte superior del archivo de encabezado que quiero reemplazar, que contiene la macro C, y luego utilizar -include para incluir un archivo de encabezado diferente con mi macro, para todos los archivos en @dep que se estén compilando a través de bazel. Pero en cc_binary, no hay opción para -include, y copt = [] solo funcionará para el objetivo que se está compilando y no para sus dependencias.

Me encontré con esta publicación pero desafortunadamente la solución no se publicó: https://stackoverflow.com/questions/67719737/how-to-specify-preprocessor-includes-in-bazel-include-common-header-h

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para anular un Macro C en una Dependencia de Bazel

    Para anular un Macro C definido en un archivo de encabezado de una Dependencia de Bazel, sin realizar cambios en el código de esa dependencia, se pueden seguir los siguientes pasos:

    1. Definir el nuevo valor del Macro en un archivo de encabezado separado, llamémosle mis_macros.h.
    2. En el archivo BUILD de la aplicación que depende del repositorio de Bazel, agregar la ruta de mis_macros.h en el campo copts de la regla cc_library o cc_binary que depende del repositorio de Bazel. Por ejemplo:

      cc_library(
         name = "mi_lib",
         srcs = ["mi_lib.cpp"],
         hdrs = ["mi_lib.h"],
         deps = ["@dep//:dep_lib"],
         copts = ["-include", "mis_macros.h"],
      )
      

    3. En el archivo BUILD del repositorio de Bazel (@dep), agregar la siguiente línea a la regla cc_library que define el archivo de encabezado con el Macro C:
      cc_library(
         name = "dep_lib",
         srcs = ["dep_lib.cpp"],
         hdrs = ["dep_lib.h"],
         copts = select({
             "//conditions:default": ["-DMACRO_NAME=valor_del_macro"],
             "//conditions:override_macro": ["-DMACRO_NAME=valor_de_anulacion"],
         }),
         visibility = ["//visibility:public"],
      )
      
    4. En el archivo WORKSPACE de la aplicación, agregar el siguiente bloque select() para anular el valor del Macro:
      select(
         {
             "//mi/app:mi_lib": {
                 "@dep//:dep_lib": {
                     "//conditions:override_macro": True,
                 },
             },
         },
         "//conditions:default",
      )
      

    Explicación:

    • El paso 1 define un nuevo archivo de encabezado con el nuevo valor del Macro sin modificar el archivo de encabezado original en la Dependencia de Bazel.

    • El paso 2 agrega la opción -include al campo copts de la regla cc_library o cc_binary de la aplicación que depende del repositorio de Bazel. Esta opción indica al compilador que incluya el archivo de encabezado especificado antes de compilar cualquier archivo fuente.

    • El paso 3 agrega un campo copts a la regla cc_library del repositorio de Bazel, que define el valor del Macro. La función select() permite asignar diferentes valores a este campo dependiendo de la configuración de compilación. La etiqueta //conditions:default se refiere a la configuración predeterminada, donde se utiliza el valor original del Macro. La etiqueta //conditions:override_macro se refiere a la configuración donde se anula el valor del Macro. El valor True para esta etiqueta habilita la configuración override_macro.

    • El paso 4 agrega un bloque select() al archivo WORKSPACE de la aplicación, que anula el valor del Macro para la Dependencia de Bazel al construir el objetivo mi_lib. La etiqueta //mi/app:mi_lib se refiere al objetivo de la regla cc_library que depende del repositorio de Bazel. La etiqueta @dep//:dep_lib se refiere a la regla cc_library del repositorio de Bazel que se está dependiendo. El valor True para la etiqueta //conditions:override_macro habilita la configuración override_macro para la dependencia y asigna el nuevo valor del Macro definido en mis_macros.h. La etiqueta //conditions:default se refiere a la configuración predeterminada donde se utiliza el valor original del Macro.

Comments are closed.