The suffixed "; cd" pipeline causes each recipe to completely ignore the exit status of its recursive make invocation, which is bad. (There's really no need to explicitly change back to the parent directory anyway, since make executes recipes in subshells). Index: Makefile.base =================================================================== --- Makefile.base.orig +++ Makefile.base @@ -1,13 +1,13 @@ lparse : - cd src ; make ; cd .. + cd src && $(MAKE) check : - cd test; make; cd .. + cd test && $(MAKE) clean : - cd src; make clean; cd .. - cd test; make clean; cd .. + cd src && $(MAKE) clean + cd test && $(MAKE) clean install : lparse cp src/lparse $(INSTALLATION_PATH)/