Often the automatic builds are controlled by the make
tools using the
rules defined in so named Makefile
. make
is very nice since it
allow a smooth control of the build with a direct link with dependencies.
Therefore only what is need to be build is built. A rule is executed only when the
dependencies are younger than the target for that rule.
To automate the builds regularly the construction might be run regularly via
cron
jobs. However, if the time in between the make
runs is
smaller than the time required to perform a particular task, this task will be
run several time and filled the resources of the computer. To prevent it we can
setup a protection on the Makefile
to prevent it to be executed several
times at a given time.
Lock file
To prevent the multiple execution of the Makefile
we will use a so called lock
file. When the Makefile
is execute it will create a file with a particular name.
This is our lock file. When it finish to execute, it just delete this file. In case
the Makefile
is run a second time in parallel, it will see that the lock file
exist and stop the processing.
Setting up lock files inside a Makefile
To determine the existence of the file we will use the unix command ls
that will return the name of the lock file if it exist else nothing. We will
catch it in a make variable:
LOCKFILEEXIST = $(shell ls $(LOCKFILE) 2> /dev/null)
Then we test if this variable is empty or not. In case it is not empty, we exit with an error:
ifneq ($(LOCKFILEEXIST), )
$(error "already running")
endif
In case we the lock file does not exist we continue the process and set the lock file.
$(shell touch $(LOCKFILE))
Then follow the rest of the Makefile
like usual. We just need to remove the lock
file at the end of the rpocessing. For this we add it at the end of the all
rules that is the main run.
all:
@echo "processed"
$(shell rm -f $(LOCKFILE))
This command should be add to all rules that terminate the run, otherwise future
run might be blocked even no Makefile
is running
Testing it
The final test Makefile
:
# Definition of the lockfile
LOCKFILE = "test.lock"
# Search for the lock file
LOCKFILEEXIST = $(shell ls $(LOCKFILE) 2> /dev/null)
# if the lock file exist exit
ifneq ($(LOCKFILEEXIST), )
$(error "already running")
endif
# Create the lock file
$(shell touch $(LOCKFILE))
# process and remove the lock file
all:
@echo "processed"
$(shell rm -f $(LOCKFILE))
Without any lock file the execution is done and like this several time:
$ make all
processed
$ make all
processed
When a lock file exist the Makefile stop with an error:
$ touch test.lock
$ make all
Makefile:5: *** "already running". Stop.