Make: how to continue after a command fails?

Makefile

Makefile Problem Overview


The command $ make all gives errors such as rm: cannot remove '.lambda': No such file or directory so it stops. I want it to ignore the rm-not-found-errors. How can I force-make?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex

Makefile Solutions


Solution 1 - Makefile

Try the -i flag (or --ignore-errors). The documentation seems to suggest a more robust way to achieve this, by the way:

> To ignore errors in a command line, write a - at the beginning of the line's text (after the initial tab). The - is discarded before the command is passed to the shell for execution. > > For example, > > clean: > -rm -f *.o > > This causes rm to continue even if it is unable to remove a file.

All examples are with rm, but are applicable to any other command you need to ignore errors from (i.e. mkdir).

Solution 2 - Makefile

make -k (or --keep-going on gnumake) will do what you are asking for, I think.

You really ought to find the del or rm line that is failing and add a -f to it to keep that error from happening to others though.

Solution 3 - Makefile

Return successfully by blocking rm's returncode behind a pipe with the true command, which always returns 0 (success)

rm file || true

Solution 4 - Makefile

Change clean to

rm -f .lambda .lambda_t .activity .activity_t_lambda

I.e. don't prompt for remove; don't complain if file doesn't exist.

Solution 5 - Makefile

To get make to actually ignore errors on a single line, you can simply suffix it with ; true, setting the return value to 0. For example:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

This will redirect stderr output to null, and follow the command with true (which always returns 0, causing make to believe the command succeeded regardless of what actually happened), allowing program flow to continue.

Solution 6 - Makefile

Put an -f option in your rm command.

rm -f .lambda .lambda_t .activity .activity_t_lambda

Solution 7 - Makefile

Change your clean so rm will not complain:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionhhhView Question on Stackoverflow
Solution 1 - MakefileEli BenderskyView Answer on Stackoverflow
Solution 2 - MakefileT.E.D.View Answer on Stackoverflow
Solution 3 - MakefileBryce GuintaView Answer on Stackoverflow
Solution 4 - MakefileBrian CarltonView Answer on Stackoverflow
Solution 5 - MakefileRiotView Answer on Stackoverflow
Solution 6 - MakefileNebuSoftView Answer on Stackoverflow
Solution 7 - MakefileOdedView Answer on Stackoverflow