Skip to content
Snippets Groups Projects
Makefile 4.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • Yusuke Sakai's avatar
    Yusuke Sakai committed
    .PHONY: env mamba mamba-check tests build install docs motd
    
    export PROJECT_NAME = $(shell awk -F' = ' '/^name = / {print $$2}' pyproject.toml | tr -d '"')
    export PROJECT_VERSION = $(shell awk -F' = ' '/^version = / {print $$2}' pyproject.toml | tr -d '"')
    export PROJECT_DESCRIPTION = $(shell awk -F' = ' '/^description = / {print $$2}' pyproject.toml | tr -d '"')
    
    export ENVNAME ?= $(shell echo $(PROJECT_NAME) | tr ' ' '-' | tr '[:upper:]' '[:lower:]')
    export ENVFILE ?= environment.yml
    export ENVACTIVATE = . $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate $(ENVNAME)
    
    export MODULE     ?= $(shell echo $(PROJECT_NAME) | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | tr '-' '_')
    export MODULEPATH ?= ./src
    
    export LINT      ?= $(MODULEPATH) tests
    export PYTHONPYCACHEPREFIX ?= var/cache
    
    export MOTD_FILE ?= share/motd
    usage: motd
    	@echo "[Usage] make [all|...|env|build|tests|install|docs|pages|lint|format|clean]"
    
    motd:
    ifneq ($(MOTD),0)
    	@if [[ -s "$(MOTD_FILE)" && ! -z "$$(which envsubst)" ]]; then echo "$$(env | envsubst < $(MOTD_FILE))"; fi
    endif
    
    all: motd env tests docs build install
    
    # Create a Conda environment from environment.yml
    env: motd
    	@$(MAKE) .virtualenv
    
    .virtualenv: $(ENVFILE)
    	@$(MAKE) mamba-check 
    	@if mamba env list | grep -q $(ENVNAME); then \
    		echo "Updating existing environment \`$(ENVNAME)\`"; \
    		mamba env update -n $(ENVNAME) -f $(ENVFILE); \
    	else \
    		echo "Creating new environment \`$(ENVNAME)\`"; \
    		mamba env create -n $(ENVNAME) -f $(ENVFILE); \
    	fi
    
    	@ENVPATH=$$(conda info --envs | grep -E "^$(ENVNAME)" | awk '{print $$NF}'); \
    	ln -sf $$ENVPATH/lib/libgsl.dylib $$ENVPATH/lib/libgsl.25.dylib
    
    	@touch .virtualenv
    
    # Install Mamba using Conda
    mamba: motd
    	@echo "Installing Mamba..."
    	@. $$HOME/.bashrc && conda install mamba -n base -c conda-forge --yes
    	@echo "Mamba installation complete."
    
    mamba-check:
    	@command -v mamba >/dev/null 2>&1 || { echo "Error: mamba is not installed. Please install mamba to use this command."; exit 1; }
    
    # Run tests
    tests: motd
    	@MOTD=0 $(MAKE) -s env
    	@$(ENVACTIVATE); python -m unittest discover
    
    # Build the project documentation
    pages: docs
    	@cd var/build/public/docs; ln -sf $$(git describe --tags 2> /dev/null || git rev-parse --short HEAD) latest
    	@cp var/build/index.html var/build/public/docs/
    	@find var/build/public/docs -mindepth 1 -maxdepth 1 -type d | rev | cut -d'/' -f 1 | rev | sort > var/build/public/docs/metadata.txt
    	@rsync -a --delete ./var/build/public/ var/www 2> /dev/null || true
    	@if [ -f "public/latest/index.html" ]; then open public/latest/index.html; fi
    
    docs: motd
    	@MOTD=0 $(MAKE) -s env
    	@mkdir -p var/build/public/docs var/www/docs && ln -sf var/www/docs ./public
    	@$(ENVACTIVATE); cd var/build; if [ ! -f "Makefile" ]; then cmake ../../share/doxygen; fi
    	@$(ENVACTIVATE); doxygen -u var/build/Doxyfile && doxygen var/build/Doxyfile;
    
    # Python related commands
    build: motd
    	@MOTD=0 $(MAKE) -s env
    	@mkdir -p var/cache/modules && ln -sf ./var/cache/modules/ ./lib
    	@$(ENVACTIVATE); SITEPACKAGE="var/cache/modules/python-$$(python --version | awk '{print $$2}' | cut -d '.' -f 1,2)/site-packages"; \
    	python -m build --outdir ./$$SITEPACKAGE ; \
    	[ $$? -eq 0 ] && echo "Distributed package is now available in \`./$$SITEPACKAGE\`" || exit1
    install: motd
    	@MOTD=0 $(MAKE) -s env
    	@$(ENVACTIVATE); SITEPACKAGE="lib/python-$$(python --version | awk '{print $$2}' | cut -d '.' -f 1,2)/site-packages";\
    	pip install $$SITEPACKAGE/$(MODULE)-$(PROJECT_VERSION).tar.gz; \
    	echo "Enable this environment using \`conda activate $(ENVNAME)\`"
    lint: motd
    	@MOTD=0 $(MAKE) -s env
    	@$(ENVACTIVATE); flake8 $(LINT)
    format: motd 
    	@MOTD=0 $(MAKE) -s env
    	@$(ENVACTIVATE); read -p "Make sure to commit your code first; Do you want to modify your code using black? (yes/no): " response; \
    	if [ "$$response" = "yes" ]; then \
    		black $(LINT)
    	else \
    		echo "Exiting..."; \
    		exit 1; \
    	fi
    
    # Docker commands
    image:
    	@docker build -t $(ENVNAME) .
    	@docker run -it --rm $(ENVNAME) /bin/bash
    
    container:
    	@CONTAINER_NAME=$$(basename $(PWD)-client) \
             docker compose up client -d
    	@CONTAINER_ID=$$(docker ps -aqf name=^$$(basename ${PWD})-client$$) && \
             if [ -n "$$CONTAINER_ID" ]; then docker exec -it $$CONTAINER_ID /bin/bash; else echo "No container found"; fi
    	@CONTAINER_NAME=$$(basename $(PWD)-client) \
             docker compose down client
    
    # Clean up build artifacts
    clean: motd
    	@echo "Cleaning temporary files"
    	@$(RM) -rf var/cache/* var/log/* var/build var/www var/cache/*
    	@$(RM) -rf lib public
    
    distclean: clean
    	@echo "Removing environment \`$(ENVNAME)\`"
    	@$(RM) -rf .virtualenv
    	@mamba env remove -n $(ENVNAME)