Skip to content

Commit 9f64ee0

Browse files
authored
Add Windows build (#41)
1 parent 00578b0 commit 9f64ee0

File tree

9 files changed

+1902
-345
lines changed

9 files changed

+1902
-345
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ jobs:
2424
uses: actions/cache@v1
2525
with:
2626
path: ~/memgraph
27-
key: cache-memgraph-v2.0.1-docker-image
27+
key: cache-memgraph-v2.1.1-docker-image
2828
- name: Download Memgraph Docker image
2929
if: steps.cache-memgraph-docker.outputs.cache-hit != 'true'
3030
run: |
3131
mkdir ~/memgraph
32-
curl -L https://memgraph.com/download/memgraph/v2.0.1/docker/memgraph-2.0.1-docker.tar.gz > ~/memgraph/memgraph-docker.tar.gz
32+
curl -L https://memgraph.com/download/memgraph/v2.1.1/docker/memgraph-2.1.1-docker.tar.gz > ~/memgraph/memgraph-docker.tar.gz
3333
- name: Load Memgraph Docker image
3434
run: |
3535
docker load -i ~/memgraph/memgraph-docker.tar.gz

CMakeLists.txt

Lines changed: 37 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
cmake_minimum_required(VERSION 3.10)
22

3-
# NOTES
4-
#
5-
# HOW TO CHANGE THE COMPILER?
3+
#### NOTES:
4+
# * HOW TO CHANGE THE COMPILER?
65
# If you want to use specific compiler, consider using -C | --cc | --cxx cmake-js flags.
7-
#
8-
# WINDOWS AND MINGW ISSUES?
6+
# * WINDOWS AND MINGW ISSUES?
97
# cmake-js doesn't support MinGW Makefiles -> https://github.com/cmake-js/cmake-js/issues/195
108
# /DELAYLOAD:NODE.EXE: No such file or directory -> https://github.com/cmake-js/cmake-js/issues/200
119
# cmake-js adds /DELAYLOAD:NODE.EXE + there is not an easy solution -> Move to node-gyp
@@ -15,6 +13,13 @@ cmake_minimum_required(VERSION 3.10)
1513

1614
project(nodemgclient VERSION 0.1.0)
1715

16+
if (WIN32 AND MINGW)
17+
message(FATAL_ERROR "ON WINDOWS BUILD UNDER MINGW NOT YET POSSIBLE")
18+
elseif (APPLE)
19+
message(FATAL_ERROR "ON APPLE BUILD NOT YET POSSIBLE")
20+
endif()
21+
22+
include(ExternalProject)
1823
find_package(OpenSSL REQUIRED)
1924

2025
set(CMAKE_C_STANDARD 11)
@@ -31,60 +36,50 @@ add_library(project_warnings INTERFACE)
3136
include(cmake/CompilerWarnings.cmake)
3237
set_project_warnings(project_warnings)
3338

34-
include(ExternalProject)
35-
36-
if (WIN32 AND MINGW)
37-
message(FATAL_ERROR "ON WINDOWS BUILD UNDER MINGW NOT YES POSSIBLE")
38-
elseif (APPLE)
39-
message(FATAL_ERROR "ON APPLE BUILD NOT YET POSSIBLE")
40-
endif()
41-
42-
# Add mgclient as an imported library.
43-
ExternalProject_Add(mgclient-proj
44-
PREFIX mgclient
45-
GIT_REPOSITORY https://github.com/memgraph/mgclient.git
46-
GIT_TAG v1.3.0
47-
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
48-
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
49-
"-DBUILD_CPP_BINDINGS=ON"
50-
INSTALL_DIR "${PROJECT_BINARY_DIR}/mgclient")
51-
ExternalProject_Get_Property(mgclient-proj install_dir)
52-
set(MGCLIENT_ROOT ${install_dir})
53-
set(MGCLIENT_INCLUDE_DIRS ${MGCLIENT_ROOT}/include
54-
CACHE INTERNAL "Path to mgclient include directory")
39+
set(MGCLIENT_GIT_TAG "v1.3.0" CACHE STRING "mgclient git tag")
40+
set(MGCLIENT_LIBRARY mgclient-lib)
41+
set(MGCLIENT_INSTALL_DIR ${CMAKE_BINARY_DIR}/mgclient)
42+
set(MGCLIENT_INCLUDE_DIRS ${MGCLIENT_INSTALL_DIR}/include)
5543
if (UNIX AND NOT APPLE)
56-
set(MGCLIENT_LIBRARY_PATH ${MGCLIENT_ROOT}/lib/libmgclient.so)
57-
elseif (WIN32 AND MINGW)
58-
set(MGCLIENT_LIBRARY_PATH ${MGCLIENT_ROOT}/lib/libmgclient.dll)
44+
set(MGCLIENT_LIBRARY_PATH ${MGCLIENT_INSTALL_DIR}/lib/libmgclient.so)
45+
elseif (WIN32)
46+
set(MGCLIENT_LIBRARY_PATH ${MGCLIENT_INSTALL_DIR}/lib/mgclient.dll)
5947
endif()
60-
message(STATUS "MGCLIENT_LIBRARY_PATH: ${MGCLIENT_LIBRARY_PATH}")
61-
set(MGCLIENT_LIBRARY mgclient-lib)
48+
ExternalProject_Add(mgclient-proj
49+
PREFIX mgclient-proj
50+
GIT_REPOSITORY https://github.com/memgraph/mgclient.git
51+
GIT_TAG "${MGCLIENT_GIT_TAG}"
52+
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${MGCLIENT_INSTALL_DIR}"
53+
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
54+
"-DBUILD_CPP_BINDINGS=ON"
55+
"-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
56+
BUILD_BYPRODUCTS "${MGCLIENT_LIBRARY_PATH}"
57+
INSTALL_DIR "${PROJECT_BINARY_DIR}/mgclient"
58+
)
6259
add_library(${MGCLIENT_LIBRARY} SHARED IMPORTED)
60+
target_compile_definitions(${MGCLIENT_LIBRARY} INTERFACE mgclient_shared_EXPORTS)
6361
set_property(TARGET ${MGCLIENT_LIBRARY} PROPERTY IMPORTED_LOCATION ${MGCLIENT_LIBRARY_PATH})
64-
if (WIN32 AND MINGW)
65-
set_property(TARGET ${MGCLIENT_LIBRARY} PROPERTY IMPORTED_IMPLIB ${MGCLIENT_ROOT}/lib/libmgclient.dll.a)
62+
if (WIN32)
63+
set_property(TARGET ${MGCLIENT_LIBRARY} PROPERTY IMPORTED_IMPLIB ${MGCLIENT_INSTALL_DIR}/lib/mgclient.lib)
6664
endif()
6765
add_dependencies(${MGCLIENT_LIBRARY} mgclient-proj)
68-
message(STATUS "MGCLIENT_LIBRARY: ${MGCLIENT_LIBRARY}")
6966

7067
# Define the addon.
7168
include_directories(${CMAKE_JS_INC})
72-
set(SOURCE_FILES src/addon.cpp
73-
src/client.cpp
74-
src/glue.cpp)
69+
set(SOURCE_FILES src/addon.cpp src/client.cpp src/glue.cpp)
7570
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
71+
target_compile_definitions(${PROJECT_NAME} PRIVATE -Dmgclient_shared_EXPORTS)
7672
add_dependencies(${PROJECT_NAME} ${MGCLIENT_LIBRARY})
7773
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
78-
target_link_libraries(${PROJECT_NAME} PRIVATE
79-
${CMAKE_JS_LIB} ${MGCLIENT_LIBRARY}
80-
project_warnings project_options)
74+
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB} ${MGCLIENT_LIBRARY} project_warnings project_options)
75+
if (WIN32)
76+
target_link_libraries(${PROJECT_NAME} PRIVATE Ws2_32)
77+
endif()
8178
target_include_directories(${PROJECT_NAME} PRIVATE ${MGCLIENT_INCLUDE_DIRS})
82-
target_compile_options(${PROJECT_NAME} PRIVATE "")
8379
# C++ mgclient throws, which means this project has to enable exceptions. If at
8480
# any time we decide to disable exceptions with the combination of NAPI_THROW +
8581
# std::nullopt in case of an error, the code should work as is.
8682
add_definitions(-DNAPI_CPP_EXCEPTIONS)
87-
8883
# Include N-API wrappers.
8984
execute_process(COMMAND node -p "require('node-addon-api').include"
9085
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}

