Comparing Makefile and Just: Which One Should You Choose?
By khoanc, at: Dec. 14, 2024, 5:59 p.m.
Comparing Makefile and Just: Which One Should You Choose?
When it comes to automating repetitive tasks in your projects, tools like Makefile and Just often come into play. While Makefile have been a standard for decades, Just offers a modern alternative with a more user-friendly approach.
Let’s break down the key differences between the two to help you decide which tool fits your needs best.
1. Syntax: Simplicity vs. Complexity
Makefile
- Syntax is strict and requires specific rules, such as using tabs for indentation (not spaces).
- Targets and commands often feel cryptic to newcomers.
Example Makefile Task:
build:
@echo "Building the project..."
gcc -o app main.
Note: Forgetting to use a tab can break your Makefile and lead to confusing errors.
Just
- Uses a modern and straightforward syntax.
- Indentation can be done with spaces, making it easier to read and write.
Example Just Task:
build:
echo "Building the project..."
gcc -o app main.c
2. Cross-Platform Compatibility
Makefile
- Native to Unix-like systems (Linux/macOS).
- Requires additional tools (e.g., GNU Make) to run on Windows, which can complicate setup.
Just
- Cross-platform out of the box.
- Works seamlessly on Linux, macOS, and Windows without extra dependencies.
3. Variables: Ease of Use
Makefile
- Variables are defined with
=
and referenced using$(...)
.
- Limited flexibility for handling default values or complex logic.
Makefile Variable Example:
NAME = app
build:
@echo "Building $(NAME)..."
gcc -o $(NAME) main.c
Just
- Variables are defined with
:=
and referenced using{{...}}
.
- Supports more advanced use cases, including default values and interpolation.
Just Variable Example:
name := "app"
build:
echo "Building {{name}}..."
gcc -o {{name}} main.c
4. Task Dependencies
Makefile
- Allows you to define dependencies between tasks, ensuring they run in the correct order.
Makefile Dependency Example:
build: clean
@echo "Building the project..."
gcc -o app main.c
clean:
@echo "Cleaning up..."
rm -f app
Just
- Dependencies are defined by simply listing the dependent tasks.
- Just executes them in the correct order automatically.
Just Dependency Example:
build: clean
echo "Building the project..."
gcc -o app main.c
clean:
echo "Cleaning up..."
rm -f app
5. Arguments and Defaults
Makefile
- Arguments must be passed as environment variables, making the syntax less intuitive.
Makefile Argument Example:
build:
@echo "Building with mode: $(MODE)"
Run Command:
make build MODE=debug
Just
- Supports built-in arguments with default values, making it simpler and more explicit.
Just Argument Example:
build mode="release":
echo "Building with mode: {{mode}}"
Run Command:
just build mode=debug
6. Readability and Maintainability
Makefile
- Difficult to maintain for larger projects due to strict syntax rules and lack of modularity.
- Error messages can be cryptic, especially for syntax errors like missing tabs.
Just
- Cleaner and easier to maintain, even for complex projects.
- Provides helpful error messages with clear indications of what went wrong.
7. Tooling and Installation
Makefile
- Comes pre-installed on most Unix-like systems (Linux/macOS).
- Requires additional setup for Windows.
Just
- Needs to be installed, but the process is straightforward with package managers like
cargo
,brew
, orscoop
.
Installation Example:
# Install using Homebrew on macOS
brew install just
# Install using Cargo on Linux/macOS
cargo install just
Which One Should You Use?
Conclusion
Makefile may still be a good fit if you are using Unix systems. For modern development workflows, Just provides a simpler, more intuitive alternative with better cross-platform support and enhanced features.
Switching to Just is particularly beneficial for teams or projects where ease of use, readability, and maintainability are priorities - Big companies cannot do that easily, but we (startups) can adapt quickly.
Would you like assistance converting your Makefile to a justfile
or diving deeper into Just's features? Let us know!
Be aware of Just issues - https://github.com/casey/just/issues