Specifying –no-print-directory within the Makefile
Setting –no-print-directory in Makefiles
The --no-print-directory flag suppresses make’s default behavior of printing messages when entering and leaving subdirectories. If you invoke make frequently with recursive calls or have a deeply nested project structure, these messages clutter your output. Rather than passing the flag on every invocation, you can set it once in your Makefile.
Add this line near the top of your Makefile:
MAKEFLAGS += --no-print-directory
This assignment adds the flag to MAKEFLAGS, which make reads to determine its operating behavior. The += operator appends to any existing flags rather than replacing them, which is important if you’ve already set other flags elsewhere in the Makefile or in your environment.
How MAKEFLAGS Works
MAKEFLAGS is a special variable that make examines at startup. Any flags set in this variable apply to the current make invocation and are also inherited by recursive make calls (those invoked via $(MAKE) in recipe lines). This inheritance is particularly useful in projects with subdirectories that each have their own Makefile.
When you set MAKEFLAGS in a Makefile, it affects that Makefile and any recursive invocations. However, it does not affect make invocations from parent shells or unrelated processes — only those spawned by the current make instance.
Practical Example
Here’s a realistic Makefile that demonstrates this in context:
MAKEFLAGS += --no-print-directory
.PHONY: all build test clean
all: build test
build:
@echo "Building project..."
cd src && $(MAKE)
@echo "Build complete"
test:
@echo "Running tests..."
cd tests && $(MAKE)
clean:
rm -rf build/
cd src && $(MAKE) clean
cd tests && $(MAKE) clean
Running make all will now execute the recursive make calls in src/ and tests/ without printing enter/leave messages, keeping your build output clean and focused on actual build output.
Environment vs Makefile Configuration
You can also set this flag in your shell environment:
export MAKEFLAGS="--no-print-directory"
However, setting it in the Makefile is preferable for version-controlled projects because:
- It’s explicit and self-documenting
- Every developer gets the same behavior without extra shell configuration
- It applies consistently regardless of how make is invoked
Other Common MAKEFLAGS Options
While you’re configuring MAKEFLAGS, consider these other useful flags:
--warn-undefined-variables: Warns when undefined variables are referenced--jobs=Nor-j N: Enables parallel execution with N jobs (useful in CI/CD pipelines)--keep-goingor-k: Continues building other targets even when one fails
Example:
MAKEFLAGS += --no-print-directory --warn-undefined-variables
Compatibility Note
This approach works with GNU make (the standard on Linux systems) and is the recommended way to set persistent make behavior. On BSD systems, the flag behavior may differ slightly, so always test your Makefiles on your target platforms.