README.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010

1111
### Build from Source on Linux
1212

13-
To install `nodemgclient` from sources you will need (only Linux is tested at
14-
the moment):
13+
To install `nodemgclient` from source you will need:
1514

1615
* OpenSSL >= 1.0.2
1716
* A CMake >= 3.10
@@ -44,14 +43,25 @@ To test ([Docker](https://docs.docker.com/engine/install) is required) run:
4443
```bash
4544
npm run test
4645
```
46+
4747
### Build from Source on Windows
4848

49-
NOTE: Not yet possible under MinGW.
49+
#### Build on Windows using Visual Studio
50+
51+
Since `cmake-js` is used, compiling for Windows is very similar to compiling
52+
for Linux:
53+
54+
```bash
55+
npm ci
56+
npm run build:release
57+
```
5058

5159
If installing OpenSSL package from
5260
https://slproweb.com/products/Win32OpenSSL.html, make sure to use the full one
5361
because of the header files.
5462

63+
NOTE: Compilation doesn NOT work yet under MinGW.
64+
5565
## Implementation and Interface Notes
5666

5767
### Temporal Types

cmake/CompilerWarnings.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,16 @@ function(set_project_warnings project_name)
3636
-Wuseless-cast # warn if you perform a cast to the same type
3737
)
3838

39+
set(MSVC_WARNINGS "")
40+
3941
if (WARNINGS_AS_ERRORS)
4042
set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror)
4143
endif()
4244

4345
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
4446
set(PROJECT_WARNINGS ${CLANG_WARNINGS})
47+
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
48+
set(PROJECT_WARNINGS ${MSVC_WARNINGS})
4549
else()
4650
set(PROJECT_WARNINGS ${GCC_WARNINGS})
4751
endif()

0 commit comments

Comments
 (0)