Makefile
# Main Makefile for ownCloud development
#
# Requirements to run make here:
# - composer
# - node
# - yarn
#
# Installing composer can be done via https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx
#
# Node/Yarn can be installed following e.g. the Debian/Ubuntu instructions at
# https://nodejs.org/en/download/package-manager/
#
# curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
# sudo apt-get install -y nodejs build-essential
#
# (installation from distro packages is not recommended, often old versions)
#
#
# Usage:
#
# make
# - prepare everything
# make clean
# - clean up
# make test-php
# make test-js
# - testing targets
# Detailed documentation in https://github.com/owncloud/documentation:
# - https://doc.owncloud.com/server/latest/developer_manual/general/devenv.html#check-out-the-code
# - https://doc.owncloud.com/server/latest/developer_manual/testing/unit-testing.html#running-unit-tests-for-owncloud-core
#
NODE_PREFIX=build
SHELL=/bin/bash
#
# Define YARN and check if it is available on the system.
#
YARN := $(shell command -v yarn 2> /dev/null)
KARMA=$(NODE_PREFIX)/node_modules/.bin/karma
JSDOC=$(NODE_PREFIX)/node_modules/.bin/jsdoc
PHPUNIT="$(shell pwd)/lib/composer/phpunit/phpunit/phpunit"
COMPOSER_BIN := $(shell command -v composer 2> /dev/null)
# bin file definitions
PHP_CS_FIXER=php -d zend.enable_gc=0 vendor-bin/owncloud-codestyle/vendor/bin/php-cs-fixer
PHP_CODESNIFFER=vendor-bin/php_codesniffer/vendor/bin/phpcs
PHAN=php -d zend.enable_gc=0 vendor-bin/phan/vendor/bin/phan
PHPSTAN=php -d zend.enable_gc=0 vendor-bin/phpstan/vendor/bin/phpstan
TEST_DATABASE=sqlite
TEST_EXTERNAL_ENV=smb-silvershell
TEST_PHP_SUITE=
DOC_LINK_VERSION=
# Acceptance test flags (for shells supporting autocompletion of makefiles, eg: zsh)
TEST_SERVER_URL?=
TEST_SERVER_FED_URL?=
TEST_WITH_LDAP?=
BEHAT_FEATURE?=
NORERUN?=
BEHAT_RERUN_TIMES?=
# set TESTING_REMOTE_SYSTEM to default=true and make it a system env. variable
export TESTING_REMOTE_SYSTEM?=true
RELEASE_CHANNEL=git
# internal aliases
composer_deps=lib/composer
composer_dev_deps=lib/composer/phpunit
acceptance_test_deps=vendor-bin/behat/vendor
nodejs_deps=build/node_modules
core_vendor=core/vendor
core_doc_files=AUTHORS COPYING README.md CHANGELOG.md
core_src_files=$(wildcard *.php) index.html db_structure.xml .htaccess .user.ini robots.txt
core_src_dirs=apps core l10n lib occ ocs ocs-provider ocm-provider resources settings
core_test_dirs=tests
core_all_src=$(core_src_files) $(core_src_dirs) $(core_doc_files)
core_config_files=config/config.sample.php config/config.apps.sample.php
dist_dir=build/dist
work_dir=${shell pwd}
#
# Catch-all rules
#
.PHONY: all
all: help-hint $(composer_dev_deps) $(nodejs_deps)
.PHONY: clean
clean: clean-composer-deps clean-nodejs-deps clean-test clean-dist
.PHONY: help-hint
help-hint:
@echo "Building core"
@echo
@echo "Note: You can type 'make help' for more targets"
@echo
.PHONY: help
help:
@echo "Please use 'make <target>' where <target> is one of the following:"
@echo
@echo -e "Dependencies:\n"
@echo -e "make clean\t\t\tclean everything"
@echo -e "make install-composer-deps\tinstall composer dependencies"
@echo -e "make update-composer\t\tupdate composer.lock"
@echo -e "make install-nodejs-deps\tinstall Node JS and Javascript dependencies"
@echo
@echo -e "Note that running 'make' without arguments already installs all required dependencies"
@echo
@echo -e "Testing:\n"
@echo -e "make test\t\t\trun all tests"
@echo -e "make test-php-unit\t\trun all PHP tests"
@echo -e "make test-php-style\t\trun PHP code style checks"
@echo -e "make test-php-phan\t\trun PHP phan static code analyzer"
@echo -e "make test-php-phpstan\t\trun PHP phpstan static code analyzer"
@echo -e "make test-js\t\t\trun Javascript tests"
@echo -e "make test-js-debug\t\trun Javascript tests in debug mode (continuous)"
@echo -e "make test-acceptance-api\trun API acceptance tests"
@echo -e "make test-acceptance-cli\trun CLI acceptance tests"
@echo -e "make test-acceptance-webui\trun webUI acceptance tests"
@echo -e "make clean-test\t\t\tclean test results"
@echo
@echo It is also possible to run individual PHP test files with the following command:
@echo -e "make test-php-unit TEST_DATABASE=mysql TEST_PHP_SUITE=path/to/testfile.php"
@echo
@echo -e "Tools:\n"
@echo -e "make test-php-style-fix\t\trun PHP code style checks and fix any issues found"
@echo -e "make update-php-license-header\tUpdate license headers"
@echo -e "make changelog\t\t\tGenerate the CHANGELOG.md file for testing"
@echo
@echo -e "make test-doc-links\t\tTest if the doc links are valid"
@echo
@echo It is also possible to specify the ownCloud version to look for in the docs:
@echo -e "make test-doc-links DOC_LINK_VERSION=10.7"
#
# ownCloud core PHP dependencies
#
$(composer_deps): composer.json composer.lock
php $(COMPOSER_BIN) install --no-dev
$(composer_dev_deps): composer.json composer.lock
php $(COMPOSER_BIN) install
.PHONY: install-composer-release-deps
install-composer-release-deps: $(composer_deps)
.PHONY: install-composer-dev-deps
install-composer-dev-deps: $(composer_dev_deps)
.PHONY: install-composer-deps
install-composer-deps: install-composer-dev-deps
.PHONY: update-composer
update-composer:
rm -f composer.lock
php $(COMPOSER_BIN) install --prefer-dist
.PHONY: clean-composer-deps
clean-composer-deps:
rm -Rf lib/composer
rm -Rf vendor-bin/**/vendor vendor-bin/**/composer.lock
#
# Node JS dependencies for tools
#
$(nodejs_deps): build/package.json
@test -x "$(YARN)" || { echo "yarn is not available on your system, please install yarn (npm install -g yarn)" && exit 1; }
cd $(NODE_PREFIX) && $(YARN) install
touch $@
# alias for core deps
$(core_vendor): $(nodejs_deps)
.PHONY: install-nodejs-deps
install-nodejs-deps: $(nodejs_deps)
.PHONY: clean-nodejs-deps
clean-nodejs-deps:
rm -Rf $(core_vendor)
rm -Rf $(nodejs_deps)
##---------------------
## Tests
##---------------------
.PHONY: test-php-unit
test-php-unit: $(composer_dev_deps)
PHPUNIT=$(PHPUNIT) build/autotest.sh $(TEST_DATABASE) $(TEST_PHP_SUITE)
.PHONY: test-external
test-external: $(composer_dev_deps)
PHPUNIT=$(PHPUNIT) build/autotest-external.sh $(TEST_DATABASE) $(TEST_EXTERNAL_ENV) $(TEST_PHP_SUITE)
.PHONY: test-js
test-js: $(nodejs_deps)
NODE_PATH='$(NODE_PREFIX)/node_modules' $(KARMA) start tests/karma.config.js --single-run
.PHONY: test-js-debug
test-js-debug: $(nodejs_deps)
NODE_PATH='$(NODE_PREFIX)/node_modules' $(KARMA) start tests/karma.config.js
.PHONY: test-acceptance-api
test-acceptance-api: $(acceptance_test_deps)
./tests/acceptance/run.sh --type api
.PHONY: test-acceptance-cli
test-acceptance-cli: $(acceptance_test_deps)
./tests/acceptance/run.sh --type cli
.PHONY: test-acceptance-webui
test-acceptance-webui: $(acceptance_test_deps)
./tests/acceptance/run.sh --type webUI
.PHONY: test-php-style
test-php-style: vendor-bin/owncloud-codestyle/vendor vendor-bin/php_codesniffer/vendor
$(PHP_CS_FIXER) fix -vv --diff --allow-risky yes --dry-run
$(PHP_CODESNIFFER) --cache --runtime-set ignore_warnings_on_exit --standard=phpcs.xml tests/acceptance tests/TestHelpers
php build/OCPSinceChecker.php
.PHONY: test-php-style-fix
test-php-style-fix: vendor-bin/owncloud-codestyle/vendor
$(PHP_CS_FIXER) fix -vv --diff --allow-risky yes
.PHONY: test-php-phan
test-php-phan: vendor-bin/phan/vendor
$(PHAN) --config-file .phan/config.php --require-config-exists -p
.PHONY: test-php-phpstan
test-php-phpstan: vendor-bin/phpstan/vendor
$(PHPSTAN) analyse --memory-limit=2G --configuration=./phpstan.neon --level=0 apps core settings lib/private lib/public ocs ocs-provider
.PHONY: test
test: test-php-style test-php-unit test-js test-acceptance-api test-acceptance-cli test-acceptance-webui
.PHONY: clean-test-acceptance
clean-test-acceptance:
$(MAKE) -C tests/acceptance clean
.PHONY: clean-test-results
clean-test-results:
rm -Rf tests/autotest-*results*.xml
$(MAKE) -C tests/acceptance clean
.PHONY: clean-test
clean-test: clean-test-acceptance clean-test-results
#
# Documentation
#
.PHONY: docs-js
docs-js: $(nodejs_deps)
$(JSDOC) -d build/jsdocs core/js/*.js core/js/**/*.js apps/*/js/*.js
.PHONY: docs
docs: docs-js
.PHONY: clean-docs
clean-docs:
rm -Rf build/jsdocs
.PHONY: test-doc-links
test-doc-links:
php tests/docs/DocLinksTest.php $(DOC_LINK_VERSION)
#
# Build distribution
#
$(dist_dir)/owncloud: $(composer_deps) $(core_vendor) $(core_all_src)
cd $(NODE_PREFIX) && $(YARN) run clean-modules
rm -Rf $@; mkdir -p $@/config
cp -RL $(core_all_src) $@
cp -R $(core_config_files) $@/config
find $@ -name .gitkeep -delete
find $@ -name .gitignore -delete
find $@ -name no-php -delete
rm -Rf $@/core/js/tests
rm -Rf $@/settings/tests
rm -Rf $@/core/vendor/*/{.bower.json,bower.json,package.json,testem.json}
rm -Rf $@/l10n/
find $@/core/ -iname \*.sh -delete
find $@/{apps/,lib/composer/,core/vendor/} \( \
-name bin -o \
-name test -o \
-name tests -o \
-name examples -o \
-name demo -o \
-name demos -o \
-name doc -o \
-name travis -o \
-iname \*.sh \
\) -print | xargs rm -Rf
find $@/{apps/,lib/composer/} -iname \*.exe -delete
# Set build
$(eval _BUILD="$(shell date -u --iso-8601=seconds) $(shell git rev-parse HEAD)")
# Replace channel in version.php
sed -i \
-e 's/$$OC_Channel.*$$/$$OC_Channel = '"'"$(RELEASE_CHANNEL)"'"';/g' \
-e 's/$$OC_Build.*$$/$$OC_Build = '"'"$(_BUILD)"'"';/g' \
$(dist_dir)/owncloud/version.php
$(dist_dir)/owncloud-core.tar.bz2: $(dist_dir)/owncloud
cd $(dist_dir) && tar cjf owncloud-core.tar.bz2 owncloud --format=gnu
$(dist_dir)/owncloud-core.zip: $(dist_dir)/owncloud
cd $(dist_dir) && zip -rq9 owncloud-core.zip owncloud
.PHONY: dist
dist: $(dist_dir)/owncloud-core.tar.bz2 $(dist_dir)/owncloud-core.zip
.PHONY: dist-dir
dist-dir: $(dist_dir)/owncloud
.PHONY: clean-dist
clean-dist:
rm -Rf $(dist_dir)
#
# Build qa distribution
#
$(dist_dir)/qa/owncloud: $(composer_dev_deps) $(core_vendor) $(core_all_src) $(core_test_dirs)
cd $(NODE_PREFIX) && $(YARN) run clean-modules
rm -Rf $@; mkdir -p $@/config
cp -RL $(core_all_src) $@
cp -Rf $(core_test_dirs) $@
cp -R $(core_config_files) $@/config
rm -Rf $@/lib/composer/bin; cp -R lib/composer/bin $@/lib/composer/bin
find $@ -name .gitkeep -delete
find $@ -name .gitignore -delete
find $@ -name no-php -delete
rm -Rf $@/core/vendor/*/{.bower.json,bower.json,package.json,testem.json}
rm -Rf $@/l10n/
find $@/core/ -iname \*.sh -delete
find $@/{apps/,lib/composer/,core/vendor/} \( \
-name test -o \
-name examples -o \
-name demo -o \
-name demos -o \
-name doc -o \
-name travis -o \
-iname \*.sh \
\) -print | xargs rm -Rf
find $@/{apps/,lib/composer/} -iname \*.exe -delete
# Set build
$(eval _BUILD="$(shell date -u --iso-8601=seconds) $(shell git rev-parse HEAD)")
# Replace channel in version.php
sed -i \
-e 's/$$OC_Channel.*$$/$$OC_Channel = '"'"$(RELEASE_CHANNEL)"'"';/g' \
-e 's/$$OC_Build.*$$/$$OC_Build = '"'"$(_BUILD)"'"';/g' \
$(dist_dir)/qa/owncloud/version.php
$(dist_dir)/owncloud-qa-core.tar.bz2: $(dist_dir)/qa/owncloud
cd $(dist_dir)/qa && tar cjf owncloud-qa-core.tar.bz2 owncloud --format=gnu
.PHONY: dist-qa
dist-qa: $(dist_dir)/owncloud-qa-core.tar.bz2
.PHONY: dist-dir-qa
dist-dir-qa: $(dist_dir)/qa/owncloud
#
# Miscellaneous tools
#
.PHONY: update-php-license-header
update-php-license-header:
php build/license.php
.PHONY: changelog
changelog:
@echo ======================================================================
@echo WARNING: Please do NOT commit changes in the CHANGELOG.md file to git!
@echo This file is autogenerated on the master branch.
@echo Committing changes to this file will result in merge conflicts.
@echo ======================================================================
docker run --rm -v $(work_dir):$(work_dir) -w $(work_dir) toolhippie/calens calens >| CHANGELOG.md
docker run --rm -v $(work_dir):$(work_dir) -w $(work_dir) toolhippie/calens calens -t changelog/CHANGELOG-html.tmpl >| CHANGELOG.html
#
# Dependency management
#--------------------------------------
composer.lock: composer.json
@echo composer.lock is not up to date.
vendor: composer.lock
composer install --no-dev
vendor/bamarni/composer-bin-plugin: composer.lock
composer install
.PHONY: vendor-bin-deps
vendor-bin-deps: vendor-bin/owncloud-codestyle/vendor vendor-bin/php_codesniffer/vendor vendor-bin/phan/vendor vendor-bin/phpstan/vendor vendor-bin/behat/vendor
.PHONY: vendor-bin-codestyle
vendor-bin-codestyle: vendor-bin/owncloud-codestyle/vendor
.PHONY: vendor-bin-codesniffer
vendor-bin-codesniffer: vendor-bin/php_codesniffer/vendor
.PHONY: vendor-bin-phan
vendor-bin-phan: vendor-bin/phan/vendor
.PHONY: vendor-bin-phpstan
vendor-bin-phpstan: vendor-bin/phpstan/vendor
.PHONY: vendor-bin-behat
vendor-bin-behat: vendor-bin/behat/vendor
vendor-bin/owncloud-codestyle/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/owncloud-codestyle/composer.lock
composer bin owncloud-codestyle install --no-progress
vendor-bin/owncloud-codestyle/composer.lock: vendor-bin/owncloud-codestyle/composer.json
@echo owncloud-codestyle composer.lock is not up to date.
vendor-bin/php_codesniffer/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/php_codesniffer/composer.lock
composer bin php_codesniffer install --no-progress
vendor-bin/php_codesniffer/composer.lock: vendor-bin/php_codesniffer/composer.json
@echo php_codesniffer composer.lock is not up to date.
vendor-bin/phan/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/phan/composer.lock
composer bin phan install --no-progress
vendor-bin/phan/composer.lock: vendor-bin/phan/composer.json
@echo phan composer.lock is not up to date.
vendor-bin/phpstan/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/phpstan/composer.lock
composer bin phpstan install --no-progress
vendor-bin/phpstan/composer.lock: vendor-bin/phpstan/composer.json
@echo phpstan composer.lock is not up to date.
vendor-bin/behat/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/behat/composer.lock
composer bin behat install --no-progress
vendor-bin/behat/composer.lock: vendor-bin/behat/composer.json
@echo behat composer.lock is not up to date.