Créer à partir de la source

Créez un package pip TensorFlow à partir des sources et installez-le sur Ubuntu Linux et macOS. Bien que les instructions puissent fonctionner pour d'autres systèmes, elles ne sont testées et prises en charge que pour Ubuntu et macOS.

Configuration pour Linux et macOS

Installez les outils de build suivants pour configurer votre environnement de développement.

Installer Python et les dépendances du package TensorFlow

Ubuntu

sudo apt install python3-dev python3-pip

macOS

Nécessite Xcode 9.2 ou version ultérieure.

Installez à l'aide du gestionnaire de packages Homebrew :

brew install python

Installez les dépendances du package pip TensorFlow (si vous utilisez un environnement virtuel, omettez l'argument --user ) :

pip install -U --user pip

Installer Bazel

Pour créer TensorFlow, vous devrez installer Bazel. Bazelisk est un moyen simple d'installer Bazel et télécharge automatiquement la version correcte de Bazel pour TensorFlow. Pour faciliter l'utilisation, ajoutez Bazelisk comme exécutable bazel dans votre PATH .

Si Bazelisk n'est pas disponible, vous pouvez installer manuellement Bazel . Assurez-vous d'installer la version correcte de Bazel à partir du fichier .bazelversion de TensorFlow.

Clang est un compilateur C/C++/Objective-C compilé en C++ basé sur LLVM. Il s'agit du compilateur par défaut pour créer TensorFlow à partir de TensorFlow 2.13. La version actuellement prise en charge est LLVM/Clang 17.

Les packages nocturnes LLVM Debian/Ubuntu fournissent un script d'installation automatique et des packages pour une installation manuelle sous Linux. Assurez-vous d'exécuter la commande suivante si vous ajoutez manuellement le référentiel llvm apt à vos sources de packages :

sudo apt-get update && sudo apt-get install -y llvm-17 clang-17

Maintenant que /usr/lib/llvm-17/bin/clang est le chemin réel vers clang dans ce cas.

Alternativement, vous pouvez télécharger et décompresser le Clang + LLVM 17 pré-construit.

Vous trouverez ci-dessous un exemple d'étapes que vous pouvez suivre pour configurer les binaires Clang + LLVM 17 téléchargés sur les systèmes d'exploitation Debian/Ubuntu :

  1. Accédez au répertoire de destination souhaité : cd <desired directory>

  2. Chargez et extrayez un fichier d'archive... (adapté à votre architecture) :

    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.2/clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    tar -xvf clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    

  3. Copiez le contenu extrait (répertoires et fichiers) dans /usr (vous aurez peut-être besoin des autorisations sudo et le répertoire correct peut varier selon la distribution). Cela installe efficacement Clang et LLVM et les ajoute au chemin. Vous ne devriez rien avoir à remplacer, sauf si vous disposez d'une installation précédente, auquel cas vous devez remplacer les fichiers :

    cp -r clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04/* /usr
    

  4. Vérifiez la version obtenue des binaires Clang + LLVM 17 :

    clang --version
    

  5. Maintenant que /usr/bin/clang est le chemin réel vers votre nouveau clang. Vous pouvez exécuter le script ./configure ou définir manuellement les variables d'environnement CC et BAZEL_COMPILER sur ce chemin.

Installer la prise en charge du GPU (facultatif, Linux uniquement)

Il n'y a pas de support GPU pour macOS.

Lisez le guide de support GPU pour installer les pilotes et les logiciels supplémentaires requis pour exécuter TensorFlow sur un GPU.

Téléchargez le code source de TensorFlow

Utilisez Git pour cloner le dépôt TensorFlow :

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

Le dépôt est par défaut la branche de développement master . Vous pouvez également consulter une branche de publication pour construire :

git checkout branch_name  # r2.2, r2.3, etc.

Configurer la construction

Les builds TensorFlow sont configurées par le fichier .bazelrc dans le répertoire racine du référentiel. Les scripts ./configure ou ./configure.py peuvent être utilisés pour ajuster les paramètres communs.

Veuillez exécuter le script ./configure à partir du répertoire racine du référentiel. Ce script vous demandera l'emplacement des dépendances TensorFlow et vous demandera des options de configuration de build supplémentaires (indicateurs du compilateur, par exemple). Reportez-vous à la section Exemple de session pour plus de détails.

./configure

Il existe également une version python de ce script, ./configure.py . Si vous utilisez un environnement virtuel, python configure.py donne la priorité aux chemins au sein de l'environnement, tandis que ./configure donne la priorité aux chemins en dehors de l'environnement. Dans les deux cas, vous pouvez modifier la valeur par défaut.

Exemple de séance

Ce qui suit montre un exemple d'exécution du script ./configure (votre session peut différer) :

Options de configuration

Prise en charge des GPU

à partir de la version 2.18.0

Pour la prise en charge GPU , définissez cuda=Y lors de la configuration et spécifiez les versions de CUDA et cuDNN si nécessaire. Bazel téléchargera automatiquement les packages CUDA et CUDNN ou pointera vers les redistributions CUDA/CUDNN/NCCL sur le système de fichiers local si nécessaire.

avant la version 2.18.0

Pour la prise en charge GPU , définissez cuda=Y lors de la configuration et spécifiez les versions de CUDA et cuDNN. Si votre système dispose de plusieurs versions de CUDA ou cuDNN installées, définissez explicitement la version au lieu de vous fier à la version par défaut. ./configure crée des liens symboliques vers les bibliothèques CUDA de votre système. Ainsi, si vous mettez à jour les chemins de vos bibliothèques CUDA, cette étape de configuration doit être réexécutée avant la construction.

Optimisations

Pour les indicateurs d'optimisation de compilation, la valeur par défaut ( -march=native ) optimise le code généré pour le type de processeur de votre machine. Toutefois, si vous créez TensorFlow pour un type de processeur différent, envisagez un indicateur d'optimisation plus spécifique. Consultez le manuel GCC pour des exemples.

Configurations préconfigurées

Certaines configurations de build préconfigurées sont disponibles et peuvent être ajoutées à la commande bazel build , par exemple :

  • --config=dbg —Construire avec les informations de débogage. Voir CONTRIBUTING.md pour plus de détails.
  • --config=mkl — Prise en charge d' Intel® MKL-DNN .
  • --config=monolithic —Configuration pour une version principalement statique et monolithique.

Construire et installer le package pip

Options de construction de Bazel

Reportez-vous à la référence de ligne de commande Bazel pour les options de construction .

Construire TensorFlow à partir des sources peut utiliser beaucoup de RAM. Si votre système est limité en mémoire, limitez l'utilisation de la RAM de Bazel avec : --local_ram_resources=2048 .

Les packages TensorFlow officiels sont construits avec une chaîne d'outils Clang conforme à la norme de package manylinux2014.

Construire le package

Pour créer le package pip, vous devez spécifier l'indicateur --repo_env=WHEEL_NAME . en fonction du nom fourni, le package sera créé, par exemple :

Pour créer le package CPU Tensorflow :

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu

Pour créer le package GPU Tensorflow :

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel

Pour créer le package Tensorflow TPU :

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_tpu --config=tpu

Pour créer un package nocturne, définissez tf_nightly au lieu de tensorflow , par exemple pour créer un package CPU nocturne :

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tf_nightly_cpu

En conséquence, la roue générée sera située dans

bazel-bin/tensorflow/tools/pip_package/wheel_house/

Installer le paquet

Le nom de fichier du fichier .whl généré dépend de la version de TensorFlow et de votre plate-forme. Utilisez pip install pour installer le package, par exemple :

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Versions Docker Linux

Les images de développement Docker de TensorFlow constituent un moyen simple de configurer un environnement pour créer des packages Linux à partir des sources. Ces images contiennent déjà le code source et les dépendances requis pour créer TensorFlow. Accédez au guide TensorFlow Docker pour obtenir les instructions d'installation et la liste des balises d'image disponibles .

CPU uniquement

L'exemple suivant utilise l'image :devel pour créer un package CPU uniquement à partir du dernier code source TensorFlow. Consultez le guide Docker pour connaître les balises TensorFlow -devel disponibles.

Téléchargez la dernière image de développement et démarrez un conteneur Docker que vous utiliserez pour créer le package pip :

docker pull tensorflow/tensorflow:devel
docker run -it -w /tensorflow_src -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel bash

git pull  # within the container, download the latest source code

La commande docker run ci-dessus démarre un shell dans le répertoire /tensorflow_src , la racine de l'arborescence source. Il monte le répertoire actuel de l'hôte dans le répertoire /mnt du conteneur et transmet les informations de l'utilisateur hôte au conteneur via une variable d'environnement (utilisée pour définir les autorisations - Docker peut rendre cela délicat).

Vous pouvez également créer une copie hôte de TensorFlow dans un conteneur, montez l'arborescence source de l'hôte dans le répertoire /tensorflow du conteneur :

docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \
    -e HOST_PERMS="\\((id -u):\\)(id -g)" tensorflow/tensorflow:devel bash

Une fois l'arborescence source configurée, créez le package TensorFlow dans l'environnement virtuel du conteneur :

  1. Facultatif : configurez la build : cela invite l'utilisateur à répondre aux questions de configuration de la build.
  2. Créez le package pip .
  3. Ajustez les autorisations de propriété du fichier pour l'extérieur du conteneur.
./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu --config=opt
`
chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Installez et vérifiez le package dans le conteneur :

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.__version__)"

Sur votre machine hôte, le package pip TensorFlow se trouve dans le répertoire actuel (avec les autorisations de l'utilisateur hôte) : ./tensorflow- version - tags .whl

Prise en charge des GPU

Docker est le moyen le plus simple de créer une prise en charge GPU pour TensorFlow, car la machine hôte ne nécessite que le pilote NVIDIA® (le kit d'outils NVIDIA® CUDA® n'a pas besoin d'être installé). Reportez-vous au guide de prise en charge GPU et au guide TensorFlow Docker pour configurer nvidia-docker (Linux uniquement).

L'exemple suivant télécharge l'image TensorFlow :devel-gpu et utilise nvidia-docker pour exécuter le conteneur compatible GPU. Cette image de développement est configurée pour créer un package pip avec prise en charge GPU :

docker pull tensorflow/tensorflow:devel-gpu
docker run --gpus all -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel-gpu bash
git pull  # within the container, download the latest source code

Ensuite, dans l'environnement virtuel du conteneur, créez le package TensorFlow avec prise en charge GPU :

./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel --config=opt

chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Installez et vérifiez le package dans le conteneur et recherchez un GPU :

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))"

Configurations de build testées

Linux

Processeur

Version Version Python Compilateur Construire des outils
tensorflow-2.18.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.17.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.16.1 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Clang 16.0.0 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 CCG 9.3.1 Bazel 5.3.0
tensorflow-2.11.0 3.7-3.10 CCG 9.3.1 Bazel 5.3.0
tensorflow-2.10.0 3.7-3.10 CCG 9.3.1 Bazel 5.1.1
tensorflow-2.9.0 3.7-3.10 CCG 9.3.1 Bazel 5.0.0
tensorflow-2.8.0 3.7-3.10 CCG 7.3.1 Bazel 4.2.1
tensorflow-2.7.0 3,7-3,9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.6.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.5.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.4.0 3,6-3,8 CCG 7.3.1 Bazel 3.1.0
tensorflow-2.3.0 3,5-3,8 CCG 7.3.1 Bazel 3.1.0
tensorflow-2.2.0 3,5-3,8 CCG 7.3.1 Bazel 2.0.0
tensorflow-2.1.0 2.7, 3.5-3.7 CCG 7.3.1 Bazel 0.27.1
tensorflow-2.0.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1
tensorflow-1.15.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1
tensorflow-1.14.0 2.7, 3.3-3.7 CCG 4.8 Bazel 0.24.1
tensorflow-1.13.1 2.7, 3.3-3.7 CCG 4.8 Bazel 0.19.2
tensorflow-1.12.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.11.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.10.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.9.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.11.0
tensorflow-1.8.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0
tensorflow-1.7.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0
tensorflow-1.6.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0
tensorflow-1.5.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.8.0
tensorflow-1.4.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.5.4
tensorflow-1.3.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5
tensorflow-1.2.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5
tensorflow-1.1.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2
tensorflow-1.0.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2

GPU

Version Version Python Compilateur Construire des outils cuDNN CUDA
tensorflow-2.18.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 9.3 12,5
tensorflow-2.17.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 8.9 12.3
tensorflow-2.16.1 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 8.9 12.3
tensorflow-2.15.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0 8.9 12.2
tensorflow-2.14.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0 8.7 11.8
tensorflow-2.13.0 3.8-3.11 Clang 16.0.0 Bazel 5.3.0 8.6 11.8
tensorflow-2.12.0 3.8-3.11 CCG 9.3.1 Bazel 5.3.0 8.6 11.8
tensorflow-2.11.0 3.7-3.10 CCG 9.3.1 Bazel 5.3.0 8.1 11.2
tensorflow-2.10.0 3.7-3.10 CCG 9.3.1 Bazel 5.1.1 8.1 11.2
tensorflow-2.9.0 3.7-3.10 CCG 9.3.1 Bazel 5.0.0 8.1 11.2
tensorflow-2.8.0 3.7-3.10 CCG 7.3.1 Bazel 4.2.1 8.1 11.2
tensorflow-2.7.0 3,7-3,9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.6.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3,6-3,8 CCG 7.3.1 Bazel 3.1.0 8.0 11.0
tensorflow-2.3.0 3,5-3,8 CCG 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3,5-3,8 CCG 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2.7, 3.5-3.7 CCG 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1 7.4 10,0
tensorflow_gpu-1.15.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1 7.4 10,0
tensorflow_gpu-1.14.0 2.7, 3.3-3.7 CCG 4.8 Bazel 0.24.1 7.4 10,0
tensorflow_gpu-1.13.1 2.7, 3.3-3.7 CCG 4.8 Bazel 0.19.2 7.4 10,0
tensorflow_gpu-1.12.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2 5.1 8

macOS

Processeur

Version Version Python Compilateur Construire des outils
tensorflow-2.16.1 3.9-3.12 Clang de Xcode 13.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Clang de Xcode 10.15 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Clang de Xcode 10.15 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Clang de Xcode 10.15 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 Clang de Xcode 10.15 Bazel 5.3.0
tensorflow-2.11.0 3.7-3.10 Clang de Xcode 10.14 Bazel 5.3.0
tensorflow-2.10.0 3.7-3.10 Clang de Xcode 10.14 Bazel 5.1.1
tensorflow-2.9.0 3.7-3.10 Clang de Xcode 10.14 Bazel 5.0.0
tensorflow-2.8.0 3.7-3.10 Clang de Xcode 10.14 Bazel 4.2.1
tensorflow-2.7.0 3,7-3,9 Clang de Xcode 10.11 Bazel 3.7.2
tensorflow-2.6.0 3.6-3.9 Clang de Xcode 10.11 Bazel 3.7.2
tensorflow-2.5.0 3.6-3.9 Clang de Xcode 10.11 Bazel 3.7.2
tensorflow-2.4.0 3,6-3,8 Clang de Xcode 10.3 Bazel 3.1.0
tensorflow-2.3.0 3,5-3,8 Clang de Xcode 10.1 Bazel 3.1.0
tensorflow-2.2.0 3,5-3,8 Clang de Xcode 10.1 Bazel 2.0.0
tensorflow-2.1.0 2.7, 3.5-3.7 Clang de Xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2.7, 3.5-3.7 Clang de Xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2.7, 3.3-3.7 Clang de Xcode 10.1 Bazel 0.26.1
tensorflow-1.15.0 2.7, 3.3-3.7 Clang de Xcode 10.1 Bazel 0.26.1
tensorflow-1.14.0 2.7, 3.3-3.7 Clang de xcode Bazel 0.24.1
tensorflow-1.13.1 2.7, 3.3-3.7 Clang de xcode Bazel 0.19.2
tensorflow-1.12.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.15.0
tensorflow-1.11.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.15.0
tensorflow-1.10.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.15.0
tensorflow-1.9.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.11.0
tensorflow-1.8.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.10.1
tensorflow-1.7.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.10.1
tensorflow-1.6.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.8.1
tensorflow-1.5.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.8.1
tensorflow-1.4.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.5.4
tensorflow-1.3.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.5
tensorflow-1.2.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.5
tensorflow-1.1.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.2
tensorflow-1.0.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.2

GPU

Version Version Python Compilateur Construire des outils cuDNN CUDA
tensorflow_gpu-1.1.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7, 3.3-3.6 Clang de xcode Bazel 0.4.2 5.1 8