build(Makefile): rework Makefile call structure

This commit is contained in:
Sarah Vaupel 2024-11-04 14:46:40 +01:00
parent e38adb42b3
commit 6239978a6a
7 changed files with 173 additions and 373 deletions

546
Makefile
View File

@ -1,57 +1,43 @@
include .gnumake/*.Mak
SHELL=bash
# MAKE=make -d
export SHELL=bash
export CONTAINER_COMMAND ?= podman
export CONTAINER_BGRUN ?= $(CONTAINER_COMMAND) run -dit --network=host --replace
export CONTAINER_FGRUN ?= $(CONTAINER_COMMAND) run -it --network=host --replace
#export CONTAINER_NAME ?= $(FRADRIVE_SERVICE)
export ENTRYPOINT
export IN_CONTAINER ?= false
export IN_CI ?= false
export SINGLETON
export WATCH
export UNIWORXDB_OPTS ?= -cf
export CONTAINER_ID
export FRADRIVE_SERVICE
export SERVICE_VARIANT
export DEV_PORT_HTTP
export DEV_PORT_HTTPS
export HOOGLE_PORT
export IMAGE_REGISTRY = docker.io
export MEMCACHED_IMAGE = $(IMAGE_REGISTRY)/memcached:latest
export MINIO_IMAGE = $(IMAGE_REGISTRY)/minio/minio:latest
export MAILDEV_IMAGE = $(IMAGE_REGISTRY)/maildev/maildev:latest # TODO: needs different port than 1025 to avoid conflicts
export DEVELOP
export IN_CONTAINER ?= false
export IN_CI ?= false
export CONTAINER_FILE
export CONTAINER_FILE_CONTENT
export CF_PREFIX
export DEVELOP
export MOUNT_DIR=/mnt/fradrive
export LOGSIZE ?= 1024
export SERVICE
export SERVICE_VARIANT ?= $(SERVICE)
export SERVICE_PARALLEL ?= false
export JOB
export JOB_ID
export CONTAINER_CMD
export BASE_PORTS
export UNIWORXDB_OPTS ?= -cf
export PROD ?= false
ifneq ($(PROD),true)
export --DEVELOPMENT=--flag uniworx:dev
endif
# HELP HEADER START
# To see the definition of all available targets, take a look into the Makefile.
# Targets starting with '--' are not meant to be directly called.
# If you want to do so anyway please use 'make -- --target' to avoid '--target' being treated as option to 'make'.
#
#
# Targets meant to be used by humans are:
# HELP HEADER END
export DATE := $(shell date +'%Y-%m-%dT%H-%M-%S')
export CURR_DEV = $(shell cat develop/.current)
export SET_DEVELOP = $(eval DEVELOP=develop/$$(CURR_DEV))
export NEW_DEVELOP = $(eval DEVELOP=develop/$$(DATE))
###########################
##### GENERAL TARGETS #####
.PHONY: help
# HELP: print out this help message
@ -65,7 +51,7 @@ help:
.PHONY: clean
# HELP: stop all running containers and remove all compilation results in the directory (but leave images including dependencies unharmed)
clean:
$(MAKE) stop
rm -rf develop
-rm -rf node_modules .npm .cache assets/icons assets/favicons static well-known config/manifest.json
-rm -rf .stack-work .stack-work-run .stack-work-test .stack-work-doc .stack-work.lock
-rm -rf bin .Dockerfile develop
@ -86,145 +72,151 @@ release:
VERSION=`.gitlab-ci/version.pl`
git tag $${VERSION}
git commit -m "chore(release): $${VERSION}"
git push
.PHONY: %-shell
# HELP: launch shell (bash) inside a currently running container
%-shell: --%_shell;
--shell:
$(CONTAINER_COMMAND) exec -it $(EXEC_OPTS) fradrive.$(CURR_DEV).$* $(if $(ENTRYPOINT),$(ENTRYPOINT),/bin/bash)
compile-%: --%_containerized_--compile;
##### GENERAL TARGETS #####
###########################
##############################################
##### SERVICE DEPENDENCIES AND VARIABLES #####
--frontend_%: FRADRIVE_SERVICE=frontend
--frontend_%: SERVICE_VARIANT=frontend
--frontend_%: SINGLETON = false
--frontend_%: WATCH = false
--frontend_%:
# TODO --containerized-% is not yet working; comment this in again as soon as it does
# $(MAKE) -- --containerized-static --containerized-well-known
$(MAKE) -- --$*
--backend_%: FRADRIVE_SERVICE=backend
--backend_%: SERVICE_VARIANT=backend
--backend_%: BASE_PORTS = "DEV_PORT_HTTP=3000" "DEV_PORT_HTTPS=3443"
--backend_%: SINGLETON = false
--backend_%:
$(MAKE) -- --frontend_containerized_--compile
$(MAKE) -- --$*
--hoogle_%: FRADRIVE_SERVICE=backend
--hoogle_%: SERVICE_VARIANT=hoogle
--hoogle_%: BASE_PORTS = "HOOGLE_PORT=8081"
--hoogle_%: SINGLETON = true
--hoogle_%:
$(MAKE) -- --$*
# --uniworxdb was --db in old versions
--uniworxdb_%: FRADRIVE_SERVICE=backend
--uniworxdb_%: SERVICE_VARIANT=uniworxdb
--uniworxdb_%:
$(MAKE) -- --$*
--minio_%: FRADRIVE_SERVICE=minio
--minio_%: SERVICE_VARIANT=minio
--minio_%:
$(MAKE) -- --$*
--memcached_%: FRADRIVE_SERVICE=memcached
--memcached_%: SERVICE_VARIANT=memcached
--memcached_%:
$(MAKE) -- --$*
# --postgres was --database in old versions
--postgres_%: BASE_PORTS = "PGPORT=5432"
--postgres_%: SINGLETON = true
--postgres_%:
$(MAKE) -- --$*
##### SERVICE DEPENDENCIES AND VARIABLES #####
##############################################
############################################
##### UNIFIED FRONTEND/BACKEND TARGETS #####
.PHONY: start
# HELP: start database services, frontend and backend
start: start-database start-memcached start-minio start-frontend start-backend;
# git push
.PHONY: compile
# HELP: compile frontend and backend
compile:
$(MAKE) compile-frontend
$(MAKE) compile-backend
--compile_%: --checkvarsset --develop --%
.PHONY: start
start: start-postgres start-memcached start-minio start-frontend start-backend;
.PHONY: lint
# HELP: lint frontend and backend
lint: lint-frontend lint-backend;
.PHONY: %-backend
%-backend: SERVICE=backend
%-backend: SERVICE_VARIANT=backend
%-backend: SERVICE_PARALLEL=true
%-backend: CONTAINER_CMD=localhost/fradrive/backend
%-backend: BASE_PORTS = "DEV_PORT_HTTP=3000" "DEV_PORT_HTTPS=3443"
.PHONY: test
# HELP: test frontend, backend, and check internationalization
test: start-database test-frontend test-backend i18n-check;
.PHONY: %-uniworxdb
%-uniworxdb: SERVICE=backend
%-uniworxdb: SERVICE_VARIANT=uniworxdb
%-uniworxdb: CONTAINER_CMD=localhost/fradrive/backend
##### UNIFIED FRONTEND/BACKEND TARGETS #####
############################################
.PHONY: %-hoogle
%-hoogle: SERVICE=backend
%-hoogle: SERVICE_VARIANT=hoogle
%-hoogle: BASE_PORTS = "HOOGLE_PORT=8081"
%-hoogle: CONTAINER_CMD=localhost/fradrive/backend
--start-hoogle:
HOOGLE_PORT=`cat $(CONTAINER_FILE) | grep 'HOOGLE_PORT=' | sed 's/HOOGLE_PORT=//'` ; \
stack --work-dir=.stack-work-doc hoogle -- server --local --port $${HOOGLE_PORT}
--checkvarsset:
echo "FS:$(FRADRIVE_SERVICE) SV:$(SERVICE_VARIANT) DE:$(DEVELOP) CF:$(CONTAINER_FILE)"
@:
ifeq "$(FRADRIVE_SERVICE)" ""
>&2 echo "Variable FRADRIVE_SERVICE is not set; this hints to an internal error in the Makefile unless you have manually requested a '--'-target"
exit 1
.PHONY: %-frontend
%-frontend: SERVICE=frontend
%-frontend: CONTAINER_CMD=localhost/fradrive/frontend
.PHONY: %-postgres
%-postgres: SERVICE=postgres
%-postgres: BASE_PORTS = "PGPORT=5432"
%-postgres: CONTAINER_CMD=localhost/fradrive/postgres
.PHONY: %-memcached
%-memcached: SERVICE=memcached
%-memcached: CONTAINER_CMD=$(MEMCACHED_IMAGE) --port=`cat $(CONTAINER_FILE) | grep 'MEMCACHED_PORT=' | sed 's/MEMCACHED_PORT=//'`
%-memcached: BASE_PORTS = "MEMCACHED_PORT=11211"
.PHONY: %-minio
%-minio: SERVICE=minio
%-minio: CONTAINER_CMD=$(MINIO_IMAGE) -- server `mktemp` --address=:`cat $(CONTAINER_FILE) | grep 'UPLOAD_S3_PORT=' | sed 's/UPLOAD_S3_PORT=//'`:
%-minio: BASE_PORTS = "UPLOAD_S3_PORT=9000"
.PHONY: start-%
start-%: JOB=start
start-%: CF_PREFIX = "start-"
start-%: --act ;
.PHONY: compile-%
compile-%: JOB=compile
compile-%: CF_PREFIX = "compile-"
compile-%: --act ;
.PHONY: test-%
test-%: JOB=test
test-%: CF_PREFIX = "test-"
test-%: --act ;
.PHONY: lint-%
lint-%: JOB=lint
lint-%: CF_PREFIX = "lint-"
lint-%: --act ;
--act: --develop_containerized;
--develop_%: PORTS = $(foreach PORT,$(BASE_PORTS),$(shell utils/next_free_port.pl $(PORT)))
--develop_%: --ensure-develop
echo "$(SERVICE_PARALLEL)" ; \
if [[ "$(SERVICE_PARALLEL)" == "false" ]] ; then \
CONTAINER_FILE=$(DEVELOP)/$(CF_PREFIX)$(SERVICE_VARIANT) ; \
JOB_ID=$(JOB) ; \
if [[ -e $${CONTAINER_FILE} ]]; then \
>&2 echo "Another $* service is already running! Use \"make new-develop\" to start a new develop instance despite currently running services." ; \
exit 1 ; \
fi ; \
else \
DEVDIR=$(DEVELOP)/$(SERVICE_VARIANT) ; \
I=`ls $(DEVELOP) | grep '$(SERVICE_VARIANT)' | sed 's/$(SERVICE_VARIANT)-//' | sort -n | tail -n1` ; \
echo "$${I}" ; \
J=$$(($${I}+1)) ; \
CONTAINER_FILE=$${DEVDIR}-$${J} ; \
JOB_ID=$(JOB)-$${J} ; \
fi ; \
echo "$(PORTS)" | sed 's/ /\n/g' > $${CONTAINER_FILE} ; \
$(MAKE) -- --$* CONTAINER_FILE=$${CONTAINER_FILE} JOB_ID=$${JOB_ID}
.PHONY: image-rebuild_%
# HELP(image-rebuild_{backend,frontend,database,memcached,minio}): force-rebuild the stated docker image
image-rebuild_%:
$(MAKE) -- --image-build SERVICE=$* NO_CACHE=--no-cache
--image-build:
ifeq "$(CONTAINER_CMD)" "localhost/fradrive/$(SERVICE)"
rm -f .Dockerfile
ln -s docker/$(SERVICE)/Dockerfile .Dockerfile
MOUNT_DIR=/mnt/fradrive; \
PROJECT_DIR=/mnt/fradrive; \
if [ "$(IN_CI)" == "true" ] ; then \
PROJECT_DIR=/fradrive; \
fi; \
if [ "$(IN_CONTAINER)" == "false" ] ; then \
$(CONTAINER_COMMAND) build $(NO_CACHE) -v $(PWD):$${MOUNT_DIR} --env IN_CONTAINER=true --build-arg MOUNT_DIR=$(MOUNT_DIR) --build-arg PROJECT_DIR=$${PROJECT_DIR} --tag fradrive/$(SERVICE) --file $(PWD)/.Dockerfile ; \
fi
else
:
endif
ifeq "$(SERVICE_VARIANT)" ""
>&2 echo "Variable SERVICE_VARIANT is not set; this hints to an internal error in the Makefile unless you have manually requested a '--'-target"
exit 1
endif
#ifeq "$(DEVELOP)" ""
# >&2 echo "Variable DEVELOP is not set; this hints to an internal error in the Makefile unless you have manually requested a '--'-target"
# exit 1
#endif
#ifeq "$(CONTAINER_FILE)" ""
# >&2 echo "Variable CONTAINER_FILE is not set; this hints to an internal error in the Makefile unless you have manually requested a '--'-target"
# exit 1
#endif
--containerized: --image-build
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" & \
CONTAINER_NAME=fradrive.$(CURR_DEV).$(SERVICE_VARIANT).$(JOB_ID) ; \
CONTAINER_ID=`$(CONTAINER_BGRUN) \
-v $(PWD):$(MOUNT_DIR) \
--env IN_CONTAINER=true \
--env FRADRIVE_MAKE_TARGET="--$(JOB)-$(SERVICE_VARIANT)" \
--env CONTAINER_FILE=$(CONTAINER_FILE) \
--env CONTAINER_NAME=$${CONTAINER_NAME} \
--name $${CONTAINER_NAME} \
$(CONTAINER_CMD) \
` ; \
printf "CONTAINER_ID=$${CONTAINER_ID}" >> "$(CONTAINER_FILE)"
############################
##### FRONTEND TARGETS #####
# HELP(start-backend): start yesod-devel instance
--start-backend:
DEV_PORT_HTTP=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTP=' | sed 's/DEV_PORT_HTTP=//'`; \
DEV_PORT_HTTPS=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTPS=' | sed 's/DEV_PORT_HTTPS=//'`; \
stack --work-dir=.stack-work-run $(--DEVELOPMENT) exec -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
# HELP(compile-backend): compile backend binaries
--compile-backend:
stack build --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin
# HELP(lint-backend): lint backend
--lint-backend:
stack build --test --fast --work-dir=.stack-work-test --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
# HELP(test-backend): test backend
--test-backend:
stack build --test --coverage --fast --work-dir=.stack-work-test --flag uniworx:library-only $(--DEVELOPMENT)
#--frontend-%: --image-build --containerized---%-frontend;
#--%-frontend: --containerized-static-frontend --containerized-well-known-frontend
#--frontend-start: static
# npm run start
ifeq ($(SERVICE_VARIANT), frontend)
--start: --checkvarsset
npm run start
# HELP(compile-frontend): compile frontend
--compile: static well-known --checkvarsset;
# HELP(lint-frontend): lint frontend
--lint: eslint.config.js --checkvarsset
npx -- eslint frontend/src $(FIX)
@echo Hooray! There are no hints.
# HELP(test-frontend): test frontend
--test: karma.conf.cjs --checkvarsset
@echo Karma frontend tests are currently broken after npm update and have therefor been temporarily disabled.
# npx -- karma start --conf karma.conf.cjs $(WATCH)
endif
# HELP(compile-frontend): compile frontend assets
--compile-frontend: node_modules assets esbuild.config.mjs
npm run build
node_modules: package.json package-lock.json
npm ci --cache .npm --prefer-offline
@ -243,192 +235,40 @@ static: node_modules assets esbuild.config.mjs
npm run build
well-known: static;
##### FRONTEND TARGETS #####
############################
###########################
##### BACKEND TARGETS #####
ifeq ($(SERVICE_VARIANT), backend)
--start: --checkvarsset
DEV_PORT_HTTP=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTP=' | sed 's/DEV_PORT_HTTP=//'`; \
DEV_PORT_HTTPS=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTPS=' | sed 's/DEV_PORT_HTTPS=//'`; \
stack --work-dir=.stack-work-run $(--DEVELOPMENT) exec -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
endif
ifeq ($(SERVICE_VARIANT), hoogle)
--start:
HOOGLE_PORT=`cat $(CONTAINER_FILE) | grep 'HOOGLE_PORT=' | sed 's/HOOGLE_PORT=//'` ; \
echo "${HOOGLE_PORT}" ; \
stack --work-dir=.stack-work-doc hoogle -- server --local --port $${HOOGLE_PORT}
endif
# HELP(compile-backend): compile backend
ifeq ($(SERVICE_VARIANT), backend)
--compile: --checkvarsset
stack build --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin
# HELP(lint-backend): lint backend
--lint: --checkvarsset
stack build --test --fast --work-dir=.stack-work-test --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
# HELP(test-backend): test backend
--test: --checkvarsset
stack build --test --coverage --fast --work-dir=.stack-work-test --flag uniworx:library-only $(--DEVELOPMENT)
endif
# HELP(uniworxdb): clear and fill database. requires running postgres
uniworxdb: --frontend_compile --backend_imagebuild_containerized_--uniworxdb_start;
# TODO (db-m-$MIGRATION-backend): apply migration (see src/Model/Migration/Definition.hs for list of available migrations)
ifeq ($(SERVICE_VARIANT), uniworxdb)
--start: .stack
--start-uniworxdb:
SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true} ; \
AVSPASS=${AVSPASS:-nopasswordset} ; \
stack $(--DEVELOPMENT) exec uniworxdb -- $(UNIWORXDB_OPTS)
endif
.PHONY: .stack
.stack:
if [ "$(IN_CONTAINER)" == "true" ] ; then \
$(MAKE) -- --.stack ; \
else \
$(MAKE) -- --imagerun_--.stack ; \
fi
--.stack: stack.yaml stack.yaml.lock package.yaml
stack build --fast --only-dependencies
# HELP(start-minio): start minio service
##### BACKEND TARGETS #####
###########################
.PHONY: status
# HELP: print develop status: running containers, used ports
status:
@./utils/develop-status.pl
# TODO: rework logs
.PHONY: log-%
# HELP(log-{database,memcached,minio,backend,frontend,hoogle}): inspect output of a given (currently running) service. When a service supports multiple running instances in one develop (i.e. backend), you need to specify the exact instance by its associated file (e.g. backend-1, backend-2, etc.), please check the contents of the develop/ directory for a list of running instances.
log-%:
$(CONTAINER_COMMAND) logs --follow `cat $(DEVELOP)/$* | grep CONTAINER_ID= | sed 's/^CONTAINER_ID=//'`
############################
##### DATABASE TARGETS #####
ifeq ($(SERVICE_VARIANT), postgres)
--containerized_%: --checkvarsset docker/database/initdb.sh docker/database/pg_hba.conf docker/database/postgresql.conf docker/database/schema.sql --image-build
$(MAKE) -- --imagerun_$*
else
--containerized_%: --checkvarsset
$(MAKE) -- --imagerun_$*
endif
# TODO: rework shells
.PHONY: %-shell
# HELP: launch shell (bash) inside a currently running container
%-shell: --%_shell;
--shell:
$(CONTAINER_COMMAND) exec -it $(EXEC_OPTS) fradrive.$(CURR_DEV).$* $(if $(ENTRYPOINT),$(ENTRYPOINT),/bin/bash)
.PHONY: psql
# HELP: enter psql (postgresql) cli inside a currently running database container
psql: ENTRYPOINT=/usr/bin/psql -d uniworx
psql: EXEC_OPTS=--user postgres
psql: --database-shell;
##### DATABASE TARGETS #####
############################
#############################
##### CONTAINER TARGETS #####
#--containerized-%-frontend: FRADRIVE_SERVICE=frontend
#--containerized-%-frontend: SERVICE_VARIANT=frontend
#--containerized-%-frontend: --image-build
# $(MAKE) -- --image-run-$*-frontend
#
#--containerized-%-backend: FRADRIVE_SERVICE=backend
#--containerized-%-backend: SERVICE_VARIANT?=backend
#--containerized-%-backend: --image-build
# $(MAKE) -- --image-run-$*-backend
#--containerized-%-hoogle: FRADRIVE_SERVICE=backend
#--containerized-%-hoogle: SERVICE_VARIANT=hoogle
#--containerized-%-hoogle: --image-build
# $(MAKE) -- --image-run-$*-hoogle-backend
# --containerized-%-minio: FRADRIVE_SERVICE=minio
# --containerized-%-minio: --image-build
# $(MAKE) -- --image-run-$*-minio
ifeq ($(SERVICE_VARIANT), minio)
--containerized_start:
UPLOAD_S3_PORT=`cat $(CONTAINER_FILE) | grep 'UPLOAD_S3_PORT=' | sed 's/UPLOAD_S3_PORT=//'`; \
MINIO_DIR=`mktemp` ; \
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" "" "rm -rf $${MINIO_DIR}" & \
CONTAINER_ID=`$(CONTAINER_BGRUN) --name fradrive.$(CURR_DEV).minio $(MINIO_IMAGE) -- server $${MINIO_DIR} --address=:$${UPLOAD_S3_PORT}` ; \
printf "CONTAINER_ID=$${CONTAINER_ID}\nUPLOAD_S3_PORT=$${UPLOAD_S3_PORT}\nMINIO_DIR=$${MINIO_DIR}" >> $(CONTAINER_FILE)
endif
# --containerized-%-memcached: FRADRIVE_SERVICE=memcached
# --containerized-%-memcached: --image-build
# $(MAKE) -- --image-run-$*-memcached
ifeq ($(SERVICE_VARIANT), memcached)
--containerized_start:
MEMCACHED_PORT=`cat $(CONTAINER_FILE) | grep 'MEMCACHED_PORT=' | sed 's/MEMCACHED_PORT=//'`; \
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" & \
CONTAINER_ID=`$(CONTAINER_BGRUN) --name fradrive.$(CURR_DEV).memcached $(MEMCACHED_IMAGE) --port=$${MEMCACHED_PORT}` ; \
printf "CONTAINER_ID=$${CONTAINER_ID}\nMEMCACHED_PORT=$${MEMCACHED_PORT}" >> $(CONTAINER_FILE)
endif
.PHONY: image-rebuild
# HELP(image-rebuild-{backend,frontend,database,memcached,minio}): force-rebuild the stated docker image
image-rebuild_%:
$(MAKE) -- --image-build FRADRIVE_SERVICE=$* NO_CACHE=--no-cache
--image-build:
rm -f .Dockerfile
ln -s docker/$(FRADRIVE_SERVICE)/Dockerfile .Dockerfile
MOUNT_DIR=/mnt/fradrive; \
PROJECT_DIR=/mnt/fradrive; \
if [ "$(IN_CI)" == "true" ] ; then \
PROJECT_DIR=/fradrive; \
fi; \
if [ "$(IN_CONTAINER)" == "false" ] ; then \
$(CONTAINER_COMMAND) build $(NO_CACHE) -v $(PWD):$${MOUNT_DIR} --env IN_CONTAINER=true --build-arg MOUNT_DIR=$${MOUNT_DIR} --build-arg PROJECT_DIR=$${PROJECT_DIR} --tag fradrive/$(FRADRIVE_SERVICE) --file $(PWD)/.Dockerfile ; \
fi
# runs --% in the container. Targets meant to be called manually cannot be run in the container via this target. If that is ever needed split this target into two targets, one for manually one for automatic (one may use the other) so that not at every usage a '---' has to be after containerized
--imagerun_%: --checkvarsset docker/$(FRADRIVE_SERVICE)/Dockerfile
MOUNT_DIR=/mnt/fradrive; \
if [ "$(IN_CONTAINER)" == "true" ] ; then \
$(MAKE) -- $* ; \
else \
if [ -z "$(CONTAINER_FILE)" ] ; then \
$(CONTAINER_FGRUN) -v $(PWD):$${MOUNT_DIR} --env FRADRIVE_SERVICE=$(FRADRIVE_SERVICE) --env SERVICE_VARIANT=$(SERVICE_VARIANT) --env IN_CONTAINER=true --env FRADRIVE_MAKE_TARGET=$* --env CONTAINER_FILE=$(CONTAINER_FILE) --env CONTAINER_FILE_CONTENT=$(CONTAINER_FILE_CONTENT) --env WATCH=$(WATCH) --name fradrive.$(CURR_DEV).$(SERVICE_VARIANT) localhost/fradrive/$(FRADRIVE_SERVICE) ; \
else \
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" & \
CONTAINER_ID=`$(CONTAINER_BGRUN) -v $(PWD):$${MOUNT_DIR} --env FRADRIVE_SERVICE=$(FRADRIVE_SERVICE) --env SERVICE_VARIANT=$(SERVICE_VARIANT) --env IN_CONTAINER=true --env FRADRIVE_MAKE_TARGET=$* --env CONTAINER_FILE=$(CONTAINER_FILE) --env CONTAINER_FILE_CONTENT=$(CONTAINER_FILE_CONTENT) --env WATCH=$(WATCH) --name fradrive.$(CURR_DEV).$(SERVICE_VARIANT) localhost/fradrive/$(FRADRIVE_SERVICE)` ; \
echo "CONTAINER_ID=$${CONTAINER_ID}" >> "$(CONTAINER_FILE)"; \
fi \
fi
# HELP(start-database): start postgres server
# HELP(start-memcached): start memcached server
# HELP(start-minio): start minio server
# HELP(start-backend): serve yesod development site
# HELP(start-frontend): start frontend watcher. Watches frontend source files for changes and recompiles on change. (TODO: watcher functionality currently broken!)
# HELP(start-hoogle): serve local hoogle instance
# TODO reformulate target to use the '--%_'-mechanism
# --autostart: use the SERVICE_VARIANT for the decision which service to start
--autostart: --checkvarsset
$(MAKE) -- start-$(SERVICE_VARIANT)
start-%: FRADRIVE_SERVICE = %
start-%: SERVICE_VARIANT = %
start-%: PORTS = $(foreach PORT,$(BASE_PORTS),$(shell utils/next_free_port.pl $(PORT)))
start-%: --develop
echo "$*"
echo "$(DATE)"
echo "DEV $(DEVELOP)"
if [[ "$(SINGLETON)" = "true" ]]; then \
CONTAINER_FILE=$(DEVELOP)/$* ; \
if [[ -e $${CONTAINER_FILE} ]]; then \
>&2 echo "Another $* service is already running! Use \"make new-develop\" or \"make start\" to start a new develop instance despite currently running services." ; \
exit 1 ; \
fi \
else \
DEVDIR=$(DEVELOP)/$*; \
I=`ls $${DEVDIR} | sort -n | tail -n1`; \
echo "$${I}"; \
CONTAINER_FILE=$${DEVDIR}-$$(($${I}+1)); \
fi ; \
echo "$(PORTS)" | sed 's/ /\n/g' > $${CONTAINER_FILE} ; \
$(MAKE) -- --containerized_--autostart CONTAINER_FILE=$${CONTAINER_FILE}
# TODO: rework stops
.PHONY: stop
# HELP: stop all currently running develop instances
stop:
@ -445,28 +285,6 @@ stop-container-by-id:
# CONTAINER_ID=`grep 'CONTAINER_ID=' $(CONTAINER_FILE) | sed 's/CONTAINER_ID=//'` ; \
# $(MAKE) stop-container-by-id CONTAINER_ID=$${CONTAINER_ID}
.PHONY: status
# HELP: print develop status: running containers, used ports
status:
@./utils/develop-status.pl
.PHONY: log-%
# HELP(log-{database,memcached,minio,backend,frontend,hoogle}): inspect output of a given (currently running) service. When a service supports multiple running instances in one develop (i.e. backend), you need to specify the exact instance by its associated file (e.g. backend-1, backend-2, etc.), please check the contents of the develop/ directory for a list of running instances.
log-%: --develop
$(CONTAINER_COMMAND) logs --follow --tail=$(LOGSIZE) `cat $(DEVELOP)/$* | grep CONTAINER_ID= | sed 's/^CONTAINER_ID=//'`
##### CONTAINER TARGETS #####
#############################
# TODO: move targets below to better location
DATE := $(shell date +'%Y-%m-%dT%H-%M-%S')
CURR_DEV = $(shell ls -1 develop | tail -n1)
SET_DEVELOP = $(eval DEVELOP=develop/$$(CURR_DEV))
NEW_DEVELOP = $(eval DEVELOP=develop/$$(DATE))
.PHONY: new-develop
# HELP: instantiate new development bundle, i.e. create new directory under develop/
new-develop:
@ -481,33 +299,15 @@ switch-develop:
exit 1 ; \
fi ; \
echo "$(DEVELOP)" > develop/.current
.PHONY: --develop
--develop:
--ensure-develop:
if ! [[ -e develop ]]; then \
$(MAKE) new-develop; \
fi
$(SET_DEVELOP)
$(MAKE) develop/.current
$(SET_DEVELOP)
.PHONY: develop/.current
develop/.current:
$(SET_DEVELOP)
echo "$(DEVELOP)" > develop/.current
# Some convenience aliases:
.PHONY: hoogle
# HELP: alias for start-hoogle
hoogle: start-hoogle;
.PHONY: i18n-check
# HELP: check internationalization
i18n-check: --imagerun_--i18n-check
--i18n-check:
./missing-translations.sh
@echo No missing translations.
%.lock:
[ -e $@ ] || touch $@
flock -en $@ true
ls -1 develop | tail -n1 > develop/.current
.PHONY: --%
.SUFFIXES: # Delete all default suffixes