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 puedo obtener los archivos que se encuentran en el directorio de construcción en otra regla de Bazel.

1) cuando uso la herramienta de Python para generar el código .cpp/.hpp como la herramienta protobuf, pero no sé cuántos archivos se generarán, así que no es exactamente lo mismo que la herramienta protobuf.

En una regla genrule:
def _generar_core_ifce_impl(ctx):

archivo_salida = ctx.actions.declare_directory(out)
cmd = “””
mkdir -p {ruta};
“””.format(ruta = archivo_salida.path)
cmd += “””
{herramientas} -i {src} -o {directorio_salida}
“””.format(herramientas = herramientas, src = ctx.files.srcs, directorio_salida = archivo_salida.path)

ctx.actions.run_shell(
    command = cmd,
    inputs = ctx.files.srcs,
    outputs = [archivo_salida]
    )
return [DefaultInfo(files = depset([archivo_salida])),]

generar_core_ifce = rule (
implementation = _generar_core_ifce_impl,
attrs = {
“srcs”: attr.label_list(mandatory = False, allow_files = True),
“herramientas”: attr.label_list(mandatory = True, allow_files = True),
“out”: attr.string(mandatory = True),
},
)
En el directorio archivo_salida,
se generarán algunos *.cpp y *.hpp, pero no puedo saber sus nombres.

2) luego en otra regla, la biblioteca cc utilizará *.cpp y *.hpp que están en el directorio archivo_salida.
La pregunta es: ¿cómo escribir esta regla?
No puedo obtener los archivos en el directorio archivo_salida,
así que no puedo escribir la biblioteca cc?

Tags:  

Answer

  1. Avatar for davy.ai

    Para utilizar los archivos generados .cpp/.hpp en una regla cc_library, puedes declarar una función glob para recopilar todos los archivos en el directorio output_file y pasarlo como entrada a la regla cc_library.

    Aquí tienes un ejemplo de cómo escribir la regla:

    def __cc_library_impl(ctx):
        cc_files = ctx.glob(["{}/(*.cpp|*.cc)".format(ctx.attr.out)])
        hpp_files = ctx.glob(["{}/(*.hpp|h)".format(ctx.attr.out)])
    
        cc_library(
            name = "my_library",
            srcs = cc_files,
            hdrs = hpp_files,
            # cualquier otro atributo que desees definir
        )
    
    cc_library_rule = rule(
        implementation = __cc_library_impl,
        attrs = {
            "out": attr.string(mandatory = True),
        },
    )
    

    En este ejemplo, usamos la función glob para recopilar todos los archivos .cpp/cc y .hpp/h en el directorio output_file. Luego pasamos esos archivos como entradas a la regla cc_library, junto con cualquier otro atributo que desees definir.

    Luego puedes usar esta cc_library_rule en tu archivo BUILD, pasando el directorio output_file como atributo “out”:

    genrule(
        name = "my_genrule",
        srcs = [...],
        tools = [...],
        out = "my_directory",
        # cualquier otro atributo que desees definir
    )
    
    cc_library_rule(
        name = "my_library",
        out = "//:my_genrule.my_directory",
        # cualquier otro atributo que desees definir
    )
    

    En este ejemplo, pasamos el directorio “my_directory” del archivo output_file como atributo “out” a cc_library_rule. Esto le indica a Bazel dónde encontrar los archivos .cpp/.hpp generados para usar como entradas en la regla cc_library.

Comments are closed.