Skip to content

Commit 98cc0c3

Browse files
committed
build: cmake-js
Ref: nodejs#422
1 parent d8e9c22 commit 98cc0c3

File tree

84 files changed

+329
-276
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+329
-276
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
/node_modules
22
/build
3+
4+
# old npm versions
5+
/npm-debug.log

.npmrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
package-lock=false
1+
package-lock=false

external-napi/node_api.h

-7
This file was deleted.

napi-inl.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,11 @@ inline bool Value::IsNumber() const {
339339

340340
// currently experimental guard with version of NAPI_VERSION that it is
341341
// released in once it is no longer experimental
342-
#if (NAPI_VERSION > 2147483646)
342+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
343343
inline bool Value::IsBigInt() const {
344344
return Type() == napi_bigint;
345345
}
346-
#endif // NAPI_EXPERIMENTAL
346+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
347347

348348
inline bool Value::IsString() const {
349349
return Type() == napi_string;
@@ -563,7 +563,7 @@ inline double Number::DoubleValue() const {
563563

564564
// currently experimental guard with version of NAPI_VERSION that it is
565565
// released in once it is no longer experimental
566-
#if (NAPI_VERSION > 2147483646)
566+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
567567
////////////////////////////////////////////////////////////////////////////////
568568
// BigInt Class
569569
////////////////////////////////////////////////////////////////////////////////
@@ -624,7 +624,7 @@ inline void BigInt::ToWords(int* sign_bit, size_t* word_count, uint64_t* words)
624624
_env, _value, sign_bit, word_count, words);
625625
NAPI_THROW_IF_FAILED_VOID(_env, status);
626626
}
627-
#endif // NAPI_EXPERIMENTAL
627+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
628628

629629
////////////////////////////////////////////////////////////////////////////////
630630
// Name class

napi.h

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef SRC_NAPI_H_
22
#define SRC_NAPI_H_
33

4+
#define NAPI_VERSION_EXPERIMENTAL 2147483647
5+
46
#include "node_api.h"
57
#include <functional>
68
#include <initializer_list>
@@ -54,9 +56,9 @@ namespace Napi {
5456
class Number;
5557
// currently experimental guard with version of NAPI_VERSION that it is
5658
// released in once it is no longer experimental
57-
#if (NAPI_VERSION > 2147483646)
59+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
5860
class BigInt;
59-
#endif // NAPI_EXPERIMENTAL
61+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
6062
class String;
6163
class Object;
6264
class Array;
@@ -79,10 +81,10 @@ namespace Napi {
7981
typedef TypedArrayOf<double> Float64Array; ///< Typed-array of 64-bit floating-point values
8082
// currently experimental guard with version of NAPI_VERSION that it is
8183
// released in once it is no longer experimental
82-
#if (NAPI_VERSION > 2147483646)
84+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
8385
typedef TypedArrayOf<int64_t> BigInt64Array; ///< Typed array of signed 64-bit integers
8486
typedef TypedArrayOf<uint64_t> BigUint64Array; ///< Typed array of unsigned 64-bit integers
85-
#endif // NAPI_EXPERIMENTAL
87+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
8688

8789
/// Defines the signature of a N-API C++ module's registration callback (init) function.
8890
typedef Object (*ModuleRegisterCallback)(Env env, Object exports);
@@ -184,9 +186,9 @@ namespace Napi {
184186
bool IsNumber() const; ///< Tests if a value is a JavaScript number.
185187
// currently experimental guard with version of NAPI_VERSION that it is
186188
// released in once it is no longer experimental
187-
#if (NAPI_VERSION > 2147483646)
189+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
188190
bool IsBigInt() const; ///< Tests if a value is a JavaScript bigint.
189-
#endif // NAPI_EXPERIMENTAL
191+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
190192
bool IsString() const; ///< Tests if a value is a JavaScript string.
191193
bool IsSymbol() const; ///< Tests if a value is a JavaScript symbol.
192194
bool IsArray() const; ///< Tests if a value is a JavaScript array.
@@ -258,7 +260,7 @@ namespace Napi {
258260

259261
// currently experimental guard with version of NAPI_VERSION that it is
260262
// released in once it is no longer experimental
261-
#if (NAPI_VERSION > 2147483646)
263+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
262264
/// A JavaScript bigint value.
263265
class BigInt : public Value {
264266
public:
@@ -297,7 +299,7 @@ namespace Napi {
297299
/// be needed to store this BigInt (i.e. the return value of `WordCount()`).
298300
void ToWords(int* sign_bit, size_t* word_count, uint64_t* words);
299301
};
300-
#endif // NAPI_EXPERIMENTAL
302+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
301303

302304
/// A JavaScript string or symbol value (that can be used as a property name).
303305
class Name : public Value {
@@ -764,10 +766,10 @@ namespace Napi {
764766
: std::is_same<T, double>::value ? napi_float64_array
765767
// currently experimental guard with version of NAPI_VERSION that it is
766768
// released in once it is no longer experimental
767-
#if (NAPI_VERSION > 2147483646)
769+
#if (NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL)
768770
: std::is_same<T, int64_t>::value ? napi_bigint64_array
769771
: std::is_same<T, uint64_t>::value ? napi_biguint64_array
770-
#endif // NAPI_EXPERIMENTAL
772+
#endif // NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL
771773
: unknown_array_type;
772774
}
773775
/// !endcond

package.json

+11-1
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,18 @@
5353
"url": "git://github.com/nodejs/node-addon-api.git"
5454
},
5555
"scripts": {
56-
"pretest": "node-gyp rebuild -C test",
56+
"clean": "cmake-js clean -d test",
57+
5758
"test": "node test",
59+
"test:debug": "node test",
60+
"test:debug:dev": "node test",
61+
"test:release:dev": "node test",
62+
63+
"pretest": "cmake-js rebuild -d test",
64+
"pretest:debug": "cmake-js rebuild --debug -d test",
65+
"pretest:release:dev": "cmake-js build -d test",
66+
"pretest:debug:dev": "cmake-js build --debug -d test",
67+
5868
"doc": "doxygen doc/Doxyfile"
5969
},
6070
"version": "1.6.2"

src/CMakeLists.txt

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
cmake_minimum_required(VERSION 3.11)
2+
set(CMAKE_CXX_STANDARD 11)
3+
set(CMAKE_POSITION_INDEPENDENT_CODE ON) # -fPIC flag
4+
5+
# TODO: "${CMAKE_SOURCE_DIR}/../src" is unclean
6+
set(INCLUDE_DIRECTORIES "${INCLUDE_DIRECTORIES}" "${CMAKE_SOURCE_DIR}/../src" PARENT_SCOPE)
7+
8+
if(NOT "${NAPI_VERSION}" STREQUAL "")
9+
add_definitions(-DNAPI_VERSION=${NAPI_VERSION})
10+
endif()
11+
12+
add_library(node-api STATIC node_api.cc node_internals.cc)
13+
target_compile_options(node-api PRIVATE -DEXTERNAL_NAPI)
14+
set(BINDING_LINK_LIBRARIES "${BINDING_LINK_LIBRARIES}" node-api PARENT_SCOPE)

src/node_api.cc

-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#include "node_api.h"
1919
#include "node_internals.h"
2020

21-
#define NAPI_VERSION 1
22-
2321
static
2422
napi_status napi_set_last_error(napi_env env, napi_status error_code,
2523
uint32_t engine_error_code = 0,

src/node_api.gyp

-21
This file was deleted.

src/nothing.c

Whitespace-only changes.

test/.gitignore

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
build/
2-
src/
1+
/build
2+
/build-node-api

test/CMakeLists.txt

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
cmake_minimum_required(VERSION 3.11)
2+
set(CMAKE_CXX_STANDARD 11)
3+
4+
project (node-addon-api)
5+
6+
set(DISABLE_DEPRECATED_DEFAULT "false")
7+
8+
9+
message("================================================================================")
10+
11+
# NODE_VERSION_*
12+
execute_process(COMMAND node -p "process.version" OUTPUT_VARIABLE NODE_VERSION)
13+
string(STRIP "${NODE_VERSION}" NODE_VERSION) # remove new line at end
14+
STRING(REGEX MATCH "^v([^\.]+)\.([^\.]+)\.([^\.]+)$" NODE_VERSION "${NODE_VERSION}")
15+
set(NODE_VERSION_MAJOR ${CMAKE_MATCH_1})
16+
set(NODE_VERSION_MINOR ${CMAKE_MATCH_2})
17+
set(NODE_VERSION_PATCH ${CMAKE_MATCH_3})
18+
set(NODE_VERSION_SEMVER "${NODE_VERSION_MAJOR}.${NODE_VERSION_MINOR}.${NODE_VERSION_PATCH}")
19+
20+
message("NODE_VERSION = ${NODE_VERSION}")
21+
message("NODE_VERSION_SEMVER = ${NODE_VERSION_SEMVER}")
22+
message("NODE_VERSION_MAJOR = ${NODE_VERSION_MAJOR}")
23+
message("NODE_VERSION_MINOR = ${NODE_VERSION_MINOR}")
24+
message("NODE_VERSION_PATCH = ${NODE_VERSION_PATCH}")
25+
26+
27+
# NAPI_VERSION
28+
execute_process(COMMAND node -p "process.env['npm_config_NAPI_VERSION'] || ''" OUTPUT_VARIABLE NAPI_VERSION)
29+
string(STRIP "${NAPI_VERSION}" NAPI_VERSION) # remove new line at end
30+
31+
message("NAPI_VERSION = ${NAPI_VERSION}")
32+
33+
34+
# NODE_API_BUILTIN
35+
set(NODE_API_BUILTIN "false")
36+
if(("${NODE_VERSION_SEMVER}" VERSION_GREATER_EQUAL "9.0.0")
37+
OR ((${NODE_VERSION_MAJOR} EQUAL 8) AND ("${NODE_VERSION_SEMVER}" VERSION_GREATER_EQUAL "8.6.0"))
38+
OR ((${NODE_VERSION_MAJOR} EQUAL 6) AND ("${NODE_VERSION_SEMVER}" VERSION_GREATER_EQUAL "6.15.0"))
39+
OR ((${NODE_VERSION_MAJOR} EQUAL 6) AND ("${NODE_VERSION_SEMVER}" VERSION_GREATER_EQUAL "6.14.2"))
40+
)
41+
set(NODE_API_BUILTIN "true")
42+
else()
43+
set(NAPI_VERSION 1)
44+
endif()
45+
46+
message("NODE_API_BUILTIN = ${NODE_API_BUILTIN}")
47+
48+
49+
# disable_deprecated
50+
execute_process(COMMAND node -p "process.env['npm_config_disable_deprecated'] || ''" OUTPUT_VARIABLE DISABLE_DEPRECATED)
51+
string(STRIP "${DISABLE_DEPRECATED}" DISABLE_DEPRECATED) # remove new line at end
52+
53+
if(NOT "${DISABLE_DEPRECATED}" STREQUAL "true")
54+
set(DISABLE_DEPRECATED "${DISABLE_DEPRECATED_DEFAULT}")
55+
endif()
56+
57+
message("disable_deprecated = ${DISABLE_DEPRECATED}")
58+
59+
60+
# SOURCE_FILES
61+
file(GLOB SOURCE_FILES "src/*.test.cc")
62+
# SOURCE_FILES will be logged later
63+
64+
65+
# NAPI_VERSION* compile options
66+
if(NOT "${NAPI_VERSION}" STREQUAL "")
67+
set(DEFINITIONS_VERSION -DNAPI_VERSION=${NAPI_VERSION})
68+
else()
69+
set(DEFINITIONS_VERSION -DNAPI_EXPERIMENTAL)
70+
endif()
71+
72+
message("DEFINITIONS_VERSION = ${DEFINITIONS_VERSION}")
73+
add_definitions("${DEFINITIONS_VERSION}")
74+
75+
76+
# DISABLE_DEPRECATED compile options, source files
77+
if ("${DISABLE_DEPRECATED}" STREQUAL "true")
78+
set(COMPILE_OPTIONS_DISABLE_DEPRECATED -DNODE_ADDON_API_DISABLE_DEPRECATED)
79+
add_compile_options("${COMPILE_OPTIONS_DISABLE_DEPRECATED}")
80+
message("COMPILE_OPTIONS_DISABLE_DEPRECATED = ${COMPILE_OPTIONS_DISABLE_DEPRECATED}")
81+
endif()
82+
83+
84+
#env.json configure
85+
set(NAPI_MODULES_FLAG "false")
86+
if((NOT "${NODE_API_BUILTIN}" STREQUAL "true") AND ("${NODE_VERSION_MAJOR}" STREQUAL 8))
87+
set(NAPI_MODULES_FLAG "true")
88+
endif()
89+
90+
configure_file("${CMAKE_SOURCE_DIR}/env.json.in" "${CMAKE_BINARY_DIR}/env.json")
91+
92+
93+
# include directories
94+
set(INCLUDE_DIRECTORIES "${INCLUDE_DIRECTORIES}" "${CMAKE_SOURCE_DIR}/.." "${CMAKE_JS_INC}")
95+
include_directories("${INCLUDE_DIRECTORIES}")
96+
97+
98+
# use builtin node api or compile shipped for old node versions
99+
if("${NODE_API_BUILTIN}" STREQUAL "true")
100+
# set(INCLUDE_DIRECTORIES "${INCLUDE_DIRECTORIES}" "${CMAKE_SOURCE_DIR}/../external-napi")
101+
else()
102+
add_subdirectory("${CMAKE_SOURCE_DIR}/../src" "${CMAKE_SOURCE_DIR}/build-node-api")
103+
include_directories("${INCLUDE_DIRECTORIES}") # need to update
104+
endif()
105+
106+
107+
string(REPLACE ";" "\n" SOURCE_FILES_LIST "${SOURCE_FILES}")
108+
message("================================================================================")
109+
message("INCLUDE_DIRECTORIES:")
110+
message("${INCLUDE_DIRECTORIES}")
111+
message("================================================================================")
112+
message("SOURCE_FILES:")
113+
message("${SOURCE_FILES_LIST}")
114+
message("================================================================================")
115+
116+
# C/CXX flags
117+
set(FLAGS "-Werror -Wall -Wextra -Wpedantic -Wunused-parameter")
118+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}")
119+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}")
120+
121+
message("CMAKE_C_FLAGS = ${CMAKE_C_FLAGS}")
122+
message("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
123+
message("================================================================================")
124+
125+
# library binding
126+
add_library(binding SHARED ${SOURCE_FILES})
127+
target_compile_options(binding PRIVATE -DNAPI_CPP_EXCEPTIONS)
128+
set_target_properties(binding PROPERTIES PREFIX "" SUFFIX ".node")
129+
target_link_libraries(binding "${BINDING_LINK_LIBRARIES}")
130+
131+
# library binding_noexcept
132+
add_library(binding_noexcept SHARED ${SOURCE_FILES})
133+
target_compile_options(binding_noexcept PRIVATE -DNAPI_DISABLE_CPP_EXCEPTIONS)
134+
set_target_properties(binding_noexcept PROPERTIES PREFIX "" SUFFIX ".node")
135+
target_link_libraries(binding_noexcept "${BINDING_LINK_LIBRARIES}")

0 commit comments

Comments
 (0)