2017-09-20 1 views
1

Je devais définir une règle qui décompresse un fichier zip donné. Cependant, je ne connais pas le contenu du zip, donc je ne peux pas spécifier outs dans un genre, par exemple. Cela semble être un problème commun, et googler autour de moi conduit à des personnes qui ont rencontré des scénarios similaires, mais je n'ai pas encore vu un exemple spécifique de la façon de résoudre ce problème.Comment puis-je décompresser un fichier dans bazel correctement si je ne connais pas le contenu du zip?

Je veux quelque chose comme:

genrule(
    name="unzip", 
    src="file.zip", 
    outs=glob(["**"]), # except you're not allowed to use glob here 
    cmd = "unzip $(location file)", 
) 

Répondre

1

Vous pouvez utiliser un Workspace Rule pour créer un fichier BUILD pour le zip qui Globs tout.

Quelque chose comme ceci dans votre fichier WORKSPACE:

new_http_archive(
    name = "my_zip", 
    url = "http://example.com/my_zip.zip", 
    build_file_content = """ 
     filegroup(
      name = "srcs", 
      srcs = glob(["*"]), 
      visibility = ["//visibility:public"] 
     ) 
    """ 
) 

Ensuite, à partir d'un fichier BUILD vous pouvez référencer cela comme une entrée à l'aide @my_zip//:srcs

+0

C'est survenue pour moi. Mais le zip est local sur ma machine et quelque chose que je génère en sortie d'une autre règle. Est-il recommandé à new_http_archive pour cela? – mathwiz

+0

Dans ce cas non, cela ne fonctionnerait pas. De quoi avez-vous besoin pour le contenu de ce zip? Tout pourrait-il dépendre du zip et le décompresser dans $ TMPDIR avant de l'exécuter? Nous faisons quelque chose de similaire dans notre construction – zlalanne

+0

La tâche globale que j'essaie de faire est d'importer un projet CMake. Jusqu'à présent, j'ai réussi à écrire un génrule pour compiler le projet CMake et créer un zip de lib/et include /, mais je ne peux pas comprendre l'étape suivante. – mathwiz