Commake (Common Makefile) is a standardised wrapper for your projects commands. Making it easy to jump between projects and get them into a running state.
Commake is a makefile for all software projects that creates a common and simple way to run a project locally. Therefore you don’t have to remember commands or read documents/README.md every time.
Contents
- Introduction
- Specification
- Usage
- Examples
- Customising Your Commake
- Contributing
- About
- Licence
- Previous Versions
Introduction
I find occasionally I come back to projects and can no longer remember how to set them up so they run. On some projects, the commands have not been added to the README and passed between people. Other times on a personal project I forget to write them down.
Example - A node project:
If I come back to a Node project, this is my thought process:
- Does this project use yarn or npm?
- Have I got the correct version of node installed?
- Do I need to do an install?
- Do I need to set environment variables?
- How do I serve this? npm run start, npm run serve, npm run dev?
All of this can be solved by using a common makefile across all your projects. Under the new world this would become the following:
$ make init
- Get the project requirements$ make install
- Install any dependencies$ make run
- Run the project
Specification
This is a version with nothing implemented:
# Commake (v0.1.0) - https://niallbunting.com/commake/
.PHONY: all help init install build run lint test e2e plan deploy int versioncheck
.ONESHELL:
all: lint test run #help Full check
help:
@echo "-- HELP --"
@grep '#[h]elp' makefile
# Use this to check if they have the correct version
# To use update the if statement and the message.
versioncheck:
@if [ 0 -gt 0 ]; then
echo "Wrong version of: <DEP>" &&
exit 1;
fi
init: #help Run through dependencies and check
@echo Not Implemented
install: versioncheck #help Install packages
@echo Not Implemented
build: #help Bulid the project files
@echo Not Implemented
run: #help Run locally
@echo Not Implemented
lint: #help Run linting
@echo Not Implemented
test: #help Run the unit tests
@echo Not Implemented
int: #help Run the int tests
@echo Not Implemented
e2e: #help Run the e2e tests
@echo Not Implemented
plan: #help Plan to run any infra changes
@echo Not Implemented
deploy: #help Run any infra changes
@echo Not Implemented
# Custom Commands - Put your custom commands below
The idea is not that these become really fancy, often they are just one line. See the examples section.
Usage
Requirements
You will need make installed. The instructions for installing will depend on your operating system.
For example on Ubuntu: sudo apt install make
Usage
To run the help command use:
$ make help
Otherwise to run a command use make <target>
. For example:
$ make run
or
$ make # To run the all target (lint, test, run)
Examples
- Golang (v0.0.1)
- Github Pages (v0.1.0)
- Node (v0.0.1)
Customising your Commake
This section contains a brief overview of make to help you get started. More in-depth content can be found here.
Note: All makefiles are tab seperated, they won’t work with spaces.
Variables
Variables from bash are accessed via a double dollar sign.
myvar="test"
echo $$myvar
Silencing commands
By default make prints out the command it’s about to run. Sometimes you may want to silence this. This is done by adding an at symbol before the command.
Since we run everything as a single line (see more). We only need this on the first line and that’s the only line that counts.
@echo "Dont print me"
Dependencies
You might want to run other targets as prerequisites of your command. This is done by adding it after the targets colon.
You can see here that the install
target requires versioncheck
to be run beforehand.
install: versioncheck #help Install packages
@echo Not Implemented
Make arguments
To pass arguments run make in the following style:
$ make run env=prod
You can then access this like:
run: #help Run locally
@echo $(env)
python test.py $(env)
User interaction
This is useful when you want to pause and wait for the user to continue the script. Maybe waiting for them to run a command.
@echo "Press ENTER to continue (ctrl+c to cancel)"
@read line
If you want to do something more complex you can use a case statement.
read -p "Do that? [y,n]" doit
case $$doit in
y|Y) echo yes ;;
n|N) echo no ;;
*) echo dont know ;;
esac
.PHONY and .ONESHELL
Here are some default options that make our life a little easier.
- .PHONY - This means that this isn’t actually a file and is just a command. Without this it will check if a file with the name of the target exists and if it does won’t run the command.
- .ONESHELL - This is more natural for a beginners perspective. It stops each line being run as a different shell.
Contributing
The makefile and this document are a work in progress. For example not much though has been put into the windows world. I would love to hear your suggestions. Either through PRs or Bugs here.
If you want to contribute a PR, you will need create a new version in the _posts
directory of the current version.
On that new version set permalink: /commake
and update the previous version. With the following:
6 sitemap: false
7 ---
8
9 # <span style="color:red">This is a old version: [newest version](/commake)</span>
About
This was created originally by Niall Bunting.