Заставьте make взглянуть на файлы перед тем, как завершить круговую зависимость - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть циклическая зависимость с использованием make:

CC              = gcc
IFLAGS          = -Iinclude
CFLAGS          = -Wall -g -c -fPIC -pedantic
AFLAGS          = -shared
LFLAGS          =
VERSION         = $(shell cat desc/major).$(shell cat desc/minor).$(shell cat desc/patch)
DFLAGS          = -D_XOPEN_SOURCE=700 -DLTKVER=\"$(VERSION)\"

OBJECTS         = $(patsubst src/%.c,tmp/%.o, $(shell ls -1 src/*.c))

#OUTPUT         = tmp/$(lastword $(subst /, ,$(shell pwd)))
OUT_BIN         = install/usr/lib/libLTK.so
OUT_MAN         = $(patsubst man/%,install/usr/share/man/%.gz, $(shell find man -type f))
PATH_INCLUDE    = install/usr/include/LTK-$(VERSION)
OUT_INCLUDE     = $(patsubst %,$(PATH_INCLUDE)/%, $(shell find include -type f -printf "%f\n"))
PC              = %

all: $(OUT_BIN) $(OUT_MAN) $(OUT_INCLUDE)
#   chmod 755 install/usr/lib/libLTK.so.$(VERSION)
    ln -sf install/usr/lib/libLTK.so.$(VERSION) install/usr/lib/libLTK.so
#   chmod 755 install/usr/include/LTK-$(VERSION)
#   chmod 644 install/usr/include/LTK-$(VERSION)/*
    ln -sf install/usr/include/LTK-$(VERSION) install/usr/include/LTK

$(OUT_BIN): $(OBJECTS)
    mkdir -p $(shell dirname $@)
    $(CC) $(AFLAGS) -o $@.$(VERSION) $^ $(LFLAGS)

tmp/%.o : src/%.c
    mkdir -p $(shell dirname $@)
    $(CC) $(CFLAGS) -o $@ $< $(DFLAGS) $(IFLAGS)

install/usr/share/%.gz : %
    mkdir -p $(shell dirname $@)
    gzip -c $< > $@

.SECONDEXPANSION:
%.h : $$(patsubst $(PATH_INCLUDE)/$$(PC),include/$$(PC),$$@)
    mkdir -p $(shell dirname $$@)
    cp $< $$@

clean:
    rm -rf tmp install

Во втором файле заголовка расширения необходимые условия генерируются из второго расширения. Но это заголовок, который генерирует другой, и этот новый можно найти на диске. Но make предпочитает рассматривать круговую зависимость и игнорировать ее. Как я могу заставить make увидеть, что файл существует, прежде чем он найдет цель, чтобы сгенерировать его?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Круговые зависимости полностью независимы от того, что существует на диске или не существует на диске. Когда make запускает, он анализирует make-файл и создает график, представляющий отношения зависимости между целями. Этот график должен быть acycli c, потому что make будет ходить по графику в поисках устаревших целей. Если в графике есть цикл, то make будет возвращаться навсегда, пытаясь обойти график.

Например:

a: b ; touch $@
b: a ; touch $@

Не имеет значения, существуют эти файлы или нет: make все еще необходимо убедиться, что «a» новее, чем «b», чтобы удовлетворить первую зависимость, и что «b» новее, чем «a», чтобы удовлетворить вторую зависимость.

Это не может быть правдой, очевидно.

0 голосов
/ 18 апреля 2020

Окончательно решается путем замены $ (OUT_INCLUDE) на% .h.

Цель автоматического копирования включаемых файлов сохраняется. Подставил это:

.SECONDEXPANSION:
$(OUT_INCLUDE) : $$(patsubst $(PATH_INCLUDE)/$$(PERCENT),include/$$(PERCENT),$$@)
    mkdir -p $(shell dirname $@)
    cp $< $@

Для этого:

.SECONDEXPANSION:
%.h : $$(patsubst $(PATH_INCLUDE)/$$(PC),include/$$(PC),$$@)
    mkdir -p $(shell dirname $$@)
    cp $< $$@

Но я все еще спрашиваю себя: "Есть ли что-нибудь, чтобы заставить файл перед зависимостью". После просмотра кода это выглядит как «нет», если я не опущу что-либо.

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