help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Recursive implicit rules without explicit intermediates?


From: Nicholas Clark
Subject: Re: Recursive implicit rules without explicit intermediates?
Date: Thu, 15 Jan 2015 10:18:24 -0800

How about using pattern substitutions?

Something like:

#-------------------------------------------------------------------#

default: all

#--------- Inputs ------------#

INPUTS := in1.input in2.input in3.input
SECOND_INPUTS := second_in1.input second_in2.input second_in3.input

$(INPUTS) $(SECOND_INPUTS):
    touch $@

#------ Intermediates --------#

INTERMEDIATES := $(patsubst %.input,%.intermediate,$(INPUTS))

%.intermediate: %.input
    cp $< $@

#--------- Outputs -----------#

OUTPUTS := $(patsubst %.input,%.output,$(SECOND_INPUTS))

all: $(OUTPUTS)

%.output: %.input $(INTERMEDIATES)
    cp $< $@

#---------- Misc ------------#

clean:
    rm -f *.output *.intermediate

distclean:
    rm -f *.input *.output *.intermediate

.DELETE_ON_ERROR:
.INTERMEDIATE: $(INTERMEDIATES)




On Thu, Jan 15, 2015 at 4:15 AM, Luke Goodsell <address@hidden>
wrote:

> Hi,
>
> Thanks in advance for taking the time to read and reply to my email.
>
> $ make --version
> GNU Make 4.0
> Built for x86_64-pc-linux-gnu
>
> Abstract:
>
> I'm writing a template makefile for performing similar - but different -
> computational biology pipelines and am encountering an issue with recursive
> implicit rules. Please can you suggest a solution that doesn't require
> explicitly listing every intermediate target?
>
> Background:
>
> I'm writing a Makefile template that can be used for new projects. Each
> project follows a very similar, path but with differences that must be
> manually adapted. Each project has to perform similar tasks on each of
> number of different 'sections', each of which has a number of different
> 'groups' that each have a number of 'steps'. Each step cannot be run until
> the previous step has run. The same is true of groups and sections.
>
> Problem:
>
> The first group of the first section runs fine, with all steps running
> without error. However, the second group of the first section - and all
> subsequent targets - fails with:
>
> make: *** No rule to make target '[TARGET]'.  Stop.
>
> I understand that an implicit rule cannot be used multiple times within a
> chain, and that the standard solution is to explicitly declare an
> intermediate. However, since this makefile template may have tens each of
> steps, groups and sections, that would require hundreds to thousands of
> explicitly declared intermediates.
>
> Is there a better solution I've overlooked?
>
> Addendum:
>
> A prototypical makefile that demonstrates the problem is pasted below.
>
> Kind regards,
> Luke
>
>
> # Example makefile
> # I want to be able to be able to `make all` without explicitly listing all
> # intermediate steps. The first target that fails is
> # section/section1/group2/step1/do_step
>
> all: \
>       section/section2/section_end \
>
>       echo "$@";
>
> section/section1/section_start: \
>
>       echo "$@";
>
> section/section2/section_start: \
>       section/section1/section_end
>
>       echo "$@";
>
> # eg: section/section1/group1/group_start
> section/%/group1/group_start: \
>
>       echo "$@";
>
> # eg: section/section1/group2/group_start
> section/%/group2/group_start: \
>       section/%/group1/group_end \
>
>       echo "$@";
>
> # eg: section/section1/group1/step1/do_step
> # eg: section/section1/group2/step1/do_step
> section/%/step1/do_step: \
>       section/%/group_start \
>
>       echo "$@";
>
> # eg: section/section1/group1/step2/do_step
> section/%/step2/do_step: \
>       section/%/step1/do_step \
>
>       echo "$@";
>
> # eg: section/section1/group1/step3/do_step
> section/%/step3/do_step: \
>       section/%/step2/do_step \
>
>       echo "$@";
>
> # eg: section/section1/group1/group_end
> section/%/group_end: \
>       section/%/step3/do_step \
>
>       echo "$@";
>
> # eg: section/section1/section_end
> section/%/section_end: \
>       section/%/group2/group_end \
>
>       echo "$@";
>
>
>
> _______________________________________________
> Help-make mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/help-make
>



-- 
Nicholas Clark
Email: address@hidden


reply via email to

[Prev in Thread] Current Thread [Next in Thread]