|  | # Copyright (C) 2017-2020  The Project X-Ray Authors. | 
|  | # | 
|  | # Use of this source code is governed by a ISC-style | 
|  | # license that can be found in the LICENSE file or at | 
|  | # https://opensource.org/licenses/ISC | 
|  | # | 
|  | # SPDX-License-Identifier: ISC | 
|  | SHELL = bash | 
|  | ALL_EXCLUDE = third_party .git env build docs/env | 
|  |  | 
|  | INSTALL_DIR ?= | 
|  |  | 
|  | # Skip this check if the ALLOW_ROOT var is defined | 
|  | # E.g. when running in GH action custom runners CI | 
|  | ifndef ALLOW_ROOT | 
|  | # Check if root | 
|  | ifeq ($(shell id -u),0) | 
|  | $(error ERROR: Running as ID 0) | 
|  | endif | 
|  | endif | 
|  |  | 
|  | # Tools + Environment | 
|  | IN_ENV = if [ -e env/bin/activate ]; then . env/bin/activate; fi; source utils/environment.python.sh; | 
|  | env: | 
|  | python3 -mvenv env | 
|  | # Install project dependencies | 
|  | $(IN_ENV) python -mpip install -r requirements.txt | 
|  | # Install project's documentation dependencies | 
|  | $(IN_ENV) python -mpip install -r docs/requirements.txt | 
|  | # Check that prjxray are available | 
|  | $(IN_ENV) python -c "import prjxray" | 
|  | # Check fasm library was installed | 
|  | $(IN_ENV) python -c "import fasm" | 
|  | $(IN_ENV) python -c "import fasm.output" | 
|  | # Check sdfparse lib was installed | 
|  | $(IN_ENV) python -c "import sdf_timing" | 
|  | $(IN_ENV) python -c "import sdf_timing.sdfparse" | 
|  | # Check YAML is installed | 
|  | $(IN_ENV) python -c "import yaml" || (echo "Unable to find python-yaml" && exit 1) | 
|  |  | 
|  | build: | 
|  | git submodule update --init --recursive | 
|  | mkdir -p build | 
|  | cd build; cmake ..; $(MAKE) | 
|  |  | 
|  | install: | 
|  | cd build; $(MAKE) DESTDIR=${INSTALL_DIR} install | 
|  |  | 
|  | .PHONY: env build | 
|  |  | 
|  | # Run tests of code. | 
|  | # ------------------------ | 
|  | TEST_EXCLUDE = $(foreach x,$(ALL_EXCLUDE) docs fuzzers minitests experiments,--ignore $(x)) | 
|  |  | 
|  | test: test-py test-cpp test-tools | 
|  | @true | 
|  |  | 
|  | test-py: | 
|  | $(IN_ENV) which py.test; py.test $(TEST_EXCLUDE) --doctest-modules --junitxml=build/py_test_results.xml | 
|  |  | 
|  | test-cpp: | 
|  | mkdir -p build | 
|  | cd build && cmake -DPRJXRAY_BUILD_TESTING=ON .. | 
|  | cd build && $(MAKE) -s | 
|  | cd build && ctest --no-compress-output -T Test -C RelWithDebInfo --output-on-failure | 
|  | xsltproc .github/ctest2junit.xsl build/Testing/*/Test.xml > build/cpp_test_results.xml | 
|  |  | 
|  | test-tools: | 
|  | $(MAKE) -f Makefile.tools_tests | 
|  |  | 
|  | .PHONY: test test-py test-cpp test-tools | 
|  |  | 
|  | # Run HTML test | 
|  | # ------------------------ | 
|  |  | 
|  | test-htmlgen: | 
|  | cd htmlgen && source htmlgen.sh | 
|  |  | 
|  | .PHONY: test-htmlgen | 
|  |  | 
|  | # Auto formatting of code. | 
|  | # ------------------------ | 
|  | FORMAT_EXCLUDE = $(foreach x,$(ALL_EXCLUDE),-and -not -path './$(x)/*') -and -not -name *.bit -and -not -name *.tar.gz | 
|  |  | 
|  | CLANG_FORMAT ?= clang-format-5.0 | 
|  | format-cpp: | 
|  | find . -name \*.cc $(FORMAT_EXCLUDE) -print0 | xargs -0 -P $$(nproc) ${CLANG_FORMAT} -style=file -i | 
|  | find . -name \*.h $(FORMAT_EXCLUDE) -print0 | xargs -0 -P $$(nproc) ${CLANG_FORMAT} -style=file -i | 
|  |  | 
|  | format-docs: | 
|  | ./.github/scripts/update-contributing.py | 
|  |  | 
|  | PYTHON_FORMAT ?= yapf | 
|  | format-py: | 
|  | $(IN_ENV) find . -name \*.py $(FORMAT_EXCLUDE) -print0 | xargs -0 -P $$(nproc) yapf -p -i | 
|  |  | 
|  | TCL_FORMAT ?= utils//tcl-reformat.sh | 
|  | format-tcl: | 
|  | find . -name \*.tcl $(FORMAT_EXCLUDE) -print0 | xargs -0 -P $$(nproc) -n 1 $(TCL_FORMAT) | 
|  |  | 
|  | # Command to find and replace trailing whitespace in-place using `sed` (This is | 
|  | # placed inside quotes later so need to escape the "'") | 
|  | WS_CMD = sed -i '\''s@\s\+$$@@g'\'' | 
|  |  | 
|  | # File filter for files to fix trailing whitespace in, this is just a couple of | 
|  | # chained bash conditionals ensuring that the file (indicated by {}, provided by | 
|  | # xargs later) is a file, and not a directory or link.  Also filters out .bit | 
|  | # files as these are the only binary files currently tracked by Git and we don't | 
|  | # want to inadvertently change these at all. | 
|  | WS_FILTER = [ -f {} -a ! -L {} ] && [[ {} != *.bit ]] && [[ {} != *.tar.gz ]] | 
|  |  | 
|  | # For every file piped to $(WS_FORMAT) apply the filter and perform the command, | 
|  | # if a file does not match the filter, just returns true. | 
|  | WS_FORMAT = xargs -P $$(nproc) -n 1 -I{} bash -c '$(WS_FILTER) && $(WS_CMD) {} || true' | 
|  |  | 
|  | format-trailing-ws: | 
|  | # Use `git ls-files` to give us a complete list of tracked files to fix | 
|  | # whitespace in; there is no point spending time processing anything that is | 
|  | # not known to Git. | 
|  | git ls-files | $(WS_FORMAT) | 
|  |  | 
|  | # Additionally fix untracked (but not ignored) files. | 
|  | git ls-files -o --exclude-standard | $(WS_FORMAT) | 
|  |  | 
|  | format: format-cpp format-docs format-py format-tcl format-trailing-ws | 
|  | @true | 
|  |  | 
|  | .PHONY: format format-cpp format-py format-tcl format-trailing-ws | 
|  |  | 
|  | check-license: | 
|  | @./.github/scripts/check_license.sh | 
|  | @./.github/scripts/check_python_scripts.sh | 
|  |  | 
|  | .PHONY: check-license | 
|  |  | 
|  | # Targets related to Project X-Ray databases | 
|  | # ------------------------ | 
|  |  | 
|  | DATABASES=artix7 kintex7 zynq7 spartan7 | 
|  |  | 
|  | define database | 
|  |  | 
|  | # $(1) - Database name | 
|  |  | 
|  | db-prepare-$(1): | 
|  | @echo | 
|  | @echo "Preparing $(1) files" | 
|  | @echo "============================" | 
|  | @mkdir -p database/$(1)/mapping | 
|  | @cp settings/$(1)/devices.yaml database/$(1)/mapping/ | 
|  | @+SKIP_ENV=true source settings/$(1).sh && $(IN_ENV) ./utils/update_parts.py $(1) | 
|  | @+SKIP_ENV=true source settings/$(1).sh && $(IN_ENV) ./utils/update_resources.py $(1) | 
|  |  | 
|  | db-$(1): | 
|  | +source settings/$(1).sh && $$(MAKE) -C fuzzers | 
|  | +source settings/$(1).sh && $(IN_ENV) ./utils/roi_all.py | 
|  |  | 
|  | db-check-$(1): | 
|  | @echo | 
|  | @echo "Checking $(1) database" | 
|  | @echo "============================" | 
|  | @$(IN_ENV) python3 utils/checkdb.py | 
|  |  | 
|  | db-format-$(1): | 
|  | @echo | 
|  | @echo "Formatting $(1) database" | 
|  | @echo "============================" | 
|  | @$(IN_ENV) cd database/$(1); python3 ../../utils/sort_db.py | 
|  | @if [ -e database/Info.md ]; then $(IN_ENV) ./utils/info_md.py --keep; fi | 
|  |  | 
|  | .PHONY: db-prepare-$(1) db-$(1) db-check-$(1) db-format-$(1) db-extras-$(1) db-extras-$(1)-parts db-extra-$(1)-roi db-extras-$(1)-harness | 
|  |  | 
|  | db-extras-$(1): db-extras-$(1)-parts db-extras-$(1)-roi db-extras-$(1)-harness | 
|  |  | 
|  | db-$(1)-all: db-$(1) db-extras-$(1)-parts | 
|  | # Build harnesses after database is complete | 
|  | $$(MAKE) db-extras-$(1)-roi | 
|  | $$(MAKE) db-extras-$(1)-harness | 
|  |  | 
|  | db-check: db-check-$(1) | 
|  | db-format: db-format-$(1) | 
|  |  | 
|  | endef | 
|  |  | 
|  | $(foreach DB,$(DATABASES),$(eval $(call database,$(DB)))) | 
|  |  | 
|  | # Targets related to Project X-Ray parts | 
|  | # -------------------------------------- | 
|  |  | 
|  | ARTIX_PARTS=artix7_50t artix7_200t | 
|  | ZYNQ_PARTS=zynq7010 | 
|  | KINTEX_PARTS=kintex7_160t | 
|  | SPARTAN_PARTS= | 
|  |  | 
|  | XRAY_PARTS=${ARTIX_PARTS} ${ZYNQ_PARTS} ${KINTEX_PARTS} ${SPARTAN_PARTS} | 
|  |  | 
|  | define multiple-parts | 
|  |  | 
|  | # $(1): PART to be used | 
|  |  | 
|  | db-part-only-$(1): | 
|  | +source settings/$(1).sh && $$(MAKE) -C fuzzers part_only | 
|  |  | 
|  | db-roi-only-$(1): | 
|  | +source settings/$(1).sh && $(IN_ENV) ./utils/roi_all.py | 
|  |  | 
|  | endef | 
|  |  | 
|  | $(foreach PART,$(XRAY_PARTS),$(eval $(call multiple-parts,$(PART)))) | 
|  |  | 
|  |  | 
|  | db-extras-artix7-parts: $(addprefix db-part-only-,$(ARTIX_PARTS)) | 
|  |  | 
|  | db-extras-artix7-roi: $(addprefix db-roi-only-,$(ARTIX_PARTS)) | 
|  |  | 
|  | # This explicitly sources each settings script as needed so that | 
|  | #   you don't need to worry about manually sourcing the right script before making. | 
|  | # Some of these commands handle additional parts/packages that are *not* fully bonded. | 
|  | # For any pin defined in settings/*.sh that is *not* bonded in this part/package, | 
|  | #    override the XRAY_PIN_0X setting below to pick a pin that *is* bonded. | 
|  | db-extras-artix7-harness: | 
|  | +source minitests/roi_harness/basys3-swbut.sh && $(MAKE) -C fuzzers roi_only | 
|  | +source minitests/roi_harness/arty-uart.sh && $(MAKE) -C fuzzers roi_only | 
|  | +source minitests/roi_harness/basys3-swbut.sh && \ | 
|  | $(MAKE) -C minitests/roi_harness \ | 
|  | HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/basys3/swbut copy | 
|  | +source minitests/roi_harness/basys3-swbut.sh && \ | 
|  | $(MAKE) -C minitests/roi_harness \ | 
|  | XRAY_ROIV=../roi_base_div2.v \ | 
|  | HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/basys3/swbut_50 copy | 
|  | +source minitests/roi_harness/arty-uart.sh && \ | 
|  | $(MAKE) -C minitests/roi_harness \ | 
|  | HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/arty-a7/uart copy | 
|  | +source minitests/roi_harness/arty-pmod.sh && \ | 
|  | $(MAKE) -C minitests/roi_harness \ | 
|  | HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/arty-a7/pmod copy | 
|  | +source minitests/roi_harness/arty-swbut.sh && \ | 
|  | $(MAKE) -C minitests/roi_harness \ | 
|  | HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/arty-a7/swbut copy | 
|  |  | 
|  | db-extras-kintex7-parts: $(addprefix db-part-only-,$(KINTEX_PARTS)) | 
|  |  | 
|  | db-extras-kintex7-roi: $(addprefix db-roi-only-,$(KINTEX_PARTS)) | 
|  |  | 
|  | db-extras-kintex7-harness: | 
|  | @true | 
|  |  | 
|  | db-extras-spartan7-parts: | 
|  | @true | 
|  |  | 
|  | db-extras-spartan7-roi: | 
|  | @true | 
|  |  | 
|  | db-extras-spartan7-harness: | 
|  | @true | 
|  |  | 
|  | db-extras-zynq7-parts: $(addprefix db-part-only-,$(ZYNQ_PARTS)) | 
|  |  | 
|  | db-extras-zynq7-roi: $(addprefix db-roi-only-,$(ZYNQ_PARTS)) | 
|  |  | 
|  | db-extras-zynq7-harness: | 
|  | @true | 
|  |  | 
|  | db-check: | 
|  | @true | 
|  |  | 
|  | db-format: | 
|  | @true | 
|  |  | 
|  | db-info: | 
|  | $(IN_ENV) ./utils/info_md.py | 
|  |  | 
|  | db-prepare-parts: $(addprefix db-prepare-,$(DATABASES)) | 
|  |  | 
|  | .PHONY: db-check db-format | 
|  |  | 
|  | clean: | 
|  | $(MAKE) -C database clean | 
|  | $(MAKE) -C fuzzers clean | 
|  | rm -rf build | 
|  |  | 
|  | .PHONY: clean |