Sponsored Content
Top Forums UNIX for Advanced & Expert Users makefile head-scratcher: multiple targets in one go Post 302494284 by drl on Sunday 6th of February 2011 07:21:02 PM
Old 02-06-2011
Hi.

My understanding is that you want to run a command if any of the targets are out of date, but only once, not once for each target. If so, then this seems to work:
Code:
#!/usr/bin/env bash

# @(#) s1	Demonstrate PHONY makefile targets.

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for i;do printf "%s" "$i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Makefile:"
cat Makefile

pl " Command to execute if anything out of date:"
cat s2

pl " Initial content of files" [a-z].txt
cat [a-d].txt

pl " Results for touching conf:"
touch abcd.conf
make
cat [a-d].txt

pl " Results for touching a.txt:"
touch a.txt
make
cat [a-d].txt

producing:
Code:
% ./s1

-----
 Makefile:
# Sun Feb  6 15:37:15 CST 2011

.PHONY: all
all: a.txt b.txt c.txt d.txt abcd.conf
	./s2 abcd.conf

-----
 Command to execute if anything out of date:
#!/usr/bin/env bash

# @(#) s2	Add one to change content of files.

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for i;do printf "%s" "$i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

for file in [abcd].txt
do
  t1=$( cat $file )
  (( t1++ ))
  pe "$t1" > $file
done

-----
 Initial content of files a.txt b.txt c.txt d.txt
0
0
0
0

-----
 Results for touching conf:
./s2 abcd.conf
1
1
1
1

-----
 Results for touching a.txt:
./s2 abcd.conf
2
2
2
2

The file abcd.conf here is a dummy file, yours presumably has something that is operated upon by your "myscript".

Best wishes ... cheers, drl

( Edit 1: minor typo )

---------- Post updated at 16:40 ---------- Previous update was at 16:00 ----------

Hi.

I see that I forgot to add a plain make without touching anything. That action will also run the ./s2 script, so this is probably not an appropriate solution -- one might as well just always run the script.

I'll continue to poke around ... cheers, drl

---------- Post updated at 18:21 ---------- Previous update was at 16:40 ----------

Hi.

Mod 2:
Code:
#!/usr/bin/env bash

# @(#) s1	Demonstrate PHONY makefile targets.

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for i;do printf "%s" "$i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

M=m2
pl " Makefile, $M:"
cat $M

pl " Command to execute if anything out of date:"
cat s2

pl " Initial content of files" [a-z].txt
cat [a-d].txt

pl " Results for touching a.txt:"
touch a.txt
make -f $M
cat [a-d].txt

pl " Results for touching c.txt:"
sleep 1
touch c.txt
make -f $M
cat [a-d].txt

pl " Results for plain make, nothing out of date:"
sleep 1
make -f $M
cat [a-d].txt

pl " Results for touching abcd.conf, backdated 5 seconds:"
t1=$(date --date="now - 5 sec" +'%Y%m%d%H%M.%S')
touch -t "$t1" abcd.conf
make -f $M
cat [a-d].txt

producing:
Code:
% ./s1

-----
 Makefile, m2:
# Sun Feb  6 15:37:15 CST 2011

abcd.conf: a.txt b.txt c.txt d.txt 
	./s2 abcd.conf
	touch abcd.conf

-----
 Command to execute if anything out of date:
#!/usr/bin/env bash

# @(#) s2	Add one to change content of files.

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for i;do printf "%s" "$i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

for file in [abcd].txt
do
  t1=$( cat $file )
  (( t1++ ))
  pe "$t1" > $file
done

-----
 Initial content of files a.txt b.txt c.txt d.txt
0
0
0
0

-----
 Results for touching a.txt:
./s2 abcd.conf
touch abcd.conf
1
1
1
1

-----
 Results for touching c.txt:
./s2 abcd.conf
touch abcd.conf
2
2
2
2

-----
 Results for plain make, nothing out of date:
