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
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)
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)
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)
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)
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)
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)
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)
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)
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)