From 20db22f0fe25e7daaac11111aea1a14481d8ac5c Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Tue, 9 Apr 2019 19:58:48 -0500 Subject: [PATCH] Add basic `make` shim for CMake This lets non-developers simply `cd` into the fish source directory and execute `make` to build the project. The Makefile searches for CMake and hands over the build to it if it is available, otherwise an error message is emitted. All dependency checking is left to CMake. Non-fish-devs shouldn't have to concern themselves with what build system fish developers have chosen, and building a random C++ project should not be a chore in familiarizing one's self with all the various build platforms out there. CMake is instructed to use `ninja` if it is available, otherwise the standard Unix Makefiles generator option is used. (This has already been the behavior on BSDs since CMake was adopted.) --- Makefile | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..7fac7d32e --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +# This is a very basic `make` wrapper around the CMake build toolchain. +# +# Supported arguments: +# PREFIX: sets the installation prefix +# GENERATOR: explicitly specifies the CMake generator to use + +CMAKE ?= cmake + +GENERATOR ?= $(shell (which ninja > /dev/null 2> /dev/null && echo Ninja) || \ + echo 'Unix Makefiles') +prefix ?= /usr/local +PREFIX ?= $(prefix) + +ifeq ($(GENERATOR), Ninja) +BUILDFILE = build.ninja +else +BUILDFILE = Makefile +endif + +all: .begin build/fish + +PHONY: .begin +.begin: + @which ninja > /dev/null 2> /dev/null || \ + (echo 'Please install CMake and then re-run the `make` command!' 1>&2 && false) + +build/fish: build/$(BUILDFILE) + cmake --build build + +build/$(BUILDFILE): build + cd build; cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -G "$(GENERATOR)" -DCMAKE_INSTALL_PREFIX="$(PREFIX)" -DCMAKE_EXPORT_COMPILE_COMMANDS=1 + +build: + mkdir -p build + +.PHONY: clean +clean: + rm -rf build + +.PHONY: test +test: build/fish + $(CMAKE) --build build --target test + +.PHONY: install +install: build/fish + $(CMAKE) --build build --target install + +.PHONY: run +run: build/fish + ./build/fish || true + +.PHONY: exec +exec: build/fish + exec ./build/fish