はじめに
「make: source directory cannot contain spaces or colons.」と表示されて Android や AOSP のビルドが進まない……という状況に陥った方は多いはずです。
この記事は、そんなエラーメッセージに遭遇した Android ビルド初心者〜中級者を対象にしています。
本記事を読むと、なぜそのエラーが出るのか、どうすれば最短でビルドを再開できるのか、3 つの実践的な対処法をすぐに実践できるようになります。Windows + WSL 環境でも、macOS でも、Linux ネイティブでも使える内容です。
前提知識
- ターミナルで
cdやlsなどの基本コマンドが打てる - Android/OpenJDK などで
source build/envsetup.sh && lunchしたことがある - ファイルパスに空白や「:」が含まれるとコマンドが壊れることをイメージできる
エラーの意味:make がディレクトリ名を拒絶する理由
make 内部で呼ばれるシェルスクリプト(特に build/soong/scripts/envsetup.sh や envsetup.mk)は、PATH 文字列をコロン(:)で split して処理します。
そのため、ディレクトリ名に
- 半角空白(スペース)
- コロン(:)
が含まれていると、トークナイザが意図しない分割を起こし、ビルドシステムは「このソースディレクトリは危険」と判断して即座に exit します。
結果が source directory cannot contain spaces or colons. という一文になるわけです。
3 つの対処法(環境別)
1. 最速解:該当文字を含まないパスへ移動する(全環境共通)
手順
- ビルド対象の AOSP ディレクトリを一旦停止
bash cd ~ - 新規ディレクトリを作成
bash mkdir -p /aosp sudo chown $USER:$USER /aosp # 権限が必要なら - 既存リポジトリを移動
bash mv "$HOME/My Documents/AOSP" /aosp/aosp - ビルド再開
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 が反発します。
手順
- WSL 側に ext4 ボリュームを作成
bash sudo mkdir /work sudo mount -t ext4 -o bind /work /work - Windows 側でもアクセスしやすくする(オプション)
エクスプローラーアドレスバーに\\wsl$\Ubuntu\workと打つと閲覧・編集が可能です。 - 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
