Skip to content

Commit

Permalink
CI build for all platforms (#1)
Browse files Browse the repository at this point in the history
* Set up path without Julia.

* Use `runner.os`.

* Try to find dll.

* Set LD_LIBRARY_PATH on Windows.

* Use find_file on apple?

* NODE_PATH.

* -DCMAKE_INSTALL_PREFIX.

* Manually cmake.

* Install node-addon-api.

* Set NODE_PATH.

* find_library?

* Build on windows.

* Update build scirpts.

* Update build scirpts.

* Update build scirpts.

* Correct CMakeLists.txt.

* `else`.

* Install after build.

* Find dylib on mac.

* Build on Mac.

* Specify C++ 14.
  • Loading branch information
sunoru authored Sep 19, 2022
1 parent eaf6386 commit 0db0173
Show file tree
Hide file tree
Showing 33 changed files with 2,617 additions and 2,791 deletions.
59 changes: 26 additions & 33 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ on:
branches:
- main

env:
NODE_VERSION: 16.17.0

defaults:
run:
shell: bash
Expand All @@ -22,49 +25,39 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Checkout Julia
uses: julia-actions/setup-julia@v1
- name: Setup Node
uses: actions/setup-node@v3
with:
version: '1.7'
- name: Prepare Julia dependencies
run: |
NODE_PATH=`julia -e 'using Pkg;Pkg.add("libnode_jll");using libnode_jll;println(libnode_jll.artifact_dir)'`
echo "$NODE_PATH/bin" >> $GITHUB_PATH
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODE_PATH/lib" >> $GITHUB_ENV
echo "INSTALL_PREFIX=`pwd`/dist" >> $GITHUB_ENV
node-version: ${{ env.NODE_VERSION }}

- name: Download libnode
uses: dawidd6/action-download-artifact@v2
if: runner.os != 'Windows'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: build.yml
name: libnode-v${{ env.NODE_VERSION }}-${{ runner.os }}-x64
path: ./libnode
repo: sunoru/libnode

- name: Install Ninja
- name: Prepare envrionment
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install ninja-build
elif [ "$RUNNER_OS" == "Windows" ]; then
choco install ninja
else
brew install ninja
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/libnode/lib" >> $GITHUB_ENV
elif [ "$RUNNER_OS" == "macOS" ]; then
echo "NODEJS_LIBRARY=`pwd`/`echo libnode/lib/libnode.*.dylib`" >> $GITHUB_ENV
fi
echo "INSTALL_PREFIX=`pwd`/dist" >> $GITHUB_ENV
npm ci
- name: Get npm cache directory
id: npm-cache-dir
run: |
echo "::set-output name=dir::$(npm config get cache)"
- uses: actions/cache@v2
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install npm dependencies
run: npm ci
- name: Build libjlnode & jlnode_addon.node
run: |
npm run compile -- --CDCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -G "Ninja"
cmake --install ./build
npm run build -- --CDCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX --CDNODEJS_LIBRARY=$NODEJS_LIBRARY
cmake --install build
- uses: actions/upload-artifact@v2
with:
name: ${{ matrix.os }}-dist
name: ${{ runner.os }}-dist
path: ${{ env.INSTALL_PREFIX }}
27 changes: 15 additions & 12 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
*.swp
build/
cmake-build*/
/cmake
/installed

.idea/
node_modules/

/tmp/

.vscode/
*.swp
build/
cmake-build*/
/cmake
/installed
/dist

.idea/
node_modules/

/tmp/

.vscode/

/libnode/
2 changes: 1 addition & 1 deletion .npmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
scripts-prepend-node-path=true
scripts-prepend-node-path=true
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v16.14.0
v16.14.0
217 changes: 109 additions & 108 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,108 +1,109 @@
cmake_minimum_required(VERSION 3.1)

project(jlnode
VERSION 16.3.0
LANGUAGES CXX)

set(CMAKE_MACOSX_RPATH 1)
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
endif()

add_definitions(-DNAPI_VERSION=8)
add_definitions(-DNODE_ADDON_API_DISABLE_DEPRECATED=1)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
if(NOT NAPI_INC)
execute_process(
COMMAND ${NODE_PATH}node -p "require('path').resolve(require('node-addon-api').include_dir)"
OUTPUT_VARIABLE NAPI_INC
)
endif()
message(STATUS "NAPI_INC: ${NAPI_INC}")

file(READ ${CMAKE_JS_INC}/node_version.h NODEJS_VERSION_FILE)

string(REGEX MATCH "#define NODE_MODULE_VERSION ([0-9]+)" NODEJS_MODULE_VERSION_DEF ${NODEJS_VERSION_FILE})
string(REGEX MATCH "([0-9]+)$" NODEJS_MODULE_VERSION ${NODEJS_MODULE_VERSION_DEF})

set(NODEJS_LIBRARY_NAMES
libnode.so.${NODEJS_MODULE_VERSION}
libnode.${NODEJS_MODULE_VERSION}.dylib
libnode.${NODEJS_MODULE_VERSION}.dll
node.lib)

find_library(NODEJS_LIBRARY
NAMES ${NODEJS_LIBRARY_NAMES}
PATHS ENV LD_LIBRARY_PATH
REQUIRED)

message(STATUS "NODEJS_LIBRARY: ${NODEJS_LIBRARY}")

set(source_path "${CMAKE_CURRENT_SOURCE_DIR}/src/jlnode")

set(sources
${source_path}/module.cpp
${source_path}/utils.cpp
${source_path}/instance.cpp
${source_path}/externals.cpp
${source_path}/objects.cpp
${source_path}/arrays.cpp
${source_path}/functions.cpp
${source_path}/promises.cpp
${source_path}/threading.cpp
)
set(headers
${source_path}/utils.h
${source_path}/instance.h
${source_path}/externals.h
${source_path}/objects.h
${source_path}/arrays.h
${source_path}/functions.h
${source_path}/promises.h
${source_path}/threading.h
)

add_library(${PROJECT_NAME}
SHARED ${sources} ${headers}
${CMAKE_JS_SRC})

target_link_libraries(${PROJECT_NAME}
${CMAKE_JS_LIB}
${NODEJS_LIBRARY})

target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_JS_INC}
${NAPI_INC})

