blob: c14c01db7ae7225661e5d75c806558a87373e063 [file] [log] [blame]
# Function Reference:
# https://www.gnu.org/software/make/manual/html_node/Text-Functions.html
# https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html
# Variable Reference:
# https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
# Makefile's own config
ifeq ($(OS),Windows_NT)
WINDOWS=1
endif
ifdef WINDOWS
SHELL = cmd
JEKYLL = bundle.bat exec jekyll
CAT = type
LS = ls
else
SHELL = sh
JEKYLL = bundle exec jekyll
CAT = cat
LS = ls
endif
# macros
slugify = $(subst /,_,$(subst .,-,$(1)))
slug2language = $(subst /,,$(dir $(subst _,/,$(1))))
slug2version = $(subst -,.,$(notdir $(subst _,/,$(1))))
ifdef WINDOWS
copydir = xcopy "$(subst /,\,$(1))" "$(subst /,\,$(2))" /E /I
else
copydir = cp -r $(1) $(2)
endif
ifdef WINDOWS
copyfile = copy "$(subst /,\,$(1))" "$(subst /,\,$(2))"
else
copyfile = cp $(1) $(2)
endif
ifdef WINDOWS
makedir = mkdir $(subst /,\,$(1))
else
makedir = mkdir -p $(1)
endif
ifdef WINDOWS
printfile = type $(subst /,\,$(1))
else
printfile = cat $(1)
endif
# constants
EMPTY =
SPACE = $(EMPTY) $(EMPTY)
COMMA = ,
VERSION_VAR_NAME = latest_docs_version
# paths and files
BIN_DIR = tools/bin
NODE_BIN_DIR = ./node_modules/.bin
SRC_DIR = www
DEV_DIR = build-dev
PROD_DIR = build-prod
CONFIG_DIR = conf
DOCS_DIR = $(SRC_DIR)/docs
DATA_DIR = $(SRC_DIR)/_data
TOC_DIR = $(DATA_DIR)/toc
STATIC_DIR = $(SRC_DIR)/static
CSS_SRC_DIR = $(STATIC_DIR)/css-src
CSS_DEST_DIR = $(STATIC_DIR)/css
PLUGINS_SRC_DIR = $(STATIC_DIR)/plugins
PLUGINS_DEST_DIR = $(STATIC_DIR)/js
# executables
NODE = node
CROWDIN = crowdin-cli
GULP = $(NODE_BIN_DIR)/gulp
LESSC = $(NODE_BIN_DIR)/lessc
SASSC = $(NODE_BIN_DIR)/node-sass
BROWSERIFY = $(NODE_BIN_DIR)/browserify
UGLIFY = $(NODE_BIN_DIR)/uglifyjs
# replace slashes in executables on Windows
ifdef WINDOWS
GULP := $(subst /,\,$(GULP))
LESSC := $(subst /,\,$(LESSC))
SASSC := $(subst /,\,$(SASSC))
BROWSERIFY := $(subst /,\,$(BROWSERIFY))
UGLIFY := $(subst /,\,$(UGLIFY))
MAKE := $(subst /,\,$(MAKE))
endif
# existing files
MAIN_CONFIG = $(CONFIG_DIR)/_config.yml
DEV_CONFIG = $(CONFIG_DIR)/_dev.yml
PROD_CONFIG = $(CONFIG_DIR)/_prod.yml
DOCS_EXCLUDE_CONFIG = $(CONFIG_DIR)/_nodocs.yml
FETCH_CONFIG = $(DATA_DIR)/fetched-files.yml
REDIRECTS_FILE = $(DATA_DIR)/redirects.yml
PLUGINS_SRC = $(PLUGINS_SRC_DIR)/app.js
VERSION_FILE = VERSION
FETCH_SCRIPT = $(BIN_DIR)/fetch_docs.js
CROWDIN_CONFIG = $(CONFIG_DIR)/crowdin.yml
ifdef WINDOWS
CROWDIN_IDENTITY_FILE = %HOME%/.crowdin.yml
else
CROWDIN_IDENTITY_FILE = $$HOME/.crowdin.yml
endif
# NOTE:
# the .scss files are separate because they combine into MAIN_STYLE_FILE,
# which includes them on its own, and the SCSS compiler takes care of them;
# because of this, there is also no .scss -> .css pattern rule
ifdef WINDOWS
SCSS_SRC = $(subst $(PWD)/,,$(subst \,/,$(shell cd $(CSS_SRC_DIR) && dir *.scss /S /B)))
STYLES_SRC = $(subst $(PWD)/,,$(subst \,/,$(shell cd $(CSS_SRC_DIR) && dir *.less *.css /S /B)))
else
SCSS_SRC = $(shell find $(CSS_SRC_DIR) -name "*.scss")
STYLES_SRC = $(shell find $(CSS_SRC_DIR) -name "*.less" -or -name "*.css")
endif
LANGUAGES = $(shell $(LS) $(DOCS_DIR))
LATEST_DOCS_VERSION = $(strip $(shell $(CAT) $(VERSION_FILE)))
NEXT_DOCS_VERSION = $(shell $(NODE) $(BIN_DIR)/nextversion.js $(LATEST_DOCS_VERSION))
NEXT_DOCS_VERSION_SLUG = $(call slugify,$(NEXT_DOCS_VERSION))
DEV_DOCS = $(addprefix $(DOCS_DIR)/,$(addsuffix /dev,$(LANGUAGES)))
DEV_DOCS_TOCS = $(addprefix $(TOC_DIR)/,$(addsuffix _dev-src.yml, $(LANGUAGES)))
# generated files
VERSION_CONFIG = $(CONFIG_DIR)/_version.yml
DEFAULTS_CONFIG = $(CONFIG_DIR)/_defaults.yml
DOCS_VERSION_DATA = $(DATA_DIR)/docs-versions.yml
DOCS_PAGE_LIST = $(DATA_DIR)/all-pages.yml
PLUGINS_APP = $(PLUGINS_DEST_DIR)/plugins.js
MAIN_STYLE_FILE = $(CSS_DEST_DIR)/main.css
STYLES = $(MAIN_STYLE_FILE) $(addsuffix .css,$(basename $(subst $(CSS_SRC_DIR),$(CSS_DEST_DIR),$(STYLES_SRC))))
DOCS_VERSION_DIRS = $(filter-out %.md,$(wildcard $(DOCS_DIR)/**/*))
DOCS_VERSION_SLUGS = $(call slugify,$(subst $(DOCS_DIR)/,,$(DOCS_VERSION_DIRS)))
TOC_FILES = $(addprefix $(TOC_DIR)/,$(addsuffix -gen.yml,$(DOCS_VERSION_SLUGS)))
FETCH_FLAGS = --config $(FETCH_CONFIG) --docsRoot $(DOCS_DIR)
FETCHED_FILES = $(shell $(NODE) $(FETCH_SCRIPT) $(FETCH_FLAGS) --dump)
NEXT_DOCS = $(addprefix $(DOCS_DIR)/,$(addsuffix /$(NEXT_DOCS_VERSION),$(LANGUAGES)))
NEXT_DOCS_TOCS = $(addprefix $(TOC_DIR)/,$(addsuffix _$(NEXT_DOCS_VERSION_SLUG)-src.yml, $(LANGUAGES)))
# other variables
# NOTE:
# the order of config files matters to Jekyll
JEKYLL_CONFIGS = $(MAIN_CONFIG) $(DEFAULTS_CONFIG) $(VERSION_CONFIG)
JEKYLL_FLAGS =
BUILD_DATA = $(DOCS_VERSION_DATA) $(DOCS_PAGE_LIST) $(TOC_FILES)
# convenience targets
help usage default:
@echo ""
@echo "Usage:"
@echo ""
@echo " make build: build site with dev config"
@echo " make install: install dependencies"
@echo ""
@echo " make data: generate data files (Generated ToCs, $(DOCS_VERSION_DATA), $(DOCS_PAGE_LIST))"
@echo " make configs: generate Jekyll configs ($(DEFAULTS_CONFIG), $(VERSION_CONFIG))"
@echo " make styles: generate CSS"
@echo " make plugins: generate plugins app ($(PLUGINS_APP))"
@echo ""
@echo " make snapshot: copy dev docs to $(LATEST_DOCS_VERSION) docs"
@echo " make newversion: create $(NEXT_DOCS_VERSION) docs from dev docs"
@echo ""
@echo " make clean: remove all generated output"
@echo " make nuke: run 'make clean' and remove all dependencies"
@echo ""
@echo "Arguments:"
@echo ""
@echo " NODOCS: (defined or undefined) - excludes docs from build"
@echo " PROD: (defined or undefined) - uses production config instead of dev config"
@echo ""
fetch: $(FETCHED_FILES)
data: $(BUILD_DATA)
configs: $(DEFAULTS_CONFIG) $(VERSION_CONFIG)
styles: $(STYLES)
plugins: $(PLUGINS_APP)
toc: $(TOC_FILES)
ifdef PROD
JEKYLL_CONFIGS += $(PROD_CONFIG)
ifdef NODOCS
$(error Cannot ignore docs during a production build)
endif
else
JEKYLL_CONFIGS += $(DEV_CONFIG)
JEKYLL_FLAGS += --trace
ifdef NODOCS
JEKYLL_CONFIGS += $(DOCS_EXCLUDE_CONFIG)
endif
endif
build: JEKYLL_FLAGS += --config $(subst $(SPACE),$(COMMA),$(strip $(JEKYLL_CONFIGS)))
build: $(JEKYLL_CONFIGS) $(FETCHED_FILES) $(BUILD_DATA) $(STYLES) $(PLUGINS_APP)
$(JEKYLL) build $(JEKYLL_FLAGS)
install:
bundle install
npm install
serve:
cd $(DEV_DIR) && python -m SimpleHTTPServer 8000
# doing this in Make in a cross-platform way is pretty ugly
snapshot: $(FETCHED_FILES)
$(GULP) snapshot
newversion: $(NEXT_DOCS) $(NEXT_DOCS_TOCS)
echo $(NEXT_DOCS_VERSION) > $(VERSION_FILE)
# real targets
$(FETCHED_FILES): $(FETCH_CONFIG) $(FETCH_SCRIPT)
$(NODE) $(FETCH_SCRIPT) $(FETCH_FLAGS)
# NOTE:
# the ">>" operator appends to a file in both CMD and SH
$(PLUGINS_APP): $(PLUGINS_SRC)
echo ---> $@
echo --->> $@
$(BROWSERIFY) -t reactify -t envify $< | $(UGLIFY) >> $@
$(DOCS_VERSION_DATA): $(BIN_DIR)/gen_versions.js $(DOCS_DIR)
$(NODE) $(BIN_DIR)/gen_versions.js $(DOCS_DIR) > $@
$(DOCS_PAGE_LIST): $(BIN_DIR)/gen_pages_dict.js $(FETCHED_FILES) $(REDIRECTS_FILE) $(SRC_DIR)
$(NODE) $(BIN_DIR)/gen_pages_dict.js \
--siteRoot $(SRC_DIR) \
--redirectsFile $(REDIRECTS_FILE) \
--latestVersion $(LATEST_DOCS_VERSION) \
--languages $(subst $(SPACE),$(COMMA),$(LANGUAGES)) \
> $@
$(DEFAULTS_CONFIG): $(BIN_DIR)/gen_defaults.js $(VERSION_FILE) $(DOCS_DIR)
$(NODE) $(BIN_DIR)/gen_defaults.js $(DOCS_DIR) "$(LATEST_DOCS_VERSION)" > $@
$(VERSION_CONFIG): $(VERSION_FILE)
sed -e "s/^/$(VERSION_VAR_NAME): /" < $< > $@
$(MAIN_STYLE_FILE): $(SCSS_SRC)
# pattern rules
$(DOCS_DIR)/%/$(NEXT_DOCS_VERSION): $(DOCS_DIR)/%/dev
$(call copydir,$^,$@)
ifndef WINDOWS
touch $(DOCS_DIR)
endif
$(TOC_DIR)/%_$(NEXT_DOCS_VERSION_SLUG)-src.yml: $(TOC_DIR)/%_dev-src.yml $(DOCS_DIR)
$(call copyfile,$<,$@)
$(TOC_DIR)/%_dev-gen.yml: $(FETCHED_FILES)
$(TOC_DIR)/%-gen.yml: $(TOC_DIR)/%-src.yml $(BIN_DIR)/augment_toc.js $(DOCS_DIR)
$(NODE) $(BIN_DIR)/augment_toc.js --srcToc $< --srcRoot $(DOCS_DIR)/$(call slug2language,$*)/$(call slug2version,$*) > $@
# NOTE:
# $(@D) means "directory part of target"
$(CSS_DEST_DIR)/%.css: $(CSS_SRC_DIR)/%.less
-$(call makedir,$(@D))
echo ---> $@
echo --->> $@
$(LESSC) $< >> $@
$(CSS_DEST_DIR)/%.css: $(CSS_SRC_DIR)/%.scss
-$(call makedir,$(@D))
echo ---> $@
echo --->> $@
$(SASSC) $< >> $@
$(CSS_DEST_DIR)/%.css: $(CSS_SRC_DIR)/%.css
-$(call makedir,$(@D))
echo ---> $@
echo --->> $@
$(call printfile,$<) >> $@
# crowdin
CROWDIN_SRC = www/docs/en/dev
CROWDIN_JAIL = crowdin-jail
CROWDIN_COPY_DIR = $(CROWDIN_JAIL)/cordova-docs/docs/en
CROWDIN_COPY = $(CROWDIN_COPY_DIR)/dev
$(CROWDIN_JAIL) $(CROWDIN_COPY_DIR):
ifdef WINDOWS
-$(MKDIRP) $(subst /,\,$@)
else
$(MKDIRP) $@
endif
$(CROWDIN_COPY): $(CROWDIN_SRC) $(CROWDIN_COPY_DIR) $(FETCHED_FILES)
cp -R $(CROWDIN_SRC) $(CROWDIN_COPY_DIR)
cw_project: CW_COMMAND = list project
cw_translations: CW_COMMAND = list translations
cw_sources: CW_COMMAND = list sources
cw_upload: CW_COMMAND = upload sources --auto-update
cw_download: CW_COMMAND = download en
cw_project cw_translations cw_sources cw_upload cw_download: crowdin
crowdin: $(CROWDIN_JAIL) $(CROWDIN_COPY)
(cd $(CROWDIN_JAIL) && $(CROWDIN) --identity=$(CROWDIN_IDENTITY_FILE) --config=../$(CROWDIN_CONFIG) $(CW_COMMAND))
on_disk.txt: $(CROWDIN_COPY)
$(MAKE) cw_sources | grep "^/cordova-docs" | sort > $@
on_crowdin.txt: $(CROWDIN_COPY)
$(MAKE) cw_project | grep "^/cordova-docs" | sort > $@
cw_diff: on_disk.txt on_crowdin.txt
comm -3 $^
$(RM) $^
# maintenance
clean:
$(RM) -r $(CROWDIN_JAIL)
$(RM) -r $(PROD_DIR) $(DEV_DIR)
$(RM) $(VERSION_CONFIG)
$(RM) $(DEFAULTS_CONFIG)
$(RM) $(DOCS_PAGE_LIST)
$(RM) $(DOCS_VERSION_DATA)
$(RM) -r $(PROD_DIR) $(DEV_DIR)
$(RM) $(TOC_FILES)
$(RM) $(PLUGINS_APP)
$(RM) -r $(CSS_DEST_DIR)
$(RM) $(FETCHED_FILES)
nuke: clean
$(RM) -r node_modules
$(RM) Gemfile.lock
.PHONY: clean usage help default build fetch $(DEV_DOCS)