Re: Help needed for writing a rule

Patrick Begou <[email protected]>
Newsgroups gmane.comp.gnu.make.general
Message-ID <[email protected]>
Hi Paul

many thanks for your quick answer.
Indeed, I've found a solution. Since my email: as nothing was working 
for a while, I dive again and again in the documentation and then decide 
to remove all my complex and not working syntax to try to build a 
functional Makefile. And I think I have a solution. The small test below 
is working. The modified Makefile of one of my folders from my large 
application seams to work too.

Seams that it could be as simple as this Makefile:
       1
       2 .SUFFIXES:
       3
       4 # building only the mod file
       5 %_M.mod:
       6         @echo "building $@ from $<"
       7         touch $@
       8
       9 %_m.o:   %_m.f90
      10         @echo "building $@ module from $<"
      11         touch $@
      12
      13 %.o:     %.f90
      14         @echo "building $@ from $<"
      15         touch $@
      16
      17 all: toto.o
      18
      19 clean:
      20         rm -f *.mod *.o LIB/*
      21
      22 toto.o :  toto.f90 LIB/TITI_M.mod titi_m.o
      23 titi_m.o LIB/TITI_M.mod:        titi_m.f90

Just run:
touch titi_m.f90  toto.f90
mkdir LIB
make

Of course this works because I am building a ".depends" file with all 
dependencies dynamically too for my application. In the provided 
Makefile example, dependencies are added at the end of the makefile.
May be this could have side effects I do not see, but seams to work on 
the computer (RHEL8). I should try on other linux flavor as it must be 
portable.

Patrick

Le 25/11/2022 à 16:30, Paul Smith a écrit :
> On Fri, 2022-11-25 at 15:26 +0100, Patrick Begou wrote:
>> How can I write a generic rule for building TOTO_M.mod from
>> toto_m.f90 source and put it in the LIB folder ?
> There is no way to do this using "straightforward" pattern rules.
> Pattern rules always rely on the stem (the "%" part) being an identical
> string (including case) in the target and prerequisite.  That cannot be
> changed.
>
>> Of course,the following lines will not work as the "%" token will be
>> in uppercase on the right hand side.
>>
>> # building only the mod file
>> LIB/%_M.mod: %_m.f90
>>           @echo "building $*_M.mod"
>>           touch $@
> The only thing I can think of is to use secondary expansion:
>
>    .SECONDEXPANSION:
>
>    # building only the mod file
>    LIB/%_M.mod: $$(shell echo $$* | tr A-Z a-z)_m.f90
>            @echo "building $*_M.mod"
>            touch $@
>
> Note the doubled-"$" here.
>
> If this doesn't work then it's not possible to create an implicit rule
> in your situation and you'll just have to create explicit rules for all
> your targets.  You can use a foreach / eval loop to do it if you don't
> want to write it all out by hand.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.