はじめに

「make: source directory cannot contain spaces or colons.」と表示されて Android や AOSP のビルドが進まない……という状況に陥った方は多いはずです。
この記事は、そんなエラーメッセージに遭遇した Android ビルド初心者〜中級者を対象にしています。
本記事を読むと、なぜそのエラーが出るのか、どうすれば最短でビルドを再開できるのか、3 つの実践的な対処法をすぐに実践できるようになります。Windows + WSL 環境でも、macOS でも、Linux ネイティブでも使える内容です。

前提知識

  • ターミナルで cdls などの基本コマンドが打てる
  • Android/OpenJDK などで source build/envsetup.sh && lunch したことがある
  • ファイルパスに空白や「:」が含まれるとコマンドが壊れることをイメージできる

エラーの意味:make がディレクトリ名を拒絶する理由

make 内部で呼ばれるシェルスクリプト(特に build/soong/scripts/envsetup.shenvsetup.mk)は、PATH 文字列をコロン(:)で split して処理します。
そのため、ディレクトリ名に

  1. 半角空白(スペース)
  2. コロン(:)

が含まれていると、トークナイザが意図しない分割を起こし、ビルドシステムは「このソースディレクトリは危険」と判断して即座に exit します。
結果が source directory cannot contain spaces or colons. という一文になるわけです。

3 つの対処法(環境別)

1. 最速解:該当文字を含まないパスへ移動する(全環境共通)

手順

  1. ビルド対象の AOSP ディレクトリを一旦停止
    bash cd ~
  2. 新規ディレクトリを作成
    bash mkdir -p /aosp sudo chown $USER:$USER /aosp # 権限が必要なら
  3. 既存リポジトリを移動
    bash mv "$HOME/My Documents/AOSP" /aosp/aosp
  4. ビルド再開
    bash cd /aosp/aosp source build/envsetup.sh && lunch aosp_x86-eng make -j$(nproc)

ポイント:空白もコロンも使わない「/aosp/aosp」という短いパスにしてしまえば、以後一切同エラーが出なくなります。

2. Windows + WSL で「C:\Users\User Name\」を回避する

WSL は Windows 側の「C:\Users\User Name\」を /mnt/c/Users/User Name/ としてマウントしますが、このパスに空白が必ず入る ため、make が反発します。

手順

  1. WSL 側に ext4 ボリュームを作成
    bash sudo mkdir /work sudo mount -t ext4 -o bind /work /work
  2. Windows 側でもアクセスしやすくする(オプション)
    エクスプローラーアドレスバーに \\wsl$\Ubuntu\work と打つと閲覧・編集が可能です。
  3. AOSP リポジトリを /work/aosp に配置してビルド
    これで Windows 側パスに一切依存しなくなります。

3. 既存パスを変えたくない:シンボリックリンクで逃げる(応用編)

社内ポリシーでディレクトリ配置を変えられない場合、symlink を貼って見かけのパスを騙す手法も使えます。

手順例

Bash
# 実体は "Project AOSP" ディレクトリ ln -s "/home/dev/Project AOSP" /home/dev/aosp_link cd /home/dev/aosp_link source build/envsetup.sh make

make に与える論理パス(aosp_link)に空白が存在しないため、ビルドは通ります。
ただし、Soong や Kati の将来のアップデートでこの回避策が通用しなくなる可能性もゼロではないため、推奨度は低めです。

ハマりどころとトラブルシュート

Q. 移動先のパーティションが NTFS/exFAT でファイルシステムケース感覚が壊れる

A. ext4 ボリュームを確保できない場合、/opt/srv など既存の ext4 マウントポイントを使いましょう。
例:
bash sudo mkdir /opt/aosp sudo chown $USER:$USER /opt/aosp

Q. リポジトリが巨大で mv に時間がかかりすぎる

A. rsync --remove-source-files または mv をワンライナーで並列化
bash rsync -a --info=progress2 --remove-source-files "$HOME/My Documents/AOSP/" /aosp/aosp/

Q. すでに make を叩いてしまい、out/ ディレクトリができている

A. out/ 以下の絶対パスが記録されているため、一度 rm -rf out してからビルドし直すのが最短です。
ccache や sccache を有効にしておけば再コンパイル時間は最小限ですむはずです。

まとめ

  • make が「source directory cannot contain spaces or colons.」と怒るのは、空白・コロンが PATH 区切り文字と干渉するため
  • 最速で確実な解決策は「空白・コロンを含まない短いパスへ移動する」こと
  • Windows + WSL では /mnt/c/... ではなく WSL 内 ext4 ボリュームを使おう
  • どうしても移動できない場合は symlink で一時しのぎも可能(将来性に留意)

これで AOSP や Android カーネルのビルドが止まることはありません。
次回は「Soong で Ninja 生成が遅い問題を ccache + 並列化で高速化する方法」をお届けします。

参考資料

  • AOSP 公式ビルドガイド(WSL 環境)
    https://source.android.com/setup/build/building
  • make ソースコメント(PATH のトークナイズ部分)
    https://git.savannah.gnu.org/cgit/make.git/tree/src/misc.c
  • Kati プロジェクト README
    https://github.com/google/kati