【问题标题】:Why does this makefile only work with a single job?为什么这个 makefile 只适用于单个作业?
【发布时间】:2017-01-28 18:48:15
【问题描述】:

我正在尝试编写一个编译交叉编译器的Makefile。 它会下载GCCbinutils,解压缩存档,运行configure 脚本并运行make。

这是我写的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 $@
packages/binutils-${BINUTILS_VERSION}.tar.bz2:
    curl ftp://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2 \
        -o $@

# 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下载结束,但是什么也没做,也没有错误。

有时GCCbinutils 的编译会因奇怪的错误而失败(我将用其中一些错误来编辑这篇文章)。

【问题讨论】:

    标签: multithreading makefile download cross-compiling


    【解决方案1】:

    不确定具体构建失败的确切来源,但 Makefile 存在问题:2 个构建规则有多个目标。 Make 不太支持这一点,请参阅here 了解说明。

    【讨论】:

      【解决方案2】:

      Make with jobs 失败,因为它启动了同一配方的多个实例,但这些实例无法一起正确运行。

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

      我猜这是麻烦制造者,因为 Make with jobs 在同一目录中启动多个配置调用以异步运行。因此,您有多个配置脚本正在运行并将位添加到同一目录。然后在同一个构建目录中调用多个 Make 实例。完美的混乱。

      类似:

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

      应该通过在不同目录中启动 configure & make 序列来解决问题。您也需要对 ${BINUTILS_TARGETS} 进行类似的修复。

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多