|
| 1 | +.PHONY: ci test prerequisites |
| 2 | + |
| 3 | +# Use any most recent PHP version |
| 4 | +PHP=$(shell which php7.2 || which php7.1 || which php) |
| 5 | + |
| 6 | +# Default parallelism |
| 7 | +JOBS=$(shell nproc) |
| 8 | + |
| 9 | +# Default silencer if installed |
| 10 | +SILENT= # disabled $(shell which chronic) |
| 11 | + |
| 12 | +# PHP CS Fixer |
| 13 | +PHP_CS_FIXER=build/php-cs-fixer-v2.phar |
| 14 | +PHP_CS_FIXER_ARGS=--cache-file=build/cache/.php_cs.cache --verbose |
| 15 | + |
| 16 | +# PHPUnit |
| 17 | +PHPUNIT=vendor/bin/phpunit |
| 18 | +PHPUNIT_ARGS=--coverage-xml=coverage/coverage-xml --log-junit=coverage/phpunit.junit.xml |
| 19 | + |
| 20 | +# Phan |
| 21 | +PHAN=build/phan.phar |
| 22 | +PHAN_ARGS=-j $(JOBS) --allow-polyfill-parser |
| 23 | +PHAN_PHP_VERSION=7.1 |
| 24 | +export PHAN_DISABLE_XDEBUG_WARN=1 |
| 25 | + |
| 26 | +# PHPStan |
| 27 | +PHPSTAN=build/phpstan.phar |
| 28 | +PHPSTAN_ARGS=analyse src tests --level=2 -c .phpstan.neon |
| 29 | + |
| 30 | +# Composer |
| 31 | +COMPOSER=$(PHP) $(shell which composer) |
| 32 | + |
| 33 | +# Infection |
| 34 | +INFECTION=build/infection.phar |
| 35 | +MIN_MSI=70 |
| 36 | +MIN_COVERED_MSI=80 |
| 37 | +INFECTION_ARGS=--min-msi=$(MIN_MSI) --min-covered-msi=$(MIN_COVERED_MSI) --threads=$(JOBS) --coverage=coverage |
| 38 | + |
| 39 | +all: test |
| 40 | + |
| 41 | +############################################################## |
| 42 | +# Continuous Integration # |
| 43 | +############################################################## |
| 44 | + |
| 45 | +ci: SILENT= |
| 46 | +ci: prerequisites ci-phpunit ci-analyze |
| 47 | + $(SILENT) $(COMPOSER) validate --strict || true |
| 48 | + |
| 49 | +ci-phpunit: ci-cs |
| 50 | + $(SILENT) $(PHP) $(PHPUNIT) $(PHPUNIT_ARGS) |
| 51 | + $(SILENT) $(PHP) $(INFECTION) $(INFECTION_ARGS) --quiet |
| 52 | + |
| 53 | +ci-analyze: ci-cs |
| 54 | + $(SILENT) $(PHP) $(PHPSTAN) $(PHPSTAN_ARGS) --no-progress || true |
| 55 | + $(SILENT) $(PHP) $(PHAN) $(PHAN_ARGS) || true |
| 56 | + |
| 57 | +ci-cs: prerequisites |
| 58 | + $(SILENT) $(PHP) $(PHP_CS_FIXER) $(PHP_CS_FIXER_ARGS) --dry-run --stop-on-violation fix |
| 59 | + |
| 60 | +############################################################## |
| 61 | +# Development Workflow # |
| 62 | +############################################################## |
| 63 | + |
| 64 | +test: phpunit analyze |
| 65 | + $(SILENT) $(COMPOSER) validate --strict || true |
| 66 | + |
| 67 | +test-prerequisites: prerequisites composer.lock |
| 68 | + |
| 69 | +phpunit: cs |
| 70 | + $(SILENT) $(PHP) $(PHPUNIT) $(PHPUNIT_ARGS) --verbose |
| 71 | + $(SILENT) $(PHP) $(INFECTION) $(INFECTION_ARGS) --log-verbosity=2 --show-mutations |
| 72 | + |
| 73 | +analyze: cs |
| 74 | + $(SILENT) $(PHP) $(PHPSTAN) $(PHPSTAN_ARGS) || true |
| 75 | + $(SILENT) $(PHP) $(PHAN) $(PHAN_ARGS) --color || true |
| 76 | + |
| 77 | +cs: test-prerequisites |
| 78 | + $(SILENT) $(PHP) $(PHP_CS_FIXER) $(PHP_CS_FIXER_ARGS) --diff fix |
| 79 | + |
| 80 | +############################################################## |
| 81 | +# Prerequisites Setup # |
| 82 | +############################################################## |
| 83 | + |
| 84 | +# We need both vendor/autoload.php and composer.lock being up to date |
| 85 | +.PHONY: prerequisites |
| 86 | +prerequisites: report-php-version build/cache vendor/autoload.php .phan composer.lock tools |
| 87 | + |
| 88 | +# Do install if there's no 'vendor' |
| 89 | +vendor/autoload.php: |
| 90 | + $(SILENT) $(COMPOSER) install --prefer-dist |
| 91 | + |
| 92 | +# If composer.lock is older than `composer.json`, do update, |
| 93 | +# and touch composer.lock because composer not always does that |
| 94 | +composer.lock: composer.json |
| 95 | + $(SILENT) $(COMPOSER) update && touch composer.lock |
| 96 | + |
| 97 | +.phan: $(PHAN) |
| 98 | + $(PHP) $(PHAN) --init --init-level=1 --init-overwrite --target-php-version=$(PHAN_PHP_VERSION) > /dev/null |
| 99 | + |
| 100 | +build: build/cache |
| 101 | +build/cache: |
| 102 | + mkdir -p build/cache |
| 103 | + |
| 104 | +.PHONY: report-php-version |
| 105 | +report-php-version: |
| 106 | + # Using $(PHP) |
| 107 | + |
| 108 | +.PHONY: tools |
| 109 | +tools: $(PHAN) $(PHP_CS_FIXER) $(PHPSTAN) $(INFECTION) |
| 110 | + |
| 111 | +WGET=wget -nv -O |
| 112 | + |
| 113 | +$(PHP_CS_FIXER): |
| 114 | + mkdir -p build |
| 115 | + $(WGET) $@ https://cs.sensiolabs.org/download/php-cs-fixer-v2.phar |
| 116 | + chmod +x $@ |
| 117 | + touch $@ |
| 118 | + |
| 119 | +$(PHPSTAN): |
| 120 | + mkdir -p build |
| 121 | + $(WGET) $@ https://github.com/phpstan/phpstan/releases/download/0.9.1/phpstan.phar |
| 122 | + chmod +x $@ |
| 123 | + touch $@ |
| 124 | + |
| 125 | +$(PHAN): |
| 126 | + mkdir -p build |
| 127 | + $(WGET) $@ https://github.com/phan/phan/releases/download/0.12.5/phan.phar |
| 128 | + chmod +x $@ |
| 129 | + touch $@ |
| 130 | + |
| 131 | +$(INFECTION): |
| 132 | + mkdir -p build |
| 133 | + $(WGET) $@ https://github.com/infection/infection/releases/download/0.8.0/infection.phar |
| 134 | + $(WGET) build/infection.phar.pubkey https://github.com/infection/infection/releases/download/0.8.0/infection.phar.pubkey |
| 135 | + chmod +x build/infection.phar |
| 136 | + |
| 137 | +############################################################## |
| 138 | +# Quick development testing procedure # |
| 139 | +############################################################## |
| 140 | + |
| 141 | +PHP_VERSIONS=php7.1 php7.2 |
| 142 | + |
| 143 | +.PHONY: quick |
| 144 | +quick: |
| 145 | + make --no-print-directory -j test-all |
| 146 | + |
| 147 | +.PHONY: test-all |
| 148 | +test-all: $(PHP_VERSIONS) |
| 149 | + |
| 150 | +.PHONY: $(PHP_VERSIONS) |
| 151 | +$(PHP_VERSIONS): cs |
| 152 | + @make --no-print-directory PHP=$@ PHP_CS_FIXER=/bin/true |
0 commit comments