You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
360 lines
11 KiB
Makefile
360 lines
11 KiB
Makefile
#
|
|
# Author: Hari Sekhon
|
|
# Date: 2013-02-03 10:25:36 +0000 (Sun, 03 Feb 2013)
|
|
#
|
|
# https://github.com/harisekhon/bash-tools
|
|
#
|
|
# License: see accompanying Hari Sekhon LICENSE file
|
|
#
|
|
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback
|
|
# to help improve or steer this or other code I publish
|
|
#
|
|
# https://www.linkedin.com/in/harisekhon
|
|
#
|
|
|
|
export PATH := $(PATH):/usr/local/bin
|
|
|
|
CPANM = cpanm
|
|
|
|
SUDO := sudo
|
|
SUDO_PIP := sudo -H
|
|
SUDO_PERL := sudo
|
|
|
|
ifdef PERLBREW_PERL
|
|
# can't put this here otherwise gets error - "commands commence before first target. Stop."
|
|
#@echo "Perlbrew environment detected, not calling sudo"
|
|
SUDO_PERL =
|
|
endif
|
|
|
|
# Travis has custom python install earlier in $PATH even in Perl builds so need to install PyPI modules locally to non-system python otherwise they're not found by programs.
|
|
# Perms not set correctly on custom python install in Travis perl build so workaround is done to chown to travis user in .travis.yml
|
|
# Better than modifying $PATH to put /usr/bin first which is likely to affect many other things including potentially not finding the perlbrew installation first
|
|
# Looks like Perl travis builds are now using system Python - do not use TRAVIS env
|
|
ifdef VIRTUAL_ENV
|
|
#@echo "Virtual Env / Conda detected, not calling sudo"
|
|
SUDO_PIP :=
|
|
endif
|
|
ifdef CONDA_DEFAULT_ENV
|
|
SUDO_PIP :=
|
|
endif
|
|
|
|
# must come after to reset SUDO_PERL/SUDO_PIP to blank if root
|
|
# EUID / UID not exported in Make
|
|
# USER not populated in Docker
|
|
ifeq '$(shell id -u)' '0'
|
|
#@echo "root UID detected, not calling sudo"
|
|
SUDO :=
|
|
SUDO_PERL :=
|
|
SUDO_PIP :=
|
|
endif
|
|
|
|
.PHONY: quick
|
|
quick:
|
|
QUICK=1 $(MAKE) build
|
|
|
|
#.PHONY: submodules
|
|
#submodules:
|
|
# git submodule init
|
|
# git submodule update --recursive
|
|
|
|
.PHONY: push
|
|
push:
|
|
git push
|
|
|
|
.PHONY: common
|
|
common: system-packages submodules
|
|
:
|
|
|
|
.PHONY: system-packages
|
|
system-packages:
|
|
if [ -x /sbin/apk ]; then $(MAKE) apk-packages; fi
|
|
if [ -x /usr/bin/apt-get ]; then $(MAKE) apt-packages; fi
|
|
if [ -x /usr/bin/yum ]; then $(MAKE) yum-packages; fi
|
|
if [ -x /usr/local/bin/brew -a `uname` = Darwin ]; then $(MAKE) homebrew-packages; fi
|
|
|
|
.PHONY: system-packages-perl
|
|
system-packages-perl: system-packages
|
|
if [ -x /sbin/apk ]; then $(MAKE) apk-packages-perl; fi
|
|
if [ -x /usr/bin/apt-get ]; then $(MAKE) apt-packages-perl; fi
|
|
if [ -x /usr/bin/yum ]; then $(MAKE) yum-packages-perl; fi
|
|
|
|
.PHONY: system-packages-python
|
|
system-packages-python: system-packages
|
|
if [ -x /sbin/apk ]; then $(MAKE) apk-packages-python; fi
|
|
if [ -x /usr/bin/apt-get ]; then $(MAKE) apt-packages-python; fi
|
|
if [ -x /usr/bin/yum ]; then $(MAKE) yum-packages-python; fi
|
|
|
|
.PHONY: apk-packages
|
|
apk-packages:
|
|
# not portable in Alpine sh
|
|
#for x in apk-packages{,-perl,-python}{,-dev}.txt; do \
|
|
for x in apk-packages.txt apk-packages-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
#for x in apk-packages-{optional,cpan,pip}.txt; do \
|
|
for x in apk-packages-optional.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: apk-packages-perl
|
|
apk-packages-perl:
|
|
for x in apk-packages-perl.txt apk-packages-perl-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
#for x in apk-packages-{optional,cpan,pip}.txt; do \
|
|
for x in apk-packages-cpan.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: apk-packages-python
|
|
apk-packages-python:
|
|
for x in apk-packages-python.txt apk-packages-python-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in apk-packages-pip.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apk-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: apt-packages
|
|
apt-packages:
|
|
#for x in deb-packages{,-perl,-python}{,-dev}.txt; do \
|
|
for x in deb-packages.txt deb-packages-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
#for x in deb-packages-{optional,cpan,pip}.txt; do \
|
|
for x in deb-packages-optional.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: apt-packages-perl
|
|
apt-packages-perl:
|
|
for x in deb-packages-perl.txt deb-packages-perl-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in deb-packages-cpan.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: apt-packages-python
|
|
apt-packages-python:
|
|
for x in deb-packages-python.txt deb-packages-python-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in deb-packages-pip.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 NO_UPDATE=1 bash-tools/apt-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: yum-packages
|
|
yum-packages:
|
|
bash-tools/install_epel_repo.sh
|
|
|
|
# installing packages individually to catch package install failure, otherwise yum succeeds even if it misses a package
|
|
for x in rpm-packages.txt rpm-packages-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in rpm-packages-optional.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: yum-packages-perl
|
|
yum-packages-perl:
|
|
# installing packages individually to catch package install failure, otherwise yum succeeds even if it misses a package
|
|
for x in rpm-packages-perl.txt rpm-packages-perl-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in rpm-packages-cpan.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: yum-packages-python
|
|
yum-packages-python:
|
|
# installing packages individually to catch package install failure, otherwise yum succeeds even if it misses a package
|
|
for x in rpm-packages-python.txt rpm-packages-python-dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
for x in rpm-packages-pip.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/yum-install-packages.sh "setup/$$x"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: homebrew-packages
|
|
homebrew-packages:
|
|
# Fails if any of the packages are already installed, ignore and continue - if it's a problem the latest build steps will fail with missing headers
|
|
if test -f setup/brew-packages.txt; then NO_FAIL=1 bash-tools/brew-install-packages.sh setup/brew-packages.txt; fi
|
|
|
|
.PHONY: system-packages-remove
|
|
system-packages-remove:
|
|
if [ -x /sbin/apk ]; then $(MAKE) apk-packages-remove; fi
|
|
if [ -x /usr/bin/apt-get ]; then $(MAKE) apt-packages-remove; fi
|
|
if [ -x /usr/bin/yum ]; then $(MAKE) yum-packages-remove; fi
|
|
|
|
.PHONY: apk-packages-remove
|
|
apk-packages-remove:
|
|
for x in lib pylib lib-java; do test -f "$$x" && pushd "$$X" && $(MAKE) apk-packages-remove; popd; done; :
|
|
for x in apk-packages-{,perl-,python-}dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/apk-remove-packages.sh "setup/$xx"; \
|
|
fi; \
|
|
done
|
|
$(SUDO) rm -fr /var/cache/apk/*
|
|
|
|
.PHONY: apt-packages-remove
|
|
apt-packages-remove:
|
|
for x in lib pylib lib-java; do test -f "$$x" && pushd "$$X" && $(MAKE) apt-packages-remove; popd; done; :
|
|
for x in deb-packages-{,perl-,python-}dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/apt-remove-packages.sh "setup/$xx"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: yum-packages-remove
|
|
yum-packages-remove:
|
|
for x in lib pylib lib-java; do test -f "$$x" && pushd "$$X" && $(MAKE) yum-packages-remove; popd; done; :
|
|
for x in rpm-packages-{,perl-,python-}dev.txt; do \
|
|
if [ -f "setup/$$x" ]; then \
|
|
NO_FAIL=1 bash-tools/yum-remove-packages.sh "setup/$xx"; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: cpan
|
|
cpan:
|
|
find . -name 'cpan-requirements*.txt' | xargs bash-tools/perl_cpanm_install_if_absent.sh
|
|
|
|
.PHONY: pip
|
|
pip:
|
|
find . -name 'requirements.txt' | xargs bash-tools/python_pip_install_if_absent.sh
|
|
|
|
.PHONY: sonar
|
|
sonar:
|
|
sonar-scanner
|
|
|
|
.PHONY: update
|
|
update: update2 build
|
|
:
|
|
|
|
.PHONY: update2
|
|
update2: update-no-recompile
|
|
:
|
|
|
|
.PHONY: update-no-recompile
|
|
update-no-recompile:
|
|
git pull
|
|
git submodule update --init --recursive
|
|
|
|
.PHONY: update-submodules
|
|
update-submodules:
|
|
git submodule update --init --remote
|
|
.PHONY: updatem
|
|
updatem: update-submodules
|
|
:
|
|
|
|
.PHONY: docker-run
|
|
docker-run:
|
|
docker run -ti --rm ${DOCKER_IMAGE} ${ARGS}
|
|
|
|
.PHONY: run
|
|
run: docker-run
|
|
:
|
|
|
|
.PHONY: docker-mount
|
|
docker-mount:
|
|
# --privileged=true is needed to be able to:
|
|
# mount -t tmpfs -o size=1m tmpfs /mnt/ramdisk
|
|
docker run -ti --rm --privileged=true -v $$PWD:/code ${DOCKER_IMAGE} bash -c "cd /code; exec bash"
|
|
|
|
.PHONY: docker-mount-alpine
|
|
docker-mount-alpine:
|
|
# --privileged=true is needed to be able to:
|
|
# mount -t tmpfs -o size=1m tmpfs /mnt/ramdisk
|
|
docker run -ti --rm --privileged=true -v $$PWD:/code ${DOCKER_IMAGE}:alpine bash -c "cd /code; exec bash"
|
|
|
|
.PHONY: docker-mount-debian
|
|
docker-mount-debian:
|
|
# --privileged=true is needed to be able to:
|
|
# mount -t tmpfs -o size=1m tmpfs /mnt/ramdisk
|
|
docker run -ti --rm --privileged=true -v $$PWD:/code ${DOCKER_IMAGE}:debian bash -c "cd /code; exec bash"
|
|
|
|
.PHONY: docker-mount-centos
|
|
docker-mount-centos:
|
|
# --privileged=true is needed to be able to:
|
|
# mount -t tmpfs -o size=1m tmpfs /mnt/ramdisk
|
|
docker run -ti --rm --privileged=true -v $$PWD:/code ${DOCKER_IMAGE}:centos bash -c "cd /code; exec bash"
|
|
|
|
.PHONY: docker-mount-ubuntu
|
|
docker-mount-ubuntu:
|
|
# --privileged=true is needed to be able to:
|
|
# mount -t tmpfs -o size=1m tmpfs /mnt/ramdisk
|
|
docker run -ti --rm --privileged=true -v $$PWD:/code ${DOCKER_IMAGE}:ubuntu bash -c "cd /code; exec bash"
|
|
|
|
.PHONY: mount
|
|
mount: docker-mount
|
|
:
|
|
|
|
.PHONY: mount-alpine
|
|
mount-alpine: docker-mount-alpine
|
|
:
|
|
|
|
.PHONY: mount-debian
|
|
mount-debian: docker-mount-debian
|
|
:
|
|
|
|
.PHONY: mount-centos
|
|
mount-centos: docker-mount-centos
|
|
:
|
|
|
|
.PHONY: mount-ubuntu
|
|
mount-ubuntu: docker-mount-ubuntu
|
|
:
|
|
|
|
# For quick testing only - for actual Dockerfile builds see https://hub.docker.com/u/harisekhon and Dockerfiles source repo https://github.com/harisekhon/Dockerfiles
|
|
.PHONY: docker-alpine
|
|
docker-alpine:
|
|
bash-tools/docker_mount_build_exec.sh alpine
|
|
|
|
.PHONY: docker-debian
|
|
docker-debian:
|
|
bash-tools/docker_mount_build_exec.sh debian
|
|
|
|
.PHONY: docker-centos
|
|
docker-centos:
|
|
bash-tools/docker_mount_build_exec.sh centos
|
|
|
|
.PHONY: docker-ubuntu
|
|
docker-ubuntu:
|
|
bash-tools/docker_mount_build_exec.sh ubuntu
|