make: `abcd.conf' is up to date.
2
2
2
2

-----
 Results for touching abcd.conf, backdated 5 seconds:
./s2 abcd.conf
touch abcd.conf
3
3
3
3

cheers, drl

Last edited by drl; 02-06-2011 at 06:13 PM..
This User Gave Thanks to drl For This Post:
 

10 More Discussions You Might Find Interesting

1. Solaris

Makefile:57: *** multiple target patterns. Stop.

Hi, I am getting the following error while building on Solaris 64 , while I am trying to build. Error Snippet :- ---------------------- Makefile:57: *** multiple target patterns. Stop. make: Leaving directory `/work1/patch/vds6053sun64o/vobs/jvi' make: *** Error 2 make: Leaving directory... (0 Replies)
Discussion started by: nileshborate
0 Replies

2. UNIX for Dummies Questions & Answers

makefile Q about targets $@

Hi All I need to parse the target something like: ifeq '$@' 'first' echo 1 $@ endif ifeq '$@' 'second' echo 2 $@ endif The thing is to be able compare the target string to any string and then do the commands Thanks a lot ziv (0 Replies)
Discussion started by: zivsegal
0 Replies

3. UNIX for Dummies Questions & Answers

epstopdf for multiple files using makefile

Greetings! I'm fairly new to the unix world and I hope someone here can help me with my question. I'm using a Makefile to run a few programs and the final output is several .eps files. However I need them to be .pdf files, so I want to use epstopdf to convert the files. Since I'm already... (6 Replies)
Discussion started by: wwoord
6 Replies

4. Shell Programming and Scripting

Multiple script lines into a Makefile

Hi All I am creating a makefile and I want to do a clean section. In the clean section I would like to check if the file exists and then delete it. I always have an error 'unexpected end of file' What's wrong in it? Thanks msntn firstCpp: first.cpp g++ -o first first.cpp clean: ... (1 Reply)
Discussion started by: manustone
1 Replies

5. Shell Programming and Scripting

head / tail combination returns multiple rows

Hi, As part of our project, we need to load historical data for a year before our system is live. We have the data feed files that we need to load. However, I need to make sure that the file structure (number of fields separated by a comma) on the field is same for all the files of the same... (1 Reply)
Discussion started by: raj.jha
1 Replies

6. Programming

Makefile for building multiple programs

I have the following part of a makefile and want to simplify it using rules rather than having to code the same two blocks when I need ti build another program. An having difficulty doing it all: 1dvel2 1dvel 2dvel ... (8 Replies)
Discussion started by: kristinu
8 Replies

7. Shell Programming and Scripting

Help: Makefile with multiple executables

I am trying to create executables for the following files Currently, I am making 9 different directories for for each. I would like to make 1 directory but everytime I try it does not work. CROSS_COMPILE?= # CROSS_COMPILE used to = arm-arago-linux-gnueabi... (1 Reply)
Discussion started by: bpetersen
1 Replies

8. Shell Programming and Scripting

Makefile with multiple executables

CROSS_COMPILE?= LIBDIR_APP_LOADER?=../../../../app_loader/lib INCDIR_APP_LOADER?=../../../../app_loader/include BINDIR?=../../bin CFLAGS+= -Wall -I$(INCDIR_APP_LOADER) -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -std=gnu99 LDFLAGS+=-L$(LIBDIR_APP_LOADER) -lprussdrv -lpthread OBJDIR=obj... (1 Reply)
Discussion started by: bpetersen
1 Replies

9. Shell Programming and Scripting

Paste multiple files, but only the sorted head -50

Hello, I want to merge multiple files (under hundreds folders) side by side. File name are the same but folder are different. like folder1/same_name.txt folder2/same_name.txt folder3/same_name.txt ......Normally it can be done as paste /different_path*/same_name.txt > merged_file.txtbut... (2 Replies)
Discussion started by: yifangt
2 Replies

10. Shell Programming and Scripting

Question in creating targets in makefile

Hi, I have a question related to makefile. I'm new to makefile and I'm in the process of writing a makefile for my RBT build. I have multiple source files and when I compile them I will get multiple object files (one object file for each source file). I'm having problem in creating a target for... (1 Reply)
Discussion started by: Anand Venkatesa
1 Replies
All times are GMT -4. The time now is 12:23 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy