Re: Dynamic make target

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

 



Toan Pham wrote:

> I do not know where to ask this question perhaps this mailing list is
> best because it had to do with c complilation.
> 
> I would like to set up a make target dynamicly.  for example
> 
> when one issue command:  make sda1
> it auto compile and install to a mount point @ /mnt/sda1
> 
> similiarly: make sda2 would compile and install to /mnt/sda2
> 
> 
> i know that in a makefile one can accomplish this by setting up two targets, ie.
> 
> sda1:
>        make all
>        mount /dev/sda1 /mnt/sda1
>        cp releases/* /mnt/sda1
>        umount /mnt/sda1
> 
> sda2:
>        make all
>        mount /dev/sda1 /mnt/sda2
>        cp releases/* /mnt/sda2
>        umount /mnt/sda2
> 
> 
> i am curious if we can simplify everything by having a make target
> like this when no matches found
> 
> $param1:
>        make all
>        mount /dev/sda1 /mnt/$param1
>        cp releases/* /mnt/$param1
>        umount /mnt/$param1

You could use a pattern rule, e.g.:

	sda%:
	       make all
	       mount /dev/$@ /mnt/$@
	       cp releases/* /mnt/$@
	       umount /mnt/$@

But that's really abusing make; it's better to use variables for this,
e.g.:

	DISC = sda1

	install:
	       make all
	       mount /dev/$(DISC) /mnt/$(DISC)
	       cp releases/* /mnt/$(DISC)
	       umount /mnt/$(DISC)

and use e.g.:

	make install DISC=sda1

Beyond that:

1. Don't use "make" in commands; use $(MAKE) instead. This will work
if your make program is actually called e.g. gmake, make-3.81, etc. 
Also, if you use "make -n", $(MAKE) will perform a recursive "make -n"
rather than just printing the "make" command.

1a. But only invoke $(MAKE) explicitly if you need to force a
particular sequence. It's usually preferable to list the target as a
prerequisite, e.g.:

	install: all

rather than:

	install:
		$(MAKE) all

2. Use $(INSTALL) rather than "cp". "install" will replace files
atomically, while "cp" overwrites the destination in-place. This fails
if the destination is an executable which is in-use, and can cause
problems due to parallel builds attempting to proceed with an
incomplete source file.

3. "phony" targets shouldn't be over-used. Their behaviour can be
non-intuitive with respect to parallel builds, and executing commands
unconditionally becomes a nuisance once a project gets large.

-- 
Glynn Clements <glynn@xxxxxxxxxxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux