2021-08-17 00:44:49 +00:00
# Copyright (c) 2018-2021 Status Research & Development GmbH. Licensed under
2019-08-20 21:14:45 +00:00
# either of:
# - Apache License, version 2.0
# - MIT license
# at your option. This file may not be copied, modified, or distributed except
# according to those terms.
2020-06-22 14:44:45 +00:00
.PHONY : \
sanity-checks \
2020-12-02 21:35:05 +00:00
warn-update \
warn-jobs \
2020-06-22 14:44:45 +00:00
deps-common \
build-nim \
2021-11-22 16:26:51 +00:00
update-test \
2020-06-22 14:44:45 +00:00
update-common \
2021-02-24 16:35:35 +00:00
$( NIM_BINARY) \
2020-06-22 14:44:45 +00:00
update-remote \
nat-libs \
libminiupnpc.a \
libnatpmp.a \
2020-10-06 22:31:30 +00:00
clean-cross \
2020-06-22 14:44:45 +00:00
clean-common \
mrproper \
github-ssh \
status \
ntags \
ctags \
show-deps \
fetch-dlls
2019-08-20 21:14:45 +00:00
#- when the special ".SILENT" target is present, all recipes are silenced as if they all had a "@" prefix
#- by setting SILENT_TARGET_PREFIX to a non-empty value, the name of this target becomes meaningless to `make`
#- idea stolen from http://make.mad-scientist.net/managing-recipe-echoing/
$(SILENT_TARGET_PREFIX).SILENT :
# dir
build :
2020-05-22 13:31:19 +00:00
mkdir -p $@
2019-08-20 21:14:45 +00:00
sanity-checks :
which $( CC) & >/dev/null || { echo " C compiler ( $( CC) ) not installed. Aborting. " ; exit 1; }
2020-12-02 21:35:05 +00:00
#- check if "make update" was executed
warn-update :
if [ [ -e $( UPDATE_TIMESTAMP) ] ] ; then \
if [ [ $$ ( cat $( UPDATE_TIMESTAMP) ) -ne $$ ( $( GET_CURRENT_COMMIT_TIMESTAMP) ) ] ] ; then \
2021-01-29 12:16:23 +00:00
echo -e " \nWarning: to ensure you are building in a supported repo state, please always run \" $$ (basename " $( MAKE) ") update\" after \"git pull\"\n(it looks like you've forgotten to do this).\nThis also applies whenever you switch to a new branch or commit, e.g.: whenever you run \"git checkout ...\".\n" ; \
2020-12-02 21:35:05 +00:00
fi ; \
fi
#- check if we're enabling multiple jobs - https://stackoverflow.com/a/48865939
warn-jobs :
+ if [ [ ! " ${ MAKEFLAGS } " = ~ --jobserver[ ^= ] += ] ] ; then \
NPROC = $$ ( $( NPROC_CMD) ) ; \
if [ [ $$ { NPROC} -gt 1 ] ] ; then \
echo -e " \nTip of the day: this will probably build faster if you use \" $$ (basename " $( MAKE) " ) -j $$ {NPROC} ...\".\n " ; \
fi ; \
fi
2022-10-14 20:37:13 +00:00
nimbus-build-system-paths :
echo "Creating nimbus-build-system.paths" ; \
2022-10-14 21:21:53 +00:00
TOP_LEVEL_DIR = " $( CURDIR) " " $( CURDIR) / $( BUILD_SYSTEM_DIR) /scripts/create_nbs_paths.sh "
2022-10-14 20:37:13 +00:00
2020-12-02 21:35:05 +00:00
deps-common : | sanity -checks warn -update warn -jobs $( NIMBLE_DIR )
2020-04-15 16:25:36 +00:00
# - don't build our Nim target if it's not going to be used
i f e q ( $( USE_SYSTEM_NIM ) , 0 )
deps-common : $( NIM_BINARY )
e n d i f
2019-08-20 21:14:45 +00:00
#- conditionally re-builds the Nim compiler (not usually needed, because `make update` calls this rule; delete $(NIM_BINARY) to force it)
#- allows parallel building with the '+' prefix
2021-11-22 17:13:01 +00:00
#- handles the case where NIM_COMMIT was previously used to build a non-default compiler
2019-08-20 21:14:45 +00:00
#- forces a rebuild of csources, Nimble and a complete compiler rebuild, in case we're called after pulling a new Nim version
#- uses our Git submodules for csources and Nimble (Git doesn't let us place them in another submodule)
#- build_all.sh looks at the parent dir to decide whether to copy the resulting csources binary there,
# but this is broken when using symlinks, so build csources separately (we get parallel compiling as a bonus)
#- Windows is a special case, as usual
#- macOS is also a special case, with its "ln" not supporting "-r"
2020-11-22 16:09:28 +00:00
#- the AppVeyor 32-bit build is done on a 64-bit image, so we need to override the architecture detection with ARCH_OVERRIDE
2019-08-20 21:14:45 +00:00
build-nim : | sanity -checks
2021-11-22 17:13:01 +00:00
+ if [ [ -z " $( NIM_COMMIT) " ] ] ; then git submodule update --init --recursive " $( BUILD_SYSTEM_DIR) " ; fi ; \
NIM_BUILD_MSG = " $( BUILD_MSG) Nim compiler " \
2019-08-20 21:14:45 +00:00
V = $( V) \
CC = $( CC) \
2020-09-03 12:01:32 +00:00
MAKE = " $( MAKE) " \
2019-08-20 21:14:45 +00:00
ARCH_OVERRIDE = $( ARCH_OVERRIDE) \
2020-12-26 15:04:58 +00:00
QUICK_AND_DIRTY_COMPILER = $( QUICK_AND_DIRTY_COMPILER) \
remove `Nim-csources-v1` and `nimble` checkouts (#75)
When `build_nim.sh` detects that `skipIntegrityCheck` is supported,
it runs the upstream toolchain for building Nim, ignoring the locally
checked out `Nim-csources-v1` and `nimble` sub-repositories. So, having
those repos checked out is not useful in that scenario.
When `skipIntegrityCheck` is unsupported, `build_nim.sh` uses the local
sub-repositories if they are available. But, it also clones them if they
are unavailable using commits as specified by environment variables.
Because the clone will happen as part of the script, having the repos
linked as sub-repositories is also not useful. Even worse, if the script
has different commit hashes than the subrepository, the behaviour is
different depending on whether `build_nim.sh` is run before or after
the submodules are checked out.
Therefore, we can remove the `Nim-csources-v1` and `nimble` sub-repos,
using the upstream build system if available, or the hardcoded commits
inside `build_nim.sh` to have a manual build, as before.
Also moves the various variables that control the used versions into
the manual section to emphasize that these only take effect in manual
mode, but not when using upstream build system (`skipIntegrityCheck`).
If one wants to use a custom `Nimble` version, fork `Nim` and adjust the
config in that fork. That also works with the upstream build system.
2024-01-15 15:21:06 +00:00
" $( CURDIR) / $( BUILD_SYSTEM_DIR) /scripts/build_nim.sh " " $( NIM_DIR) " ../Nim-csources ../nimble " $( CI_CACHE) "
2019-08-20 21:14:45 +00:00
2021-11-22 16:26:51 +00:00
# Check if the update might cause loss of work. Abort, if so, while allowing an override mechanism.
update-test :
2022-01-19 20:44:33 +00:00
TEE_TO_TTY = "cat" ; if bash -c ": >/dev/tty" & >/dev/null; then TEE_TO_TTY = "tee /dev/tty" ; fi ; \
2021-11-22 16:26:51 +00:00
COMMAND = "git status --short --untracked-files=no --ignore-submodules=untracked" ; \
2021-11-30 11:52:33 +00:00
LINES = $$ ( { $$ { COMMAND} | grep 'vendor' && echo ^---top level || true; git submodule foreach --recursive --quiet " $$ {COMMAND} | grep . && echo ^---\$ $name || true " ; } | $$ { TEE_TO_TTY} | wc -l) ; \
2022-01-26 14:20:55 +00:00
if [ [ " $$ {LINES} " -ne "0" && " $( OVERRIDE) " != "1" ] ] ; then echo -e "\nYou have uncommitted local changes which might be overwritten by the update. Aborting.\nIf you know better, you can use the 'update' target instead of 'update-dev'.\n" ; exit 1; fi
2021-11-22 16:26:51 +00:00
2020-05-20 19:02:05 +00:00
#- for each submodule, delete checked out files (that might prevent a fresh checkout); skip dotfiles
2019-09-07 20:03:48 +00:00
#- in case of submodule URL changes, propagates that change in the parent repo's .git directory
2019-11-22 14:53:20 +00:00
#- initialises and updates the Git submodules
2020-05-20 18:00:17 +00:00
#- hard-resets the working copies of submodules
2020-09-20 13:13:10 +00:00
#- deletes "nimcache" directories
2020-12-02 21:35:05 +00:00
#- updates ".update.timestamp"
2020-05-15 12:25:17 +00:00
#- deletes the ".nimble" dir and executes the "deps" target
2019-08-20 21:14:45 +00:00
#- allows parallel building with the '+' prefix
#- rebuilds the Nim compiler if the corresponding submodule is updated
2023-02-23 15:12:35 +00:00
update-common : | sanity -checks update -test
2020-05-20 19:02:05 +00:00
git submodule foreach --quiet 'git ls-files --exclude-standard --recurse-submodules -z -- ":!:.*" | xargs -0 rm -rf'
2023-09-18 15:16:15 +00:00
git $( GIT_SUBMODULE_CONFIG) submodule update --init --recursive || true
2019-11-18 08:16:20 +00:00
# changing URLs in a submodule's submodule means we have to sync and update twice
git submodule sync --quiet --recursive
2023-09-18 15:16:15 +00:00
git $( GIT_SUBMODULE_CONFIG) submodule update --init --recursive
git submodule foreach --quiet --recursive 'git $(GIT_SUBMODULE_CONFIG) reset --quiet --hard'
2020-09-20 13:13:10 +00:00
find . -type d -name nimcache -print0 | xargs -0 rm -rf
2020-12-02 21:35:05 +00:00
$( GET_CURRENT_COMMIT_TIMESTAMP) > $( UPDATE_TIMESTAMP)
2019-08-20 21:14:45 +00:00
rm -rf $( NIMBLE_DIR)
2021-02-24 16:35:35 +00:00
+ " $( MAKE) " --no-print-directory deps-common
2019-08-20 21:14:45 +00:00
2022-01-26 14:20:55 +00:00
# supposed to be used by developers, instead of "update", to avoid losing submodule work
update-dev :
+ " $( MAKE) " OVERRIDE = 0 update
2020-04-15 16:25:36 +00:00
#- rebuilds the Nim compiler if the corresponding submodule is updated
$(NIM_BINARY) : | sanity -checks
2020-09-03 12:01:32 +00:00
+ " $( MAKE) " --no-print-directory build-nim
2020-04-15 16:25:36 +00:00
2019-08-20 22:17:02 +00:00
# don't use this target, or you risk updating dependency repos that are not ready to be used in Nimbus
update-remote :
git submodule update --remote
2019-08-20 21:14:45 +00:00
nat-libs : | libminiupnpc .a libnatpmp .a
2019-09-04 17:13:28 +00:00
libminiupnpc.a : | sanity -checks
2019-08-20 21:14:45 +00:00
i f e q ( $( OS ) , W i n d o w s _ N T )
+ [ -e vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/$@ ] || \
2024-03-27 08:44:06 +00:00
PATH = " .; $$ {PATH} " " $( MAKE) " -C vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc -f Makefile.mingw CC = $( CC) $@ $( HANDLE_OUTPUT)
2019-08-20 21:14:45 +00:00
e l s e
2022-10-04 16:21:45 +00:00
+ " $( MAKE) " -C vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc build/$@ $( HANDLE_OUTPUT)
2019-08-20 21:14:45 +00:00
e n d i f
2019-09-04 17:13:28 +00:00
libnatpmp.a : | sanity -checks
2019-08-20 21:14:45 +00:00
i f e q ( $( OS ) , W i n d o w s _ N T )
2023-09-13 01:27:46 +00:00
+ " $( MAKE) " -C vendor/nim-nat-traversal/vendor/libnatpmp-upstream OS = mingw CC = $( CC) CFLAGS = " -Wall -Wno-cpp -Os -DWIN32 -DNATPMP_STATICLIB -DENABLE_STRNATPMPERR -DNATPMP_MAX_RETRIES=4 $( CFLAGS) " $@ $( HANDLE_OUTPUT)
2019-08-20 21:14:45 +00:00
e l s e
2021-11-05 11:17:30 +00:00
+ " $( MAKE) " CFLAGS = " -Wall -Wno-cpp -Os -DENABLE_STRNATPMPERR -DNATPMP_MAX_RETRIES=4 $( CFLAGS) " -C vendor/nim-nat-traversal/vendor/libnatpmp-upstream $@ $( HANDLE_OUTPUT)
2019-08-20 21:14:45 +00:00
e n d i f
#- depends on Git submodules being initialised
#- fakes a Nimble package repository with the minimum info needed by the Nim compiler
# for runtime path (i.e.: the second line in $(NIMBLE_DIR)/pkgs/*/*.nimble-link)
2020-04-15 16:25:36 +00:00
$(NIMBLE_DIR) :
2019-08-20 21:14:45 +00:00
mkdir -p $( NIMBLE_DIR) /pkgs
2022-01-19 23:44:30 +00:00
NIMBLE_DIR = " $( CURDIR) / $( NIMBLE_DIR) " PWD_CMD = " $( PWD) " EXCLUDED_NIM_PACKAGES = " $( EXCLUDED_NIM_PACKAGES) " \
2024-03-26 18:36:14 +00:00
git submodule foreach --recursive --quiet '"$(CURDIR)/$(BUILD_SYSTEM_DIR)/scripts/create_nimble_link.sh" "$$sm_path"'
2019-08-20 21:14:45 +00:00
2020-10-06 22:31:30 +00:00
clean-cross :
2022-06-16 05:45:48 +00:00
+ [ [ -e vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc ] ] && " $( MAKE) " -C vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc CC = $( CC) clean $( HANDLE_OUTPUT) || true
2021-11-23 00:16:27 +00:00
+ [ [ -e vendor/nim-nat-traversal/vendor/libnatpmp-upstream ] ] && " $( MAKE) " -C vendor/nim-nat-traversal/vendor/libnatpmp-upstream CC = $( CC) clean $( HANDLE_OUTPUT) || true
2020-10-06 22:31:30 +00:00
clean-common : clean -cross
2021-03-02 17:03:30 +00:00
rm -rf build/{ *.exe,*.so,*.so.0} $( NIMBLE_DIR) $( NIM_BINARY) $( NIM_DIR) /bin/{ timestamp,last_built_commit,nim_commit_*} $( NIM_DIR) /nimcache nimcache
2019-08-20 21:14:45 +00:00
# dangerous cleaning, because you may have not-yet-pushed branches and commits in those vendor repos you're about to delete
mrproper : clean
rm -rf vendor
# for when you want to use SSH keys with GitHub
github-ssh :
git config url."git@github.com:" .insteadOf "https://github.com/"
git submodule foreach --recursive 'git config url."git@github.com:".insteadOf "https://github.com/"'
# runs `git status` in all Git repos
status : | $( REPOS )
$( eval CMD := $( GIT_STATUS) )
$( RUN_CMD_IN_ALL_REPOS)
# https://bitbucket.org/nimcontrib/ntags/ - currently fails with "out of memory"
ntags :
ntags -R .
#- a few files need to be excluded because they trigger an infinite loop in https://github.com/universal-ctags/ctags
#- limiting it to Nim files, because there are a lot of C files we don't care about
ctags :
ctags -R --verbose= yes \
--langdef= nim \
--langmap= nim:.nim \
--regex-nim= '/(\w+)\*?\s*=\s*object/\1/c,class/' \
--regex-nim= '/(\w+)\*?\s*=\s*enum/\1/e,enum/' \
--regex-nim= '/(\w+)\*?\s*=\s*tuple/\1/t,tuple/' \
--regex-nim= '/(\w+)\*?\s*=\s*range/\1/s,subrange/' \
--regex-nim= '/(\w+)\*?\s*=\s*proc/\1/p,proctype/' \
--regex-nim= '/proc\s+(\w+)/\1/f,procedure/' \
--regex-nim= '/func\s+(\w+)/\1/f,procedure/' \
--regex-nim= '/method\s+(\w+)/\1/m,method/' \
--regex-nim= '/proc\s+`([^`]+)`/\1/o,operator/' \
--regex-nim= '/template\s+(\w+)/\1/u,template/' \
--regex-nim= '/macro\s+(\w+)/\1/v,macro/' \
--languages= nim \
--exclude= nimcache \
--exclude= '*/Nim/tinyc' \
--exclude= '*/Nim/tests' \
--exclude= '*/Nim/csources' \
--exclude= nimbus/genesis_alloc.nim \
--exclude= $( REPOS_DIR) /nim-bncurve/tests/tvectors.nim \
.
2020-07-16 19:02:06 +00:00
# list all Git submodule URLs and commit hashes, including the nested ones
2020-05-20 16:42:30 +00:00
show-deps :
2020-07-16 19:02:06 +00:00
{ " $( CURDIR) / $( BUILD_SYSTEM_DIR) /scripts/git_show_deps.sh " ; \
git submodule foreach --quiet --recursive " $( CURDIR) / $( BUILD_SYSTEM_DIR) /scripts/git_show_deps.sh " ; } \
| sort -u
2020-05-20 16:42:30 +00:00
2019-08-20 21:14:45 +00:00
############################
# Windows-specific section #
############################
i f e q ( $( OS ) , W i n d o w s _ N T )
# no tabs allowed for indentation here
2020-11-22 16:09:28 +00:00
# the AppVeyor 32-bit build is done on a 64-bit image, so we need to override the architecture detection
2019-08-20 21:14:45 +00:00
ifeq ( $( ARCH_OVERRIDE) , x86)
ARCH := x86
else
ifeq ( $( PROCESSOR_ARCHITEW6432) , AMD64)
ARCH := x64
else
ifeq ( $( PROCESSOR_ARCHITECTURE) , AMD64)
ARCH := x64
endif
ifeq ( $( PROCESSOR_ARCHITECTURE) , x86)
ARCH := x86
endif
endif
endif
ifeq ( $( ARCH) , x86)
ROCKSDB_DIR := x86
endif
ifeq ( $( ARCH) , x64)
ROCKSDB_DIR := x64
endif
ROCKSDB_ARCHIVE := nimbus-deps.zip
ROCKSDB_URL := https://github.com/status-im/nimbus-deps/releases/download/nimbus-deps/$( ROCKSDB_ARCHIVE)
CURL := curl -O -L
UNZIP := unzip -o
#- back to tabs
#- copied from .appveyor.yml
#- this is why we can't delete the whole "build" dir in the "clean" target
2019-08-20 23:33:01 +00:00
fetch-dlls : | build
2019-08-20 21:14:45 +00:00
cd build && \
$( CURL) $( ROCKSDB_URL) && \
$( CURL) https://nim-lang.org/download/dlls.zip && \
$( UNZIP) $( ROCKSDB_ARCHIVE) && \
cp -a $( ROCKSDB_DIR) /*.dll . && \
2019-08-20 21:47:27 +00:00
$( UNZIP) dlls.zip
2019-08-20 21:14:45 +00:00
e n d i f