2017-01-28 1 views
0

私はクロスコンパイラをコンパイルするMakefileを書こうとしています。 GCCbinutilsをダウンロードし、アーカイブを解凍してconfigureスクリプトを実行し、makeを実行します。なぜこのメイクファイルは1つのジョブでのみ動作しますか?

これは私が書いたMakefile次のとおりです。

# Versions 
GCC_VERSION := 6.3.0 
BINUTILS_VERSION := 2.27 

# Build 
TARGET ?= i686-elf 
PREFIX := $(realpath build) 

# Phony tasks 
.PHONY: all clean gcc binutils 

# Targets 
BINUTILS_TARGETS := build/bin/${TARGET}-addr2line build/bin/${TARGET}-ar \ 
    build/bin/${TARGET}-as build/bin/${TARGET}-c++filt \ 
    build/bin/${TARGET}-elfedit build/bin/${TARGET}-gprof \ 
    build/bin/${TARGET}-ld build/bin/${TARGET}-ld.bfd build/bin/${TARGET}-nm \ 
    build/bin/${TARGET}-objcopy build/bin/${TARGET}-objdump \ 
    build/bin/${TARGET}-ranlib build/bin/${TARGET}-readelf \ 
    build/bin/${TARGET}-size build/bin/${TARGET}-strings \ 
    build/bin/${TARGET}-strip 
GCC_TARGETS := build/bin/${TARGET}-cpp build/bin/${TARGET}-gcc \ 
    build/bin/${TARGET}-gcc-${GCC_VERSION} build/bin/${TARGET}-gcc-ar \ 
    build/bin/${TARGET}-gcc-nm build/bin/${TARGET}-gcc-ranlib \ 
    build/bin/${TARGET}-gcov build/bin/${TARGET}-gcov-tool 

# Aliases 
all: binutils gcc 
gcc: ${GCC_TARGETS} 
binutils: ${BINUTILS_TARGETS} 

# Download the packages 
packages/gcc-${GCC_VERSION}.tar.bz2: 
    curl ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2 \ 
     -o [email protected] 
packages/binutils-${BINUTILS_VERSION}.tar.bz2: 
    curl ftp://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2 \ 
     -o [email protected] 

# Extract them 
packages/gcc-${GCC_VERSION}/configure: packages/gcc-${GCC_VERSION}.tar.bz2 
    tar -xmjf $< -C packages 
packages/binutils-${BINUTILS_VERSION}/configure: packages/binutils-${BINUTILS_VERSION}.tar.bz2 
    tar -xmjf $< -C packages 

# Build them 
${GCC_TARGETS}: packages/gcc-${GCC_VERSION}/configure 
    mkdir -p build/gcc 
    cd build/gcc && ../../packages/gcc-${GCC_VERSION}/configure \ 
     --target=${TARGET} --prefix=${PREFIX} --disable-nls \ 
     --enable-languages=c --without-headers && make all-gcc && \ 
     make all-target-libgcc && make install-gcc && make install-target-libgcc 
${BINUTILS_TARGETS}: packages/binutils-${BINUTILS_VERSION}/configure 
    mkdir -p build/binutils 
    cd build/binutils && ../../packages/binutils-${BINUTILS_VERSION}/configure \ 
     --target=${TARGET} --prefix=${PREFIX} --with-sysroot --disable-nls \ 
     --disable-werror && make && make install 

# Clean everything 
clean: 
    rm -rf build/* 
    rm -rf packages/* 

をオプションなしでmakeを実行している場合には動作しますが、私は仕事のオプションを使用する場合、それが失敗した(ただし、毎回):それは、並列にbinutilsGCCをダウンロード。

binutilsが完全にダウンロードされると、ダウンロードされてコンパイルされ、GCCのダウンロードは終了しますが、何も実行されずエラーもありません。

また、時にはGCCまたはbinutilsのコンパイルで奇妙なエラーが発生することがあります(この記事の一部を編集します)。

答えて

0

特定のビルドの失敗の正確な原因は不明ですが、Makefileに問題があります.2つのビルドルールには複数のターゲットがあります。 Makeはこれをうまくサポートしません。詳しくはhereを参照してください。

0

同じレシピの複数のインスタンスを開始するため、これらのインスタンスを正しく一緒に実行することができないため、ジョブを使用して作成が失敗します。

これは、ジョブを使用して作成すると、同じディレクトリ内の複数の構成呼び出しが非同期で実行されるためです。したがって、複数のconfigureスクリプトを実行して、同じディレクトリにビットを追加します。そして、同じビルドディレクトリに複数のMakeのインスタンスが呼び出されます。完璧な混乱。以下のような

何か:

${GCC_TARGETS}: packages/gcc-${GCC_VERSION}/configure 
    mkdir -p build/gcc/$(nodir [email protected]) && cd build/gcc/$(nodir [email protected]) ... 

は&を設定起動によって問題を修正する必要があります別のディレクトリ内のシーケンスを作ります。 $ {BINUTILS_TARGETS}にも同様の修正が必要です。

関連する問題