| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # Makefile basic env setting |
| .DEFAULT_GOAL := help |
| # add pipefail support for default shell |
| SHELL := /bin/bash -o pipefail |
| |
| |
| # Project basic setting |
| VERSION ?= master |
| project_name ?= apache-apisix |
| project_compose_ci ?= ci/pod/docker-compose.yml |
| project_release_name ?= $(project_name)-$(VERSION)-src |
| |
| |
| # Hyperconverged Infrastructure |
| ENV_OS_NAME ?= $(shell uname -s | tr '[:upper:]' '[:lower:]') |
| ENV_OS_ARCH ?= $(shell uname -m | tr '[:upper:]' '[:lower:]') |
| ENV_APISIX ?= $(CURDIR)/bin/apisix |
| ENV_GIT ?= git |
| ENV_TAR ?= tar |
| ENV_INSTALL ?= install |
| ENV_DOCKER ?= docker |
| ENV_DOCKER_COMPOSE ?= docker-compose --project-directory $(CURDIR) -p $(project_name) -f $(project_compose_ci) |
| ENV_NGINX ?= $(ENV_NGINX_EXEC) -p $(CURDIR) -c $(CURDIR)/conf/nginx.conf |
| ENV_NGINX_EXEC := $(shell which openresty 2>/dev/null || which nginx 2>/dev/null) |
| ENV_OPENSSL_PREFIX ?= $(addprefix $(ENV_NGINX_PREFIX), openssl) |
| ENV_LUAROCKS ?= luarocks |
| ## These variables can be injected by luarocks |
| ENV_INST_PREFIX ?= /usr |
| ENV_INST_LUADIR ?= $(ENV_INST_PREFIX)/share/lua/5.1 |
| ENV_INST_BINDIR ?= $(ENV_INST_PREFIX)/bin |
| ENV_HOMEBREW_PREFIX ?= /usr/local |
| |
| ifneq ($(shell whoami), root) |
| ENV_LUAROCKS_FLAG_LOCAL := --local |
| endif |
| |
| ifdef ENV_LUAROCKS_SERVER |
| ENV_LUAROCKS_SERVER_OPT := --server $(ENV_LUAROCKS_SERVER) |
| endif |
| |
| # Execute only in the presence of ENV_NGINX_EXEC to avoid unexpected error output |
| ifneq ($(ENV_NGINX_EXEC), ) |
| ENV_NGINX_PREFIX := $(shell $(ENV_NGINX_EXEC) -V 2>&1 | grep -Eo 'prefix=(.*)/nginx\s+' | grep -Eo '/.*/') |
| # OpenResty 1.17.8 or higher version uses openssl111 as the openssl dirname. |
| ifeq ($(shell test -d $(addprefix $(ENV_NGINX_PREFIX), openssl111) && echo -n yes), yes) |
| ENV_OPENSSL_PREFIX := $(addprefix $(ENV_NGINX_PREFIX), openssl111) |
| endif |
| endif |
| |
| # ENV patch for darwin |
| ifeq ($(ENV_OS_NAME), darwin) |
| ifeq ($(ENV_OS_ARCH), arm64) |
| ENV_HOMEBREW_PREFIX := /opt/homebrew |
| endif |
| |
| # OSX archive `._` cache file |
| ENV_TAR := COPYFILE_DISABLE=1 $(ENV_TAR) |
| ENV_LUAROCKS := $(ENV_LUAROCKS) --lua-dir=$(ENV_HOMEBREW_PREFIX)/opt/lua@5.1 |
| |
| ifeq ($(shell test -d $(ENV_HOMEBREW_PREFIX)/opt/openresty-openssl && echo -n yes), yes) |
| ENV_OPENSSL_PREFIX := $(ENV_HOMEBREW_PREFIX)/opt/openresty-openssl |
| endif |
| ifeq ($(shell test -d $(ENV_HOMEBREW_PREFIX)/opt/openresty-openssl111 && echo -n yes), yes) |
| ENV_OPENSSL_PREFIX := $(ENV_HOMEBREW_PREFIX)/opt/openresty-openssl111 |
| endif |
| endif |
| |
| |
| # Makefile basic extension function |
| _color_red =\E[1;31m |
| _color_green =\E[1;32m |
| _color_yellow =\E[1;33m |
| _color_blue =\E[1;34m |
| _color_wipe =\E[0m |
| |
| |
| define func_echo_status |
| printf "[%b info %b] %s\n" "$(_color_blue)" "$(_color_wipe)" $(1) |
| endef |
| |
| |
| define func_echo_warn_status |
| printf "[%b info %b] %s\n" "$(_color_yellow)" "$(_color_wipe)" $(1) |
| endef |
| |
| |
| define func_echo_success_status |
| printf "[%b info %b] %s\n" "$(_color_green)" "$(_color_wipe)" $(1) |
| endef |
| |
| |
| define func_check_folder |
| if [[ ! -d $(1) ]]; then \ |
| mkdir -p $(1); \ |
| $(call func_echo_status, 'folder check -> create `$(1)`'); \ |
| else \ |
| $(call func_echo_success_status, 'folder check -> found `$(1)`'); \ |
| fi |
| endef |
| |
| |
| # Makefile target |
| .PHONY: runtime |
| runtime: |
| ifeq ($(ENV_NGINX_EXEC), ) |
| ifeq ("$(wildcard /usr/local/openresty-debug/bin/openresty)", "") |
| @$(call func_echo_warn_status, "WARNING: OpenResty not found. You have to install OpenResty and add the binary file to PATH before install Apache APISIX.") |
| exit 1 |
| else |
| $(eval ENV_NGINX_EXEC := /usr/local/openresty-debug/bin/openresty) |
| @$(call func_echo_status, "Use openresty-debug as default runtime") |
| endif |
| endif |
| |
| |
| ### help : Show Makefile rules |
| ### If there're awk failures, please make sure |
| ### you are using awk or gawk |
| .PHONY: help |
| help: |
| @$(call func_echo_success_status, "Makefile rules:") |
| @echo |
| @if [ '$(ENV_OS_NAME)' = 'darwin' ]; then \ |
| awk '{ if(match($$0, /^#{3}([^:]+):(.*)$$/)){ split($$0, res, ":"); gsub(/^#{3}[ ]*/, "", res[1]); _desc=$$0; gsub(/^#{3}([^:]+):[ \t]*/, "", _desc); printf(" make %-15s : %-10s\n", res[1], _desc) } }' Makefile; \ |
| else \ |
| awk '{ if(match($$0, /^\s*#{3}\s*([^:]+)\s*:\s*(.*)$$/, res)){ printf(" make %-15s : %-10s\n", res[1], res[2]) } }' Makefile; \ |
| fi |
| @echo |
| |
| |
| ### deps : Installation dependencies |
| .PHONY: deps |
| deps: runtime |
| $(eval ENV_LUAROCKS_VER := $(shell $(ENV_LUAROCKS) --version | grep -E -o "luarocks [0-9]+.")) |
| @if [ '$(ENV_LUAROCKS_VER)' = 'luarocks 3.' ]; then \ |
| mkdir -p ~/.luarocks; \ |
| $(ENV_LUAROCKS) config $(ENV_LUAROCKS_FLAG_LOCAL) variables.OPENSSL_LIBDIR $(addprefix $(ENV_OPENSSL_PREFIX), /lib); \ |
| $(ENV_LUAROCKS) config $(ENV_LUAROCKS_FLAG_LOCAL) variables.OPENSSL_INCDIR $(addprefix $(ENV_OPENSSL_PREFIX), /include); \ |
| $(ENV_LUAROCKS) install rockspec/apisix-master-0.rockspec --tree=deps --only-deps --local $(ENV_LUAROCKS_SERVER_OPT); \ |
| else \ |
| $(call func_echo_warn_status, "WARNING: You're not using LuaRocks 3.x; please remove the luarocks and reinstall it via https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh"); \ |
| exit 1; \ |
| fi |
| |
| |
| ### utils : Installation tools |
| .PHONY: utils |
| utils: |
| ifeq ("$(wildcard utils/lj-releng)", "") |
| wget -P utils https://raw.githubusercontent.com/iresty/openresty-devel-utils/master/lj-releng |
| chmod a+x utils/lj-releng |
| endif |
| ifeq ("$(wildcard utils/reindex)", "") |
| wget -P utils https://raw.githubusercontent.com/iresty/openresty-devel-utils/master/reindex |
| chmod a+x utils/reindex |
| endif |
| |
| |
| ### lint : Lint source code |
| .PHONY: lint |
| lint: utils |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| ./utils/check-lua-code-style.sh |
| ./utils/check-test-code-style.sh |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### init : Initialize the runtime environment |
| .PHONY: init |
| init: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_APISIX) init |
| $(ENV_APISIX) init_etcd |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### run : Start the apisix server |
| .PHONY: run |
| run: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_APISIX) start |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### quit : Stop the apisix server, exit gracefully |
| .PHONY: quit |
| quit: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_APISIX) quit |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### stop : Stop the apisix server, exit immediately |
| .PHONY: stop |
| stop: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_APISIX) stop |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### verify : Verify the configuration of apisix server |
| .PHONY: verify |
| verify: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_NGINX) -t |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### clean : Remove generated files |
| .PHONY: clean |
| clean: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| rm -rf logs/ |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### reload : Reload the apisix server |
| .PHONY: reload |
| reload: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_NGINX) -s reload |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### install : Install the apisix (only for luarocks) |
| .PHONY: install |
| install: runtime |
| $(ENV_INSTALL) -d /usr/local/apisix/ |
| $(ENV_INSTALL) -d /usr/local/apisix/logs/ |
| $(ENV_INSTALL) -d /usr/local/apisix/conf/cert |
| $(ENV_INSTALL) conf/mime.types /usr/local/apisix/conf/mime.types |
| $(ENV_INSTALL) conf/config.yaml /usr/local/apisix/conf/config.yaml |
| $(ENV_INSTALL) conf/config-default.yaml /usr/local/apisix/conf/config-default.yaml |
| $(ENV_INSTALL) conf/debug.yaml /usr/local/apisix/conf/debug.yaml |
| $(ENV_INSTALL) conf/cert/* /usr/local/apisix/conf/cert/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix |
| $(ENV_INSTALL) apisix/*.lua $(ENV_INST_LUADIR)/apisix/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/admin |
| $(ENV_INSTALL) apisix/admin/*.lua $(ENV_INST_LUADIR)/apisix/admin/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/balancer |
| $(ENV_INSTALL) apisix/balancer/*.lua $(ENV_INST_LUADIR)/apisix/balancer/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/control |
| $(ENV_INSTALL) apisix/control/*.lua $(ENV_INST_LUADIR)/apisix/control/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/core |
| $(ENV_INSTALL) apisix/core/*.lua $(ENV_INST_LUADIR)/apisix/core/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/core/dns |
| $(ENV_INSTALL) apisix/core/dns/*.lua $(ENV_INST_LUADIR)/apisix/core/dns |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/cli |
| $(ENV_INSTALL) apisix/cli/*.lua $(ENV_INST_LUADIR)/apisix/cli/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/discovery |
| $(ENV_INSTALL) apisix/discovery/*.lua $(ENV_INST_LUADIR)/apisix/discovery/ |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/discovery/{consul_kv,dns,eureka,nacos} |
| $(ENV_INSTALL) apisix/discovery/consul_kv/*.lua $(ENV_INST_LUADIR)/apisix/discovery/consul_kv |
| $(ENV_INSTALL) apisix/discovery/dns/*.lua $(ENV_INST_LUADIR)/apisix/discovery/dns |
| $(ENV_INSTALL) apisix/discovery/eureka/*.lua $(ENV_INST_LUADIR)/apisix/discovery/eureka |
| $(ENV_INSTALL) apisix/discovery/nacos/*.lua $(ENV_INST_LUADIR)/apisix/discovery/nacos |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/http |
| $(ENV_INSTALL) apisix/http/*.lua $(ENV_INST_LUADIR)/apisix/http/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/http/router |
| $(ENV_INSTALL) apisix/http/router/*.lua $(ENV_INST_LUADIR)/apisix/http/router/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins |
| $(ENV_INSTALL) apisix/plugins/*.lua $(ENV_INST_LUADIR)/apisix/plugins/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/ext-plugin |
| $(ENV_INSTALL) apisix/plugins/ext-plugin/*.lua $(ENV_INST_LUADIR)/apisix/plugins/ext-plugin/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/grpc-transcode |
| $(ENV_INSTALL) apisix/plugins/grpc-transcode/*.lua $(ENV_INST_LUADIR)/apisix/plugins/grpc-transcode/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/ip-restriction |
| $(ENV_INSTALL) apisix/plugins/ip-restriction/*.lua $(ENV_INST_LUADIR)/apisix/plugins/ip-restriction/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/limit-conn |
| $(ENV_INSTALL) apisix/plugins/limit-conn/*.lua $(ENV_INST_LUADIR)/apisix/plugins/limit-conn/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/limit-count |
| $(ENV_INSTALL) apisix/plugins/limit-count/*.lua $(ENV_INST_LUADIR)/apisix/plugins/limit-count/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/google-cloud-logging |
| $(ENV_INSTALL) apisix/plugins/google-cloud-logging/*.lua $(ENV_INST_LUADIR)/apisix/plugins/google-cloud-logging/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/prometheus |
| $(ENV_INSTALL) apisix/plugins/prometheus/*.lua $(ENV_INST_LUADIR)/apisix/plugins/prometheus/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/proxy-cache |
| $(ENV_INSTALL) apisix/plugins/proxy-cache/*.lua $(ENV_INST_LUADIR)/apisix/plugins/proxy-cache/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/serverless |
| $(ENV_INSTALL) apisix/plugins/serverless/*.lua $(ENV_INST_LUADIR)/apisix/plugins/serverless/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/zipkin |
| $(ENV_INSTALL) apisix/plugins/zipkin/*.lua $(ENV_INST_LUADIR)/apisix/plugins/zipkin/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/opa |
| $(ENV_INSTALL) apisix/plugins/opa/*.lua $(ENV_INST_LUADIR)/apisix/plugins/opa/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/ssl/router |
| $(ENV_INSTALL) apisix/ssl/router/*.lua $(ENV_INST_LUADIR)/apisix/ssl/router/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/stream/plugins |
| $(ENV_INSTALL) apisix/stream/plugins/*.lua $(ENV_INST_LUADIR)/apisix/stream/plugins/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/stream/router |
| $(ENV_INSTALL) apisix/stream/router/*.lua $(ENV_INST_LUADIR)/apisix/stream/router/ |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/utils |
| $(ENV_INSTALL) apisix/utils/*.lua $(ENV_INST_LUADIR)/apisix/utils/ |
| |
| $(ENV_INSTALL) bin/apisix $(ENV_INST_BINDIR)/apisix |
| |
| $(ENV_INSTALL) -d $(ENV_INST_LUADIR)/apisix/plugins/slslog |
| $(ENV_INSTALL) apisix/plugins/slslog/*.lua $(ENV_INST_LUADIR)/apisix/plugins/slslog/ |
| |
| |
| ### test : Run the test case |
| .PHONY: test |
| test: runtime |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_GIT) submodule update --init --recursive |
| prove -I../test-nginx/lib -I./ -r -s t/ |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### license-check : Check project source code for Apache License |
| .PHONY: license-check |
| license-check: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_DOCKER) run -it --rm -v $(CURDIR):/github/workspace apache/skywalking-eyes header check |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| .PHONY: release-src |
| release-src: compress-tar |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| gpg --batch --yes --armor --detach-sig $(project_release_name).tgz |
| shasum -a 512 $(project_release_name).tgz > $(project_release_name).tgz.sha512 |
| |
| $(call func_check_folder,release) |
| mv $(project_release_name).tgz release/$(project_release_name).tgz |
| mv $(project_release_name).tgz.asc release/$(project_release_name).tgz.asc |
| mv $(project_release_name).tgz.sha512 release/$(project_release_name).tgz.sha512 |
| ./utils/gen-vote-contents.sh $(VERSION) |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| .PHONY: compress-tar |
| compress-tar: |
| # The $VERSION can be major.minor.patch (from developer) |
| # or major.minor (from the branch name in the CI) |
| $(ENV_TAR) -zcvf $(project_release_name).tgz \ |
| ./apisix \ |
| ./bin \ |
| ./conf \ |
| ./rockspec/apisix-$(VERSION)*.rockspec \ |
| ./rockspec/apisix-master-0.rockspec \ |
| LICENSE \ |
| Makefile \ |
| NOTICE \ |
| *.md |
| |
| |
| ### container |
| ### ci-env-up : CI env launch |
| .PHONY: ci-env-up |
| ci-env-up: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_DOCKER_COMPOSE) up -d |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### ci-env-ps : CI env ps |
| .PHONY: ci-env-ps |
| ci-env-ps: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_DOCKER_COMPOSE) ps |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### ci-env-rebuild : CI env image rebuild |
| .PHONY: ci-env-rebuild |
| ci-env-rebuild: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_DOCKER_COMPOSE) build |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |
| |
| |
| ### ci-env-down : CI env destroy |
| .PHONY: ci-env-down |
| ci-env-down: |
| @$(call func_echo_status, "$@ -> [ Start ]") |
| $(ENV_DOCKER_COMPOSE) down |
| @$(call func_echo_success_status, "$@ -> [ Done ]") |