diff --git a/appveyor.yml b/appveyor.yml index c6a5a91ba..85b1a999d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,6 +6,8 @@ platform: x64 environment: APPVEYOR_SAVE_CACHE_ON_ERROR: true cache: C:\tools\vcpkg\installed\ +init: +- cmd: set PATH=C:\Python36-x64;%PATH% before_build: - ps: >- $packages = @( @@ -28,6 +30,7 @@ before_build: git -C C:\Tools\vcpkg pull # This is a temporary fix, can be removed after appveyor update its image to include Microsoft/vcpkg#4046 Invoke-Expression -Command "vcpkg install $all_packages" +- cmd: python build_msvc\msvc-autogen.py build: project: build_msvc\bitcoin.sln parallel: true diff --git a/build_msvc/.gitignore b/build_msvc/.gitignore index fbcd1077b..d5aa22c05 100644 --- a/build_msvc/.gitignore +++ b/build_msvc/.gitignore @@ -8,3 +8,4 @@ packages/* */Release */x64 *.vcxproj.user +*.vcxproj diff --git a/build_msvc/README.md b/build_msvc/README.md index 6de464e92..5fb08df8d 100644 --- a/build_msvc/README.md +++ b/build_msvc/README.md @@ -47,4 +47,10 @@ The instructions below use vcpkg to install the dependencies. leveldb:x64-windows-static ``` +- Use Python to generate *.vcxproj from Makefile + +``` + PS >python msvc-autogen.py +``` + - Build in Visual Studio. \ No newline at end of file diff --git a/build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj b/build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj.in similarity index 99% rename from build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj rename to build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj.in index 623d24da1..b7265054f 100644 --- a/build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj +++ b/build_msvc/libbitcoin_cli/libbitcoin_cli.vcxproj.in @@ -20,7 +20,7 @@ - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_common/libbitcoin_common.vcxproj b/build_msvc/libbitcoin_common/libbitcoin_common.vcxproj.in similarity index 82% rename from build_msvc/libbitcoin_common/libbitcoin_common.vcxproj rename to build_msvc/libbitcoin_common/libbitcoin_common.vcxproj.in index e6d95ed5f..42145c15a 100644 --- a/build_msvc/libbitcoin_common/libbitcoin_common.vcxproj +++ b/build_msvc/libbitcoin_common/libbitcoin_common.vcxproj.in @@ -165,43 +165,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj b/build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj.in similarity index 88% rename from build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj rename to build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj.in index 50519d045..a05125723 100644 --- a/build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj +++ b/build_msvc/libbitcoin_crypto/libbitcoin_crypto.vcxproj.in @@ -151,25 +151,7 @@ - - - - - - - - - - - - - - - - - - - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_server/libbitcoin_server.vcxproj b/build_msvc/libbitcoin_server/libbitcoin_server.vcxproj.in similarity index 80% rename from build_msvc/libbitcoin_server/libbitcoin_server.vcxproj rename to build_msvc/libbitcoin_server/libbitcoin_server.vcxproj.in index 9d4ac1a7f..0a165d0b7 100644 --- a/build_msvc/libbitcoin_server/libbitcoin_server.vcxproj +++ b/build_msvc/libbitcoin_server/libbitcoin_server.vcxproj.in @@ -154,53 +154,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - $(IntDir)\netrpc.obj $(IntDir)\netrpc.obj $(IntDir)\netrpc.obj $(IntDir)\netrpc.obj - - - - - - - - - - - - - - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_util/libbitcoin_util.vcxproj b/build_msvc/libbitcoin_util/libbitcoin_util.vcxproj.in similarity index 90% rename from build_msvc/libbitcoin_util/libbitcoin_util.vcxproj rename to build_msvc/libbitcoin_util/libbitcoin_util.vcxproj.in index 9e960682e..dc17c98e9 100644 --- a/build_msvc/libbitcoin_util/libbitcoin_util.vcxproj +++ b/build_msvc/libbitcoin_util/libbitcoin_util.vcxproj.in @@ -174,23 +174,7 @@ - - - - - - - - - - - - - - - - - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj b/build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj.in similarity index 92% rename from build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj rename to build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj.in index 64f3e1628..1bb7be6f7 100644 --- a/build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj +++ b/build_msvc/libbitcoin_wallet/libbitcoin_wallet.vcxproj.in @@ -20,18 +20,7 @@ - - - - - - - - - - - - +@SOURCE_FILES@ diff --git a/build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj b/build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj.in similarity index 97% rename from build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj rename to build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj.in index d7fbdd94b..e396c1ad0 100644 --- a/build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj +++ b/build_msvc/libbitcoin_zmq/libbitcoin_zmq.vcxproj.in @@ -20,10 +20,7 @@ - - - - +@SOURCE_FILES@ diff --git a/build_msvc/msvc-autogen.py b/build_msvc/msvc-autogen.py new file mode 100644 index 000000000..8888487e7 --- /dev/null +++ b/build_msvc/msvc-autogen.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +import os +import re + +SOURCE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) + +libs = [ + 'libbitcoin_cli', + 'libbitcoin_common', + 'libbitcoin_crypto', + 'libbitcoin_server', + 'libbitcoin_util', + 'libbitcoin_wallet', + 'libbitcoin_zmq', +] + +ignore_list = [ + 'rpc/net.cpp', + 'interfaces/handler.cpp', + 'interfaces/node.cpp', + 'interfaces/wallet.cpp', +] + +lib_sources = {} + + +def parse_makefile(makefile): + with open(makefile, 'r', encoding='utf-8') as file: + current_lib = '' + for line in file.read().splitlines(): + if current_lib: + source = line.split()[0] + if source.endswith('.cpp') and not source.startswith('$') and source not in ignore_list: + lib_sources[current_lib].append(source.replace('/', '\\')) + if not line.endswith('\\'): + current_lib = '' + continue + for lib in libs: + _lib = lib.replace('-', '_') + if re.search(_lib + '.*_SOURCES \\= \\\\', line): + current_lib = lib + lib_sources[current_lib] = [] + break + + +def main(): + for makefile_name in os.listdir(SOURCE_DIR): + if 'Makefile' in makefile_name: + parse_makefile(os.path.join(SOURCE_DIR, makefile_name)) + for key, value in lib_sources.items(): + vcxproj_filename = os.path.abspath(os.path.join(os.path.dirname(__file__), key, key + '.vcxproj')) + content = '' + for source_filename in value: + content += ' \n' + with open(vcxproj_filename + '.in', 'r', encoding='utf-8') as vcxproj_in_file: + with open(vcxproj_filename, 'w', encoding='utf-8') as vcxproj_file: + vcxproj_file.write(vcxproj_in_file.read().replace( + '@SOURCE_FILES@\n', content)) + + +if __name__ == '__main__': + main()