|
| 1 | +# Makefile for tests for tools/scripts in docs-resources repository. |
| 2 | +# Must be run in top-level directory of docs-resources repository. |
| 3 | +# |
| 4 | +# This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 |
| 5 | +# International License. To view a copy of this license, visit |
| 6 | +# http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to |
| 7 | +# Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. |
| 8 | +# |
| 9 | +# SPDX-License-Identifier: CC-BY-SA-4.0 |
| 10 | +# |
| 11 | +# This Makefile is designed to automate the process of running tests. |
| 12 | +# Running with a preinstalled docker container is strongly recommended. |
| 13 | +# Install by running: |
| 14 | +# docker pull riscvintl/riscv-docs-base-container-image:latest |
| 15 | + |
| 16 | +# Directories all relative to the top-level. |
| 17 | +CONVERTERS_DIR := converters |
| 18 | +TOOLS_DIR := tools |
| 19 | +BUILD_DIR := build |
| 20 | +TESTS_DIR := tests |
| 21 | +NORM_RULE_TESTS_DIR := $(TESTS_DIR)/norm-rule |
| 22 | +NORM_RULE_DEF_DIR := $(NORM_RULE_TESTS_DIR) |
| 23 | +NORM_RULE_EXPECTED_DIR := $(NORM_RULE_TESTS_DIR)/expected |
| 24 | + |
| 25 | +# Ruby scripts being tested. |
| 26 | +TAGS_BACKEND := tags.rb |
| 27 | +CREATE_NORM_RULE_TOOL := create_normative_rules.rb |
| 28 | + |
| 29 | +# Input and output file names |
| 30 | +TEST_ADOC_INPUT_FNAME := test.adoc |
| 31 | +NORM_TAGS_OUTPUT_FNAME := test-norm-tags.json |
| 32 | +NORM_RULE_OUTPUT_FNAME := test-norm-rules.json |
| 33 | + |
| 34 | +# Built output files |
| 35 | +BUILT_NORM_TAGS := $(BUILD_DIR)/$(NORM_TAGS_OUTPUT_FNAME) |
| 36 | +BUILT_NORM_RULES := $(BUILD_DIR)/$(NORM_RULE_OUTPUT_FNAME) |
| 37 | + |
| 38 | +# Copies of expected output files. |
| 39 | +# Use make target "update-expected" to update from build dir contents. |
| 40 | +EXPECTED_NORM_TAGS := $(NORM_RULE_EXPECTED_DIR)/$(NORM_TAGS_OUTPUT_FNAME) |
| 41 | +EXPECTED_NORM_RULES := $(NORM_RULE_EXPECTED_DIR)/$(NORM_RULE_OUTPUT_FNAME) |
| 42 | + |
| 43 | +# All normative rule definition input YAML files |
| 44 | +NORM_RULE_DEF_FILES := $(wildcard $(NORM_RULE_DEF_DIR)/*.yaml) |
| 45 | + |
| 46 | +# Add -t to each normative tag input filename and add prefix of "/" to make into absolute pathname. |
| 47 | +NORM_TAG_FILE_ARGS := $(foreach relative_pname,$(BUILT_NORM_TAGS),-t /$(relative_pname)) |
| 48 | + |
| 49 | +# Add -d to each normative rule definition filename |
| 50 | +NORM_RULE_DEF_ARGS := $(foreach relative_pname,$(NORM_RULE_DEF_FILES),-d $(relative_pname)) |
| 51 | + |
| 52 | +# Docker stuff |
| 53 | +DOCKER_BIN ?= docker |
| 54 | +SKIP_DOCKER ?= $(shell if command -v ${DOCKER_BIN} >/dev/null 2>&1 ; then echo false; else echo true; fi) |
| 55 | +DOCKER_IMG := riscvintl/riscv-docs-base-container-image:latest |
| 56 | +ifneq ($(SKIP_DOCKER),true) |
| 57 | + DOCKER_IS_PODMAN = \ |
| 58 | + $(shell ! ${DOCKER_BIN} -v | grep podman >/dev/null ; echo $$?) |
| 59 | + ifeq "$(DOCKER_IS_PODMAN)" "1" |
| 60 | + # Modify the SELinux label for the host directory to indicate |
| 61 | + # that it can be shared with multiple containers. This is apparently |
| 62 | + # only required for Podman, though it is also supported by Docker. |
| 63 | + DOCKER_VOL_SUFFIX = :z |
| 64 | + DOCKER_EXTRA_VOL_SUFFIX = ,z |
| 65 | + else |
| 66 | + DOCKER_IS_ROOTLESS = \ |
| 67 | + $(shell ! ${DOCKER_BIN} info -f '{{println .SecurityOptions}}' | grep rootless >/dev/null ; echo $$?) |
| 68 | + ifneq "$(DOCKER_IS_ROOTLESS)" "1" |
| 69 | + # Rooted Docker needs this flag so that the files it creates are |
| 70 | + # owned by the current user instead of root. Rootless docker does not |
| 71 | + # require it, and Podman doesn't either since it is always rootless. |
| 72 | + DOCKER_USER_ARG := --user $(shell id -u) |
| 73 | + endif |
| 74 | + endif |
| 75 | + |
| 76 | + DOCKER_CMD = \ |
| 77 | + ${DOCKER_BIN} run --rm \ |
| 78 | + -v ${PWD}/$@.workdir:/build${DOCKER_VOL_SUFFIX} \ |
| 79 | + -v ${PWD}/${CONVERTERS_DIR}:/${CONVERTERS_DIR}:ro${DOCKER_EXTRA_VOL_SUFFIX} \ |
| 80 | + -v ${PWD}/$(TOOLS_DIR):/$(TOOLS_DIR):ro${DOCKER_EXTRA_VOL_SUFFIX} \ |
| 81 | + -v ${PWD}/$(TESTS_DIR):/$(TESTS_DIR):ro${DOCKER_EXTRA_VOL_SUFFIX} \ |
| 82 | + -w /build \ |
| 83 | + $(DOCKER_USER_ARG) \ |
| 84 | + ${DOCKER_IMG} \ |
| 85 | + /bin/sh -c |
| 86 | + DOCKER_QUOTE := " |
| 87 | +else |
| 88 | + DOCKER_CMD = \ |
| 89 | + cd $@.workdir && |
| 90 | +endif |
| 91 | + |
| 92 | +WORKDIR_SETUP = \ |
| 93 | + rm -rf $@.workdir && \ |
| 94 | + mkdir -p $@.workdir && \ |
| 95 | + ln -sfn ../../converters ../../tools ../../tests $@.workdir/ |
| 96 | + |
| 97 | +WORKDIR_TEARDOWN = \ |
| 98 | + mv $@.workdir/$@ $@ && \ |
| 99 | + rm -rf $@.workdir |
| 100 | + |
| 101 | +ASCIIDOCTOR_TAGS := asciidoctor --backend tags --require=./$(CONVERTERS_DIR)/$(TAGS_BACKEND) |
| 102 | + |
| 103 | +OPTIONS := --trace \ |
| 104 | + -D build \ |
| 105 | + --failure-level=WARN |
| 106 | + |
| 107 | + |
| 108 | +# Default target |
| 109 | +.PHONY: all |
| 110 | +all: test |
| 111 | + |
| 112 | +# Build tests and compare against expected |
| 113 | +.PHONY: test |
| 114 | +test: build-tests compare-tests |
| 115 | + |
| 116 | +# Build tests |
| 117 | +.PHONY: build-tests build-test-tags build-test-norm-rules |
| 118 | +build-tests: build-test-tags build-test-norm-rules |
| 119 | +build-test-tags: $(BUILT_NORM_TAGS) |
| 120 | +build-test-norm-rules: $(BUILT_NORM_RULES) |
| 121 | + |
| 122 | +# Compare tests against expected |
| 123 | +.PHONY: compare-tests |
| 124 | +compare-tests: compare-test-tags compare-test-norm-rules |
| 125 | + |
| 126 | +compare-test-tags: $(EXPECTED_NORM_TAGS) $(BUILT_NORM_TAGS) |
| 127 | + @echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| 128 | + @echo Comparing $(EXPECTED_NORM_TAGS) to $(BUILT_NORM_TAGS) |
| 129 | + @echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| 130 | + diff $(EXPECTED_NORM_TAGS) $(BUILT_NORM_TAGS) |
| 131 | + |
| 132 | +compare-test-norm-rules: $(EXPECTED_NORM_RULES) $(BUILT_NORM_RULES) |
| 133 | + @echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| 134 | + @echo Comparing $(EXPECTED_NORM_RULES) to $(BUILT_NORM_RULES) |
| 135 | + @echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| 136 | + diff $(EXPECTED_NORM_RULES) $(BUILT_NORM_RULES) |
| 137 | + |
| 138 | +# Update expected files from built files |
| 139 | +.PHONY: update-expected |
| 140 | +update-expected: update-test-tags update-test-norm-rules |
| 141 | + |
| 142 | +update-test-tags: $(BUILT_NORM_TAGS) |
| 143 | + cp -f $(BUILT_NORM_TAGS) $(EXPECTED_NORM_TAGS) |
| 144 | + |
| 145 | +update-test-norm-rules: $(BUILT_NORM_RULES) |
| 146 | + cp -f $(BUILT_NORM_RULES) $(EXPECTED_NORM_RULES) |
| 147 | + |
| 148 | +# Build normative tags |
| 149 | +$(BUILT_NORM_TAGS): $(NORM_RULE_TESTS_DIR)/$(TEST_ADOC_INPUT_FNAME) $(CONVERTERS_DIR)/$(TAGS_BACKEND) |
| 150 | + $(WORKDIR_SETUP) |
| 151 | + $(DOCKER_CMD) $(DOCKER_QUOTE) $(ASCIIDOCTOR_TAGS) $(OPTIONS) -a tags-match-prefix='norm:' -a tags-output-suffix='-norm-tags.json' $< $(DOCKER_QUOTE) |
| 152 | + $(WORKDIR_TEARDOWN) |
| 153 | + |
| 154 | +# Build normative rules |
| 155 | +$(BUILT_NORM_RULES): $(BUILT_NORM_TAGS) $(NORM_RULE_DEF_FILES) |
| 156 | + $(WORKDIR_SETUP) |
| 157 | + cp -f $(BUILT_NORM_TAGS) $@.workdir |
| 158 | + mkdir -p $@.workdir/build |
| 159 | + $(DOCKER_CMD) $(DOCKER_QUOTE) ruby $(TOOLS_DIR)/$(CREATE_NORM_RULE_TOOL) $(NORM_TAG_FILE_ARGS) $(NORM_RULE_DEF_ARGS) $@ $(DOCKER_QUOTE) |
| 160 | + $(WORKDIR_TEARDOWN) |
| 161 | + |
| 162 | +# Update docker image to latest |
| 163 | +docker-pull-latest: |
| 164 | + ${DOCKER_BIN} pull ${DOCKER_IMG} |
| 165 | + |
| 166 | +clean: |
| 167 | + @echo "Cleaning up generated files..." |
| 168 | + rm -rf $(BUILD_DIR) |
| 169 | + @echo "Cleanup completed." |
0 commit comments