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
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:
mis_macros.h
.En el archivo
BUILD
de la aplicación que depende del repositorio de Bazel, agregar la ruta demis_macros.h
en el campocopts
de la reglacc_library
occ_binary
que depende del repositorio de Bazel. Por ejemplo:BUILD
del repositorio de Bazel (@dep
), agregar la siguiente línea a la reglacc_library
que define el archivo de encabezado con el Macro C:WORKSPACE
de la aplicación, agregar el siguiente bloqueselect()
para anular el valor del Macro: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 campocopts
de la reglacc_library
occ_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 reglacc_library
del repositorio de Bazel, que define el valor del Macro. La funciónselect()
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 valorTrue
para esta etiqueta habilita la configuraciónoverride_macro
.El paso 4 agrega un bloque
select()
al archivoWORKSPACE
de la aplicación, que anula el valor del Macro para la Dependencia de Bazel al construir el objetivomi_lib
. La etiqueta//mi/app:mi_lib
se refiere al objetivo de la reglacc_library
que depende del repositorio de Bazel. La etiqueta@dep//:dep_lib
se refiere a la reglacc_library
del repositorio de Bazel que se está dependiendo. El valorTrue
para la etiqueta//conditions:override_macro
habilita la configuraciónoverride_macro
para la dependencia y asigna el nuevo valor del Macro definido enmis_macros.h
. La etiqueta//conditions:default
se refiere a la configuración predeterminada donde se utiliza el valor original del Macro.