Makefile и как его использовать для других вещей

Здесь обсуждаются темы, косвенно связанные с Far.
Post Reply
EGez
Posts: 145
Joined: Thu 04 Oct, 2012 13:53
Location: Hamburg, DE
Has thanked: 2 times
Been thanked: 2 times

Makefile и как его использовать для других вещей

Post by EGez »

Здравствуйте,

Работаю над неким документом в LaTeX, для этого пытаюсь решить следующую проблему с помощью msys make, не выходит:
  1. Есть некоторые файлы SVG, которые время от времени изменяются, их необходимо конвертировать в PDF: inkscape file.svg --export-pdf file.pdf
  2. Генерированные таким образом PDF файлы используются при достаточно частой компиляции документа в LaTeX.
  3. В TeXstudio можно указать команду, которая запускается перед компиляцией документа.
  4. Естественно, цель состоит в том, чтобы перед компиляцией документа из TeXstudio конвертировались только те, которые были изменены.
Я так полагаю make тут как нельзя кстати.

На данный момент мой Makefile выглядит вот так:

Code: Select all

SOURCES=class_diagram.svg component_diagramm.svg sequence_diagram_guide.svg sequence_diagram_record.svg
OBJECTS=$(SOURCES:.svg=.pdf)

all: $(OBJECTS)

$(OBJECTS): $(SOURCES)
	"C:\Program Files\inkscape\inkscape.exe" "$<" --export-pdf "$@"
Проблема в том, что при компиляции документа, если был изменен хоть один единственный SVG файл, то конвертируются все, а не тот самый единственный. Если же никакой из них не затронут, make совершенно легально рапортует "Nothing to be done for `all'."

Что не так? Никак не допру :(

Спасибо
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Makefile и как его использовать для других вещей

Post by zg »

EGez wrote:Проблема в том, что при компиляции документа, если был изменен хоть один единственный SVG файл, то конвертируются все, а не тот самый единственный.
имено это в makefile и просится. надо:

Code: Select all

%.pdf: %.svg
	"C:\Program Files\inkscape\inkscape.exe" "$<" --export-pdf "$@"
EGez
Posts: 145
Joined: Thu 04 Oct, 2012 13:53
Location: Hamburg, DE
Has thanked: 2 times
Been thanked: 2 times

Re: Makefile и как его использовать для других вещей

Post by EGez »

zg wrote:имено это в makefile и просится. надо:

Code: Select all

%.pdf: %.svg
	"C:\Program Files\inkscape\inkscape.exe" "$<" --export-pdf "$@"
Спасибо, работает как часики...
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Makefile и как его использовать для других вещей

Post by John Doe »

Есть конвертер документов, работающий с множеством форматов.
Задача: составить makefile, с помощью которого можно было бы собрать проект, указав в качестве цели расширение результирующего файла.

Как-то так:

Code: Select all

SOURCES:=$(wildcard *.md)
NAMES:=$(basename $(SOURCES))

PANDOC:=C:\Apps\Far3\pandoc.exe

%.bbcode: %.md
	$(PANDOC) $(FLAGS) -t $(BBCODE) -o $@ $<

%.html: %.md
	$(PANDOC) $(FLAGS) -s -o $@ $<

bbcode: $(addsuffix .bbcode,$(NAMES))

html: $(addsuffix .html,$(NAMES))
Это работает, но смущает, что два последних правила очень похожи.
Два не проблема, но форматов много, поэтому таких правил может быть много, и подумалось, нельзя ли как-то оптимизировать.

Попробовал такое правило:

Code: Select all

%: $(addsuffix .%,$(NAMES))
Не работает.

А вот такое "почти" работает:

Code: Select all

%: $(addsuffix .%,$(NAMES))
	@echo $@
Файл создаёт, но следом запускает его удаление командой rm.

Я хочу странного?

Edit
Надо так:

Code: Select all

TARGETS:=html bbcode
.PHONY: $(TARGETS)

$(TARGETS): %: $(addsuffix .%,$(NAMES))
Last edited by John Doe on Wed 15 Nov, 2017 17:59, edited 1 time in total.
Post Reply

Return to “Операционные системы, командные оболочки и прочее”