project(jlnode_addon
VERSION 16.3.0
LANGUAGES CXX)

set(addon_path "${CMAKE_CURRENT_SOURCE_DIR}/src/addon")
set(addon_sources
${addon_path}/addon.cpp
${addon_path}/init.cpp)
set(addon_headers
${addon_path}/init.h)

add_library(${PROJECT_NAME}
SHARED ${addon_sources} ${addon_headers}
${CMAKE_JS_SRC})

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")

target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_JS_INC}
${NAPI_INC})

target_link_libraries(${PROJECT_NAME}
${CMAKE_JS_LIB}
${NODEJS_LIBRARY})

install(TARGETS jlnode jlnode_addon
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION lib)
cmake_minimum_required(VERSION 3.1)

project(jlnode
VERSION 16.3.0
LANGUAGES CXX)

set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_CXX_STANDARD 14)
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
endif()

add_definitions(-DNAPI_VERSION=8)
add_definitions(-DNODE_ADDON_API_DISABLE_DEPRECATED=1)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
if(NOT NAPI_INC)
execute_process(
COMMAND ${NODE_PATH}node -p "require('path').resolve(require('node-addon-api').include_dir)"
OUTPUT_VARIABLE NAPI_INC
)
endif()
message(STATUS "NAPI_INC: ${NAPI_INC}")

file(READ ${CMAKE_JS_INC}/node_version.h NODEJS_VERSION_FILE)

string(REGEX MATCH "#define NODE_MODULE_VERSION ([0-9]+)" NODEJS_MODULE_VERSION_DEF ${NODEJS_VERSION_FILE})
string(REGEX MATCH "([0-9]+)$" NODEJS_MODULE_VERSION ${NODEJS_MODULE_VERSION_DEF})

if(WIN32)
set(NODEJS_LIBRARY "")
elseif(NOT NODEJS_LIBRARY)
set(NODEJS_LIBRARY_NAMES
libnode.so.${NODEJS_MODULE_VERSION}
libnode.${NODEJS_MODULE_VERSION}.dylib)
find_library(NODEJS_LIBRARY
NAMES ${NODEJS_LIBRARY_NAMES}
PATHS ENV LD_LIBRARY_PATH
REQUIRED)
endif()

message(STATUS "NODEJS_LIBRARY: ${NODEJS_LIBRARY}")

set(source_path "${CMAKE_CURRENT_SOURCE_DIR}/src/jlnode")

set(sources
${source_path}/module.cpp
${source_path}/utils.cpp
${source_path}/instance.cpp
${source_path}/externals.cpp
${source_path}/objects.cpp
${source_path}/arrays.cpp
${source_path}/functions.cpp
${source_path}/promises.cpp
${source_path}/threading.cpp
)
set(headers
${source_path}/utils.h
${source_path}/instance.h
${source_path}/externals.h
${source_path}/objects.h
${source_path}/arrays.h
${source_path}/functions.h
${source_path}/promises.h
${source_path}/threading.h
)

add_library(${PROJECT_NAME}
SHARED ${sources} ${headers}
${CMAKE_JS_SRC})

target_link_libraries(${PROJECT_NAME}
${CMAKE_JS_LIB}
${NODEJS_LIBRARY})

target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_JS_INC}
${NAPI_INC})

project(jlnode_addon
VERSION 16.3.0
LANGUAGES CXX)

set(addon_path "${CMAKE_CURRENT_SOURCE_DIR}/src/addon")
set(addon_sources
${addon_path}/addon.cpp
${addon_path}/init.cpp)
set(addon_headers
${addon_path}/init.h)

add_library(${PROJECT_NAME}
SHARED ${addon_sources} ${addon_headers}
${CMAKE_JS_SRC})

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")

target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_JS_INC}
${NAPI_INC})

target_link_libraries(${PROJECT_NAME}
${CMAKE_JS_LIB})

install(TARGETS jlnode jlnode_addon
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION lib)
44 changes: 22 additions & 22 deletions LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
The jlnode package is licensed under the MIT "Expat" License:

> Copyright (c) 2021: Sunoru.
>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all
> copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> SOFTWARE.
>
The jlnode package is licensed under the MIT "Expat" License:

> Copyright (c) 2021: Sunoru.
>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in all
> copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> SOFTWARE.
>
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# NodeJS Wrapper for Julia

See [`NodeCall.jl`](https://github.com/sunoru/NodeCall.jl).

## License

[MIT License]("./LICENSE.md")
# NodeJS Wrapper for Julia

See [`NodeCall.jl`](https://github.com/sunoru/NodeCall.jl).

## License

[MIT License]("./LICENSE.md")
Loading

0 comments on commit 0db0173

Please sign in to comment.