2017-01-28 4 views
0

Ich versuche eine Makefile schreiben, die einen Cross-Compiler kompiliert. Es Downloads GCC und binutils, extrahieren Sie das Archiv, führen Sie das configure Skript und führen Sie make.Warum funktioniert diese Makefile nur mit einem einzigen Job?

Dies ist Makefile schrieb ich:

# 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/* 

Es funktioniert, wenn make ohne Optionen ausgeführt wird, aber wenn ich die Jobs Option zu verwenden, scheitert es (aber nicht immer): es binutils und GCC parallel herunterladen .

Wenn binutils vollständig heruntergeladen wird, extrahiert es und kompiliert es, dann endet der GCC Download, aber es tut nichts und es gibt keine Fehler.

Auch manchmal die Kompilierung von GCC oder binutils schlägt mit seltsamen Fehlern (ich werde diesen Beitrag mit einigen von ihnen bearbeiten).

Antwort

0

Nicht sicher über die genaue Quelle Ihrer spezifischen Build-Fehler, aber das Makefile ist problematisch: Die 2 Build-Regeln haben mehrere Ziele. Make unterstützt dies nicht gut, siehe here für eine Erklärung.

0

Make mit Jobs schlägt fehl, weil mehrere Instanzen desselben Rezepts gestartet werden, diese Instanzen jedoch nicht ordnungsgemäß ausgeführt werden können.

${GCC_TARGETS}: packages/gcc-${GCC_VERSION}/configure 
    mkdir -p build/gcc 
    cd build/gcc && ../../packages/gcc-${GCC_VERSION}/configure ... make ... 

Dies ist Unruhestifter, ich denke, da Stellen mit Jobs mehr configure Anrufungen im selben Verzeichnis asynchron laufen einleiten. Sie müssen also mehrere Konfigurationsskripte ausführen und Bits zum selben Verzeichnis hinzufügen. Und dann werden mehrere Instanzen von Make im selben Build-Verzeichnis aufgerufen. Perfektes Chaos.

Etwas wie:

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

Sollte das Problem mit Hilfe beheben von & machen Sequenzen in verschiedenen Verzeichnissen konfigurieren zu starten. Sie benötigen einen ähnlichen Fix für $ {BINUTILS_TARGETS}.

Verwandte Themen