Makefile无法识别已经生成的来源

问题描述 投票:1回答:1

我正在尝试使用makefile生成RPM,我期望makefile的行为如下:

  1. 如果不存在RPM并且尚未准备好源,请继续执行以下两项操作:先生成源,然后生成RPM
  2. 如果RPM已经存在但源已更改,请继续并准备源并再次生成RPM
  3. 如果源未更改且RPM已经存在,则不执行任何操作

但是,现在我从下面的makefile中获得的行为并不是我想要的,因为它可以识别RPM是否存在,但是当归结为源时,它并不能真正识别出它们已经存在。

这是makefile:

SHELL        = /bin/bash
.SHELLFLAGS  = -o pipefail -c
COLORIZE    := 2>&1 | sed -re "s/^(Executing|Wrote)(.*: )/"$$'\E'"[32m\1\2"$$'\E'"[0m/g" \
    -e "s/(error[s]?)/"$$'\E'"[31m\1"$$'\E'"[0m/ig" \
    -e "s/(warn|warning)/"$$'\E'"[33m\1"$$'\E'"[0m/ig"

SPEC        := $(shell find . -name \*spec -printf '%f' -quit)
ARCH        := $(shell rpm -q --qf '%{arch}' --specfile $(SPEC))
DIST        := .el
NAME        := $(basename $(SPEC))
RELEASE     := $(shell rpm -q --qf '%{release}' --specfile $(SPEC) | cut -d. -f1)
VERSION     := $(shell rpm -q --qf '%{version}' --specfile $(SPEC))

BUILDDIR    := ./rpm-build
RPM         := $(BUILDDIR)/RPMS/$(ARCH)/$(NAME)-$(VERSION)-$(RELEASE)$(DIST).$(ARCH).rpm
RPMBUILD    := rpmbuild --define "_topdir %(pwd)/$(BUILDDIR)" \
    --define "_source_filedigest_algorithm md5" \
    --define "_binary_filedigest_algorithm md5" \
    --define "_source_payload w9.gzdio" \
    --define "_binary_payload w9.gzdio" \
    --define "_sourcedir  %{_topdir}/SOURCES" \
    --define "_target_os linux" \
    --define "dist .el"

SOURCE0     := $(BUILDDIR)/SOURCES/$(NAME)-$(VERSION).jar

.PHONY: all clean

all: $(RPM)

$(BUILDDIR):
    @mkdir -p $(BUILDDIR)/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS,TEMP}

$(SOURCE0): $(BUILDDIR) $(SPEC)
    spectool -g -C $(BUILDDIR)/SOURCES $(SPEC)

$(RPM): $(SPEC) $(SOURCE0)
    @echo -e "Building $(RPM)"
    $(RPMBUILD) -bb $< $(COLORIZE)

clean:
    @- $(RM) -rf ./$(BUILDDIR)

管理源时我做错了什么,我只是不想在每次运行make命令时都准备好它们?

linux makefile
1个回答
1
投票

您绝不应该将具有目录的目标作为先决条件,因为目录时间戳会在不寻常的时间进行更新。我不应该说“从不”。它可能非常有用,但其含义与您所想的完全不同。

您可以尝试使用仅限订购的先决条件:

$(BUILDDIR):
        @mkdir -p $(BUILDDIR)/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS,TEMP}

$(SOURCE0): $(SPEC) | $(BUILDDIR)
        spectool -g -C $(BUILDDIR)/SOURCES $(SPEC)

或者您也可以将mkdir放入配方中:

$(SOURCE0): $(SPEC)
        @mkdir -p $(BUILDDIR)/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS,TEMP}
        spectool -g -C $(BUILDDIR)/SOURCES $(SPEC)

注意,您在此处使用了特定于bash的问题({})。如果要便携,则需要添加:

SHELL := /bin/bash

到您的makefile。

© www.soinside.com 2019 - 2024. All rights reserved.