Makefile не распознает уже созданные источники - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь сгенерировать RPM с make-файлом, ожидаемое от make-файла поведение выглядит следующим образом:

  1. Если RPM не существует, а исходные файлы еще не подготовлены, продолжайте и сделайте оба: создайте источники и затем RPM
  2. Если RPM уже существует, но источники изменились, продолжайте и подготовьте источники и сгенерируйте RPM еще раз
  3. Если источники имеютне изменились, и RPM уже существует, ничего не делайте

Однако, сейчас поведение, которое я получаю из make-файла ниже, не совсем так, как я хочу, так как он распознает,RPM существуют, но когда дело доходит до источников, они на самом деле не признают, что они уже существуют.

Вот make-файл:

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?

1 Ответ

1 голос
/ 31 октября 2019

У вас никогда не должно быть цели с каталогом в качестве предварительного условия, поскольку временные метки каталога обновляются в необычное время. Я не должен говорить «никогда»;это может быть очень полезно, но это означает нечто совершенно иное, чем вы думаете.

Вы можете попробовать использовать для этого обязательное условие только для заказа:

$(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

в ваш make-файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...