mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-11-14 11:48:45 +00:00
A first-run check for a freshly cloned repo, so a new user finds out what is missing before a build fails halfway through. Checks the host toolchain (GNU make, gcc/g++, pkg-config, git, gcc >= 8 for Qt6), the arm-none-eabi toolchain plus a linkable ARM C library, the required client libraries (readline, bz2, lz4, libcrypto) and the optional ones, the bundled-fallback ones, a Python venv with tools/requirements.txt, and on Linux the dialout/uucp membership, the udev blacklist rule, ModemManager and the rights on /dev/ttyACM*. Also the tracked .dummy files that hold the firmware object directories in git, since nothing recreates those. Detection is by probe, not by querying the package manager: pkg-config where a .pc file exists, otherwise a real compile-and-link of the header with its -l flag. Python requirements are compared offline through importlib.metadata. The device side is covered too: it resolves PLATFORM and PLATFORM_EXTRAS the way make does, rejects unknown platforms and the combinations Makefile.hal errors on later (BWM off PM5, BTADDON on PM5, ...), and when there is no Makefile.platform at all it lists the platforms and offers to write one for the device the user picks, rather than silently building an RDV4 image. It changes nothing by default. It asks before creating a venv and before writing a Makefile.platform, and only --install touches the package manager. Missing items are mapped to package names for apt, pacman, dnf, zypper, brew and port and printed as one paste-ready line; NixOS is pointed at tools/shell.nix. make configure runs it. The script stays directly callable because make stops on an invalid PLATFORM before it could run any target. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
451 lines
21 KiB
Makefile
451 lines
21 KiB
Makefile
#-----------------------------------------------------------------------------
|
|
# Copyright (C) Proxmark3 contributors. See AUTHORS.md for details.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# See LICENSE.txt for the text of the license.
|
|
#-----------------------------------------------------------------------------
|
|
|
|
PLATFORM_FILE ?= Makefile.platform
|
|
-include $(PLATFORM_FILE)
|
|
-include .Makefile.options.cache
|
|
include Makefile.defs
|
|
include common_arm/Makefile.hal
|
|
|
|
# preserve relative DESTDIR path for subdir makes
|
|
ifneq (,$(DESTDIR))
|
|
# realpath needs the directory to exist
|
|
$(shell $(MKDIR) $(DESTDIR))
|
|
MYDESTDIR:=$(realpath $(DESTDIR))
|
|
ifeq (,$(MYDESTDIR))
|
|
$(error Can't create $(DESTDIR))
|
|
endif
|
|
endif
|
|
|
|
define submake
|
|
$(MAKE) $(1)/$(2) || exit 1;
|
|
endef
|
|
|
|
# hitag2crack toolsuite is not yet integrated in "all", it must be called explicitly: "make hitag2crack"
|
|
HOST_TARGETS := client mfc_card_only mfc_card_reader mfd_aes_brute mfulc_des_brute fpga_compress cryptorf
|
|
TARGETS := bootrom armsrc recovery $(HOST_TARGETS)
|
|
all clean install uninstall check: %:
|
|
+$(foreach target,$(TARGETS),$(call submake,$(target),$*))
|
|
|
|
# client runtime leftovers, written to the directory the client was started in
|
|
clean: clean-runtime
|
|
clean-runtime:
|
|
$(Q)$(RM) hardnested_stats.txt
|
|
|
|
host: host/all
|
|
host/all host/clean host/install host/uninstall host/check: %:
|
|
+$(foreach target,$(HOST_TARGETS),$(call submake,$(target),$(notdir $*)))
|
|
|
|
INSTALLTOOLS=mfc/pm3_eml2lower.sh mfc/pm3_eml2upper.sh mfc/pm3_mfdread.py mfc/pm3_mfd2eml.py mfc/pm3_eml2mfd.py pm3_amii_bin2eml.pl pm3_reblay-emulating.py pm3_reblay-reading.py
|
|
INSTALLSIMFW=sim011.bin sim011.sha512.txt sim013.bin sim013.sha512.txt sim020.bin sim020.sha512.txt
|
|
INSTALLSCRIPTS=pm3 pm3-flash pm3-flash-all pm3-flash-bootrom pm3-flash-fullimage
|
|
INSTALLSHARES=tools/jtag_openocd traces
|
|
INSTALLDOCS=doc/*.md doc/md
|
|
|
|
install: common/install
|
|
|
|
common/install:
|
|
$(info [@] Installing common resources to $(MYDESTDIR)$(PREFIX)...)
|
|
ifneq (,$(INSTALLSCRIPTS))
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLBINRELPATH)
|
|
$(Q)$(INSTALLSUDO) $(CP) $(INSTALLSCRIPTS) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLBINRELPATH)
|
|
endif
|
|
ifneq (,$(INSTALLSHARES))
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH)
|
|
$(Q)$(INSTALLSUDO) $(CP) $(INSTALLSHARES) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH)
|
|
endif
|
|
ifneq (,$(INSTALLDOCS))
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)
|
|
$(Q)$(INSTALLSUDO) $(CP) $(INSTALLDOCS) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)
|
|
endif
|
|
ifneq (,$(INSTALLTOOLS))
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)
|
|
$(Q)$(INSTALLSUDO) $(CP) $(foreach tool,$(INSTALLTOOLS),tools/$(tool)) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)
|
|
endif
|
|
ifneq (,$(INSTALLSIMFW))
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)
|
|
$(Q)$(INSTALLSUDO) $(CP) $(foreach fw,$(INSTALLSIMFW),client/resources/$(fw)) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)
|
|
endif
|
|
ifeq ($(platform),Linux)
|
|
$(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(UDEV_PREFIX)
|
|
# If user is running ArchLinux, use group 'uucp'
|
|
# Else, use group 'dialout'
|
|
ifneq ($(wildcard /etc/arch-release),)
|
|
$(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules
|
|
else
|
|
$(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules
|
|
endif
|
|
endif
|
|
|
|
uninstall: common/uninstall
|
|
|
|
common/uninstall:
|
|
$(info [@] Uninstalling common resources from $(MYDESTDIR)$(PREFIX)...)
|
|
ifneq (,$(INSTALLSCRIPTS))
|
|
$(Q)$(INSTALLSUDO) $(RM) $(foreach script,$(INSTALLSCRIPTS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLBINRELPATH)$(PATHSEP)$(notdir $(script)))
|
|
endif
|
|
|
|
ifneq (,$(INSTALLSHARES))
|
|
$(Q)$(INSTALLSUDO) $(RMDIR) $(foreach share,$(INSTALLSHARES),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH)$(PATHSEP)$(notdir $(share)))
|
|
endif
|
|
|
|
ifneq (,$(INSTALLDOCS))
|
|
$(Q)$(INSTALLSUDO) $(RMDIR) $(foreach doc,$(INSTALLDOCS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)$(PATHSEP)$(notdir $(doc)))
|
|
$(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)
|
|
endif
|
|
|
|
ifneq (,$(INSTALLTOOLS))
|
|
$(Q)$(INSTALLSUDO) $(RM) $(foreach tool,$(INSTALLTOOLS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)$(PATHSEP)$(notdir $(tool)))
|
|
endif
|
|
|
|
$(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)
|
|
|
|
ifneq (,$(INSTALLSIMFW))
|
|
$(Q)$(INSTALLSUDO) $(RM) $(foreach fw,$(INSTALLSIMFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw)))
|
|
endif
|
|
|
|
$(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)
|
|
|
|
ifeq ($(platform),Linux)
|
|
$(Q)$(INSTALLSUDO) $(RM) $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules
|
|
endif
|
|
$(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH)
|
|
|
|
# tests
|
|
cryptorf/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
mfc_card_only/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) nonce2key staticnested $(patsubst %/check,%,$@)
|
|
mfc_card_reader/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) mfkey mf_nonce_brute $(patsubst %/check,%,$@)
|
|
mfd_aes_brute/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
mfulc_des_brute/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
fpga_compress/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
bootrom/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
armsrc/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
client/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
recovery/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
hitag2crack/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
common/check: FORCE
|
|
$(info [*] CHECK $(patsubst %/check,%,$@))
|
|
$(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@)
|
|
|
|
cryptorf/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/cryptorf $(patsubst cryptorf/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
mfc_card_only/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/mfc/card_only $(patsubst mfc_card_only/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
mfc_card_reader/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/mfc/card_reader $(patsubst mfc_card_reader/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
mfulc_des_brute/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/mfulc_des_brute $(patsubst mfulc_des_brute/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
mfd_aes_brute/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/mfd_aes_brute $(patsubst mfd_aes_brute/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
fpga_compress/%: FORCE cleanifplatformchanged
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/fpga_compress $(patsubst fpga_compress/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
bootrom/%: FORCE cleanifplatformchanged
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C bootrom $(patsubst bootrom/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
armsrc/%: FORCE cleanifplatformchanged fpga_compress/%
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C armsrc $(patsubst armsrc/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
client/%: FORCE cleanifplatformchanged
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C client $(patsubst client/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
recovery/all: bootrom/all armsrc/all
|
|
recovery/install: bootrom/install armsrc/install
|
|
recovery/%: FORCE cleanifplatformchanged
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
hitag2crack/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/hitag2crack $(patsubst hitag2crack/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
hitag2crack/clean: FORCE hitag2crack/_clean_pycache
|
|
hitag2crack/_clean_pycache:
|
|
find . -type d -name __pycache__ -exec rm -rfv \{\} +
|
|
ePassport/%: FORCE
|
|
$(info [*] MAKE $@)
|
|
$(Q)$(MAKE) --no-print-directory -C tools/ePassport $(patsubst ePassport/%,%,$@) DESTDIR=$(MYDESTDIR)
|
|
|
|
FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites)
|
|
|
|
.PHONY: all host clean install uninstall help _test bootrom fullimage recovery client mfc_card_only mfc_card_reader mfulc_des_brute mfd_aes_brute hitag2crack ePassport style miscchecks release FORCE udev accessrights cleanifplatformchanged clean-runtime configure
|
|
|
|
help:
|
|
@echo "Multi-OS Makefile"
|
|
@echo
|
|
@echo "Possible targets:"
|
|
@echo "+ all - Make all targets: bootrom, fullimage and OS-specific host tools"
|
|
@echo "+ host - Make all OS-specific host tools"
|
|
@echo "+ clean - Clean in all targets"
|
|
@echo "+ .../clean - Clean in specified target and its deps, e.g. bootrom/clean"
|
|
@echo "+ (un)install - Install/uninstall Proxmark files in the system, default to /usr/local/share,"
|
|
@echo " else provide a PREFIX. See Maintainers.md for more options"
|
|
@echo
|
|
@echo "+ bootrom - Make bootrom"
|
|
@echo "+ fullimage - Make armsrc fullimage (includes fpga)"
|
|
@echo "+ recovery - Make bootrom and fullimage files for JTAG flashing"
|
|
@echo
|
|
@echo "+ client - Make only the OS-specific host client"
|
|
@echo "+ cryptorf - Make tools/cryptorf"
|
|
@echo "+ mfc_card_only - Make tools/mfc/card_only"
|
|
@echo "+ mfc_card_reader - Make tools/mfc/card_reader"
|
|
@echo "+ mfulc_des_brute - Make tools/mfulc_des_brute"
|
|
@echo "+ mfd_aes_brute - Make tools/mfd_aes_brute"
|
|
@echo "+ hitag2crack - Make tools/hitag2crack"
|
|
@echo "+ fpga_compress - Make tools/fpga_compress"
|
|
@echo
|
|
@echo "+ style - Apply some automated source code formatting rules"
|
|
@echo "+ commands - Regenerate commands documentation files (doc/commands.md, doc/commands.json)"
|
|
@echo "+ check - Run offline tests. Set CHECKARGS to pass arguments to the test script"
|
|
@echo "+ .../check - Run offline tests against specific target. See above."
|
|
@echo "+ miscchecks - Detect various encoding issues in source code"
|
|
@echo
|
|
@echo "+ configure - Check this machine can build the project. Run it after cloning."
|
|
@echo " Set CONFIGUREARGS to pass arguments, e.g. CONFIGUREARGS=--install"
|
|
@echo "+ udev - Sets udev rules on *nix"
|
|
@echo "+ accessrights - Ensure user belongs to correct group on *nix"
|
|
@echo
|
|
@echo "To see possible platforms. default is PM3RDV4"
|
|
@echo " make PLATFORM="
|
|
@echo
|
|
@echo "For verbose mode"
|
|
@echo " make V=1"
|
|
@echo
|
|
|
|
client: client/all
|
|
|
|
bootrom: bootrom/all
|
|
|
|
# aliases fullimage = armsrc
|
|
|
|
fullimage: armsrc/all
|
|
|
|
fullimage/all: armsrc/all
|
|
|
|
fullimage/clean: armsrc/clean
|
|
|
|
fullimage/install: armsrc/install
|
|
|
|
fullimage/uninstall: armsrc/uninstall
|
|
|
|
recovery: recovery/all
|
|
|
|
cryptorf: cryptorf/all
|
|
|
|
mfc_card_only: mfc_card_only/all
|
|
|
|
mfc_card_reader: mfc_card_reader/all
|
|
|
|
mfulc_des_brute: mfulc_des_brute/all
|
|
|
|
mfd_aes_brute: mfd_aes_brute/all
|
|
|
|
fpga_compress: fpga_compress/all
|
|
|
|
hitag2crack: hitag2crack/all
|
|
|
|
newtarbin:
|
|
$(RM) proxmark3-$(platform)-bin.tar proxmark3-$(platform)-bin.tar.gz
|
|
@touch proxmark3-$(platform)-bin.tar
|
|
|
|
tarbin: newtarbin client/tarbin armsrc/tarbin bootrom/tarbin
|
|
$(info GEN proxmark3-$(platform)-bin.tar)
|
|
$(Q)$(GZIP) proxmark3-$(platform)-bin.tar
|
|
|
|
# detect if there were changes in the platform definitions, requiring a clean
|
|
cleanifplatformchanged:
|
|
ifeq ($(PLATFORM_CHANGED),true)
|
|
$(info [!] Platform definitions changed, cleaning bootrom/armsrc/recovery first...)
|
|
$(Q)$(MAKE) --no-print-directory -C bootrom clean
|
|
$(Q)$(MAKE) --no-print-directory -C armsrc clean
|
|
$(Q)$(MAKE) --no-print-directory -C recovery clean
|
|
$(Q)$(MAKE) --no-print-directory -C tools/fpga_compress clean
|
|
# clean the client only if PLATFORM got changed from or to PM3ICOPYX
|
|
ifeq (PM3ICOPYX,$(filter PM3ICOPYX, $(PLATFORM) $(CACHED_PLATFORM)))
|
|
$(Q)$(MAKE) --no-print-directory -C client clean
|
|
endif
|
|
$(Q)$(ECHO) CACHED_PLATFORM=$(PLATFORM) > .Makefile.options.cache
|
|
$(Q)$(ECHO) CACHED_PLATFORM_EXTRAS=$(PLATFORM_EXTRAS) >> .Makefile.options.cache
|
|
$(Q)$(ECHO) CACHED_PLATFORM_DEFS=$(PLATFORM_DEFS) >> .Makefile.options.cache
|
|
endif
|
|
|
|
# first-run check of the build environment: toolchains, client libraries,
|
|
# Python venv and requirements, chosen PLATFORM, device access rights.
|
|
# Set CONFIGUREARGS to pass arguments, e.g. CONFIGUREARGS=--install
|
|
configure: FORCE
|
|
$(Q)$(BASH) configure_environment.sh $(CONFIGUREARGS)
|
|
|
|
# configure system to ignore PM3 device as a modem (ModemManager blacklist, effective *only* if ModemManager is not using _strict_ policy)
|
|
# Read doc/md/ModemManager-Must-Be-Discarded.md for more info
|
|
udev:
|
|
ifneq ($(wildcard /etc/arch-release),)
|
|
# If user is running ArchLinux, use group 'uucp'
|
|
$(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules
|
|
else
|
|
# Else, use group 'dialout'
|
|
$(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules
|
|
endif
|
|
$(SUDO) udevadm control --reload-rules
|
|
$(SUDO) udevadm trigger --action=change
|
|
|
|
# configure system to add user to the dialout group and if bluetooth group exists, add user to it
|
|
# you need to logout, relogin to get this access right correct.
|
|
# Finally, you might need to run the proxmark3 client under SUDO on some systems
|
|
accessrights:
|
|
ifneq ($(wildcard /etc/arch-release),)
|
|
#If user is running ArchLinux, use specific command and group
|
|
$(Q)$(SUDO) $(USERMOD) uucp $(USER)
|
|
$(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(USERMOD) bluetooth $(USER) || true
|
|
else ifneq ($(wildcard /etc/fedora-release),)
|
|
# If the user is running Fedora, use `usermod` with the dialout group
|
|
$(Q)$(SUDO) $(USERMOD) dialout $(USER)
|
|
$(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(USERMOD) bluetooth $(USER) || true
|
|
else
|
|
$(Q)$(SUDO) $(ADDUSER) $(USER) dialout
|
|
$(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(ADDUSER) $(USER) bluetooth || true
|
|
endif
|
|
|
|
# easy printing of MAKE VARIABLES
|
|
print-%: ; @echo $* = $($*)
|
|
|
|
style: commands
|
|
# Make sure astyle is installed
|
|
@command -v astyle >/dev/null || ( echo "Please install 'astyle' package first" ; exit 1 )
|
|
# Remove spaces & tabs at EOL, add LF at EOF if needed on *.c, *.h, *.cpp. *.lua, *.py, *.pl, Makefile, *.v, pm3
|
|
find . \( -not -path "./cov-int/*" -and -not -path "./fpga*/xst/*" -and -not -path "./venv*" -and \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" -or \( -name "pm3" -and -type f \) \) \) \
|
|
-exec perl -pi -e 's/[ \t]+$$//' {} \; \
|
|
-exec sh -c "tail -c1 {} | xxd -p | tail -1 | grep -q -v 0a$$" \; \
|
|
-exec sh -c "echo >> {}" \;
|
|
# Apply astyle on *.c, *.h,
|
|
find . \( -not -path "./cov-int/*" -and -not -path "./venv*" -and -name "*.[ch]" -and -not -name "ui_overlays.h" \) -exec astyle --formatted --mode=c --suffix=none \
|
|
--indent=spaces=4 --indent-switches \
|
|
--keep-one-line-blocks --max-continuation-indent=60 \
|
|
--style=google --pad-oper --unpad-paren --pad-header \
|
|
--align-pointer=name {} \;
|
|
# Apply astyle on *.cpp, *.hpp: no pad-oper as it can cause issues with templates
|
|
find . \( -not -path "./cov-int/*" -and -not -path "./venv*" -and -name "*.cpp" -and -not -name "*.moc.cpp" \) -exec astyle --formatted --mode=c --suffix=none \
|
|
--indent=spaces=4 --indent-switches \
|
|
--keep-one-line-blocks --max-continuation-indent=60 \
|
|
--style=google --unpad-paren --pad-header \
|
|
--align-pointer=name {} \;
|
|
|
|
COMMANDS_UTF8_FILTER := cat
|
|
COMMANDS_PYTHON := $(PYTHON3)
|
|
ifdef IS_MINGW
|
|
COMMANDS_UTF8_FILTER := iconv -f CP850 -t UTF-8
|
|
COMMANDS_PYTHON := PYTHONIOENCODING=utf-8 $(PYTHON3)
|
|
endif
|
|
|
|
commands: client
|
|
# Update commands.md
|
|
[ -x client/proxmark3 ] && client/proxmark3 -m | $(COMMANDS_UTF8_FILTER) | tr -d '\r' > doc/commands.md
|
|
# Make sure python3 is installed
|
|
@command -v $(PYTHON3) >/dev/null || ( echo "Please install '$(PYTHON3)' package first" ; exit 1 )
|
|
# Update commands.json, patch port in case it was run under Windows
|
|
[ -x client/proxmark3 ] && client/proxmark3 --fulltext | $(COMMANDS_UTF8_FILTER) | sed 's#com[0-9]#/dev/ttyACM0#'|$(COMMANDS_PYTHON) client/pyscripts/pm3_help2json.py - - | tr -d '\r' > doc/commands.json
|
|
|
|
|
|
# Detecting weird codepages and tabs.
|
|
ifeq ($(platform),Darwin)
|
|
miscchecks: TABSCMD=egrep -l '\t' {}
|
|
else
|
|
miscchecks: TABSCMD=grep -lP '\t' {}
|
|
endif
|
|
ifneq (,$(EDIT))
|
|
miscchecks: TABSCMD+= && vi {} -c ':set tabstop=4' -c ':set et|retab' -c ':wq'
|
|
endif
|
|
miscchecks:
|
|
# Make sure recode is installed
|
|
@command -v recode >/dev/null || ( echo "Please install 'recode' package first" ; exit 1 )
|
|
@echo "Files with suspicious chars:"
|
|
@find . \( -not -path "./cov-int/*" -and -not -path "./client/deps/*" -and -not -path "./venv*" -and \( -name "*.[ch]" -or -name "*.cpp" -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" -or \( -name "pm3" -and -type f \) \) \) \
|
|
-exec sh -c "cat {} |recode utf8.. >/dev/null || echo {}" \;
|
|
ifneq (,$(EDIT))
|
|
@echo "Files with tabs: (EDIT enabled, files will be rewritten!)"
|
|
else
|
|
@echo "Files with tabs: (rerun with EDIT=1 if you want to convert them with vim)"
|
|
endif
|
|
# to remove tabs within lines, one can try with: vi $file -c ':set tabstop=4' -c ':set et|retab' -c ':wq'
|
|
@find . \( -not -path "./cov-int/*" -and -not -path "./client/deps/*" -and -not -path "./venv*" -and -not -wholename "./client/src/pm3_*wrap.c" -and \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" -or \( -name "pm3" -and -type f \) \) \) \
|
|
-exec sh -c "$(TABSCMD)" \;
|
|
# @echo "Files with printf \\\\t:"
|
|
# @find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \
|
|
# -exec grep -lP '\\t' {} \;
|
|
|
|
release: VERSION="v4.$(shell git log --oneline master | wc -l)"
|
|
release:
|
|
$(if $(findstring master,$(shell git rev-parse --abbrev-ref HEAD)),,$(error "!!! you are not on master branch, aborting"))
|
|
$(if $(findstring dirty,$(shell git describe --dirty --always)),$(error "!!! you have pending changes, aborting"))
|
|
$(if $(RELEASE_NAME),,$(error "!!! missing RELEASE_NAME, aborting"))
|
|
# Preparing a commit for release tagging, to be reverted after tagging.
|
|
@echo "# - Release Tag: $(VERSION)"
|
|
@echo "# - Release Name: $(RELEASE_NAME)"
|
|
# - Removing -Werror...
|
|
@find . \( -path "./Makefile.defs" -or -path "./client/Makefile" -or -path "./common_arm/Makefile.common" -or -path "./tools/hitag2crack/*/Makefile" -or -path "./client/deps/*/Makefile" \) -exec sed -i 's/ -Werror//' {} \;
|
|
@find . \( -path "./client/deps/*.cmake" -or -path "./client/CMakeLists.txt" -or -path "./client/experimental_lib/CMakeLists.txt" \) -exec sed -i 's/ -Werror//' {} \;
|
|
# - Changing banner...
|
|
@sed -i "s/^#define BANNERMSG2 .*/#define BANNERMSG2 /" client/src/proxmark3.c
|
|
@sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \" Release... $(VERSION) - $(RELEASE_NAME)\"/" client/src/proxmark3.c
|
|
@echo -n "# ";grep "^#define BANNERMSG2" client/src/proxmark3.c
|
|
@echo -n "# ";grep "^#define BANNERMSG3" client/src/proxmark3.c
|
|
# - Committing temporarily...
|
|
@git commit -a -m "Release $(VERSION) - $(RELEASE_NAME)"
|
|
# - Tagging temporarily...
|
|
@git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION)
|
|
# - Changing default version information based on new tag
|
|
@$(SH) tools/mkversion.sh --force common/default_version_pm3.c
|
|
# - Removing mkversion calls
|
|
@sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile
|
|
@sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt client/experimental_lib/CMakeLists.txt
|
|
# - Deleting tag...
|
|
@git tag -d $(VERSION)
|
|
# - Amending commit...
|
|
@git commit -a --amend -m "Release $(VERSION) - $(RELEASE_NAME)"
|
|
# - Tagging again...
|
|
@git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION)
|
|
# - Reverting tagged commit...
|
|
@git revert --no-edit HEAD
|
|
@echo "==================================================================="
|
|
@echo "Done! You can now execute 'git push && git push origin $(VERSION)'"
|
|
|
|
# Dummy target to test for GNU make availability
|
|
_test:
|