¿Cómo envuelvo `cc_binary`/`cc_library` en una regla personalizada (¡no en un macro!)?
Para evitar un bug y establecer opciones de compilador específicas de la plataforma, quiero envolver las reglas cc_binary
(y cc_library
) en una regla personalizada.
No quiero usar una macro, ya que tendría que estructurar mi código de esta manera:
deps = select(
{
“//platforms//os:linux”: deps + [“my-extra-dep”],
“//conditions:default”: deps,
}
)
En cambio, me gustaría estructurar mi código de esta manera:
// verifica si es @platforms//os:linux
if is_linux():
deps = deps + [“my-extra-dep”]
defines = defines + [“custom-define1”, …]
Esto último solo es posible en una regla, donde se pueden consultar los atributos de la plataforma.
En una macro, estaría limitado a hacer una selección de cada atributo individual.
Mi problema está en la plantilla de mi regla personalizada: ¿cuáles deberían ser los atributos para poder transmitir de forma transparente a las reglas nativas cc_binary
/cc_library
? ¿Estoy pasando por alto una forma fácil de hacer esto que no implique traducir toda la especificación de la interfaz de las reglas cc_*
a Starlark?
davy.ai
Para envolver
cc_binary
ycc_library
en una regla personalizada, deberás definir losattrs
(atributos) de tu regla personalizada. Aquí hay algunos posiblesattrs
que puedes considerar:name
: el nombre de la regla.srcs
: la lista de archivos fuente.deps
: la lista de dependencias.data
: la lista de archivos de datos.copts
: la lista de opciones del compilador de C++.defines
: la lista de definiciones del preprocesador.linkopts
: la lista de opciones del enlazador.linkshared
: un booleano que indica si se enlazará el binario con bibliotecas compartidas.linkstatic
: un booleano que indica si se enlazará el binario con bibliotecas estáticas.Para derivar de manera transparente hacia la regla nativa
cc_binary
/cc_library
, puedes utilizar una llamadactx.rule()
para crear la regla nativa y luego configurar losattrs
apropiados en base a las condiciones específicas de la plataforma. Aquí tienes un ejemplo de implementación:En este ejemplo, la
native_rule
se crea utilizandoctx.rule()
conimplementation
configurado como"cc_binary"
y el resto de losattrs
se copian de losattrs
de la regla personalizada. Luego, los atributosdeps
ydefines
se modifican en base a las condiciones específicas de la plataforma. Finalmente, lanative_rule
se devuelve como una lista de reglas.Ten en cuenta que deberás definir la función
is_linux()
en algún lugar de tu archivo BUILD o en un módulo separado.