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.