Skip to content

Commit 09a0e59

Browse files
committed
Use cmake-ports for building libsodium using Zig
1 parent 9626380 commit 09a0e59

7 files changed

Lines changed: 73 additions & 207 deletions

File tree

.github/workflows/prebuild.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ jobs:
6060
- uses: actions/setup-node@v4
6161
with:
6262
node-version: lts/*
63-
- run: choco install llvm --version 21.1.8 --force
63+
- run: sudo snap install zig --classic --beta
64+
if: ${{ matrix.platform == 'linux' || matrix.platform == 'android' }}
65+
- run: brew install zig
66+
if: ${{ matrix.platform == 'darwin' || matrix.platform == 'ios' }}
67+
- run: choco install zig
6468
if: ${{ matrix.platform == 'win32' }}
6569
- run: npm install -g bare-make
6670
- run: npm install

.github/workflows/test.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@ jobs:
2727
- uses: actions/setup-node@v4
2828
with:
2929
node-version: lts/*
30-
- run: choco install llvm --version 21.1.8 --force
30+
- run: sudo snap install zig --classic --beta
31+
if: ${{ matrix.platform == 'linux' }}
32+
- run: brew install zig
33+
if: ${{ matrix.platform == 'darwin' }}
34+
- run: choco install zig
3135
if: ${{ matrix.platform == 'win32' }}
3236
- run: npm install -g bare-runtime bare-make
3337
- run: npm install
34-
- run: bare-make generate --platform ${{ matrix.platform }} --arch ${{ matrix.arch }} --debug
38+
- run: bare-make generate --platform ${{ matrix.platform }} --arch ${{ matrix.arch }}
3539
- run: bare-make build
3640
- run: bare-make install
3741
- run: npm test

CMakeLists.txt

Lines changed: 4 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -1,213 +1,15 @@
1-
cmake_minimum_required(VERSION 3.25)
1+
cmake_minimum_required(VERSION 3.31)
22

33
find_package(cmake-bare REQUIRED PATHS node_modules/cmake-bare)
4-
find_package(cmake-fetch REQUIRED PATHS node_modules/cmake-fetch)
54
find_package(cmake-napi REQUIRED PATHS node_modules/cmake-napi)
65
find_package(cmake-npm REQUIRED PATHS node_modules/cmake-npm)
6+
find_package(cmake-ports REQUIRED PATHS node_modules/cmake-ports)
77

8-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
9-
10-
project(sodium_native C ASM CXX)
11-
12-
fetch_package("github:jedisct1/libsodium#e18eee6" SOURCE_DIR sodium)
8+
project(sodium_native C CXX ASM)
139

1410
fetch_package("github:holepunchto/libjstl#098664c")
1511

16-
bare_target(target)
17-
18-
if(target MATCHES "win32")
19-
add_compile_options(/MT$<$<CONFIG:Debug>:d>)
20-
endif()
21-
22-
file(COPY_FILE "${sodium}/builds/msvc/version.h" "${sodium}/src/libsodium/include/sodium/version.h")
23-
24-
file(GLOB_RECURSE sodium_headers CONFIGURE_DEPENDS "${sodium}/src/libsodium/**/*.h")
25-
file(GLOB_RECURSE sodium_sources CONFIGURE_DEPENDS "${sodium}/src/libsodium/**/*.c")
26-
file(GLOB_RECURSE sodium_asm_sources CONFIGURE_DEPENDS "${sodium}/src/libsodium/**/*.S")
27-
28-
add_library(sodium OBJECT)
29-
30-
target_sources(
31-
sodium
32-
INTERFACE
33-
${sodium_headers}
34-
PRIVATE
35-
${sodium_sources}
36-
)
37-
38-
target_include_directories(
39-
sodium
40-
INTERFACE
41-
"${sodium}/src/libsodium/include"
42-
PRIVATE
43-
"${sodium}/src/libsodium/include/sodium"
44-
)
45-
46-
if(NOT target MATCHES "win32")
47-
target_compile_options(
48-
sodium
49-
PRIVATE
50-
-fvisibility=hidden
51-
-fno-strict-aliasing
52-
-fwrapv
53-
-flax-vector-conversions
54-
)
55-
endif()
56-
57-
target_compile_definitions(
58-
sodium
59-
PUBLIC
60-
SODIUM_STATIC=1
61-
PRIVATE
62-
_GNU_SOURCE=1
63-
CONFIGURED=1
64-
DEV_MODE=1
65-
HAVE_ATOMIC_OPS=1
66-
HAVE_C11_MEMORY_FENCES=1
67-
HAVE_CET_H=1
68-
HAVE_GCC_MEMORY_FENCES=1
69-
HAVE_INLINE_ASM=1
70-
HAVE_INTTYPES_H=1
71-
HAVE_STDINT_H=1
72-
HAVE_TI_MODE=1
73-
)
74-
75-
if(target MATCHES "darwin|ios")
76-
target_compile_definitions(
77-
sodium
78-
PRIVATE
79-
ASM_HIDE_SYMBOL=.private_extern
80-
TLS=_Thread_local
81-
HAVE_ARC4RANDOM=1
82-
HAVE_ARC4RANDOM_BUF=1
83-
HAVE_CATCHABLE_ABRT=1
84-
HAVE_CATCHABLE_SEGV=1
85-
HAVE_CLOCK_GETTIME=1
86-
HAVE_GETPID=1
87-
HAVE_MADVISE=1
88-
HAVE_MEMSET_S=1
89-
HAVE_MLOCK=1
90-
HAVE_MMAP=1
91-
HAVE_MPROTECT=1
92-
HAVE_NANOSLEEP=1
93-
HAVE_POSIX_MEMALIGN=1
94-
HAVE_PTHREAD=1
95-
HAVE_PTHREAD_PRIO_INHERIT=1
96-
HAVE_RAISE=1
97-
HAVE_SYSCONF=1
98-
HAVE_SYS_MMAN_H=1
99-
HAVE_SYS_PARAM_H=1
100-
HAVE_WEAK_SYMBOLS=1
101-
)
102-
103-
if(NOT target MATCHES "ios")
104-
target_compile_definitions(
105-
sodium
106-
PRIVATE
107-
HAVE_GETENTROPY=1
108-
HAVE_SYS_RANDOM_H=1
109-
)
110-
endif()
111-
endif()
112-
113-
if(target MATCHES "linux")
114-
target_compile_definitions(
115-
sodium
116-
PRIVATE
117-
ASM_HIDE_SYMBOL=.hidden
118-
TLS=_Thread_local
119-
HAVE_CATCHABLE_ABRT=1
120-
HAVE_CATCHABLE_SEGV=1
121-
HAVE_CLOCK_GETTIME=1
122-
HAVE_GETPID=1
123-
HAVE_MADVISE=1
124-
HAVE_MLOCK=1
125-
HAVE_MMAP=1
126-
HAVE_MPROTECT=1
127-
HAVE_NANOSLEEP=1
128-
HAVE_POSIX_MEMALIGN=1
129-
HAVE_PTHREAD_PRIO_INHERIT=1
130-
HAVE_PTHREAD=1
131-
HAVE_RAISE=1
132-
HAVE_SYSCONF=1
133-
HAVE_SYS_AUXV_H=1
134-
HAVE_SYS_MMAN_H=1
135-
HAVE_SYS_PARAM_H=1
136-
HAVE_SYS_RANDOM_H=1
137-
HAVE_WEAK_SYMBOLS=1
138-
)
139-
endif()
140-
141-
if(target MATCHES "win32")
142-
target_compile_definitions(
143-
sodium
144-
PRIVATE
145-
_CRT_SECURE_NO_WARNINGS=1
146-
HAVE_RAISE=1
147-
)
148-
endif()
149-
150-
if(target MATCHES "x64")
151-
target_compile_definitions(
152-
sodium
153-
PRIVATE
154-
HAVE_CPUID=1
155-
HAVE_RDRAND=1
156-
HAVE_EMMINTRIN_H=1 # SSE2
157-
HAVE_PMMINTRIN_H=1 # SSE3
158-
HAVE_TMMINTRIN_H=1 # SSSE3
159-
HAVE_SMMINTRIN_H=1 # SSE4.1
160-
HAVE_WMMINTRIN_H=1 # AES
161-
HAVE_AVXINTRIN_H=1 # AVX
162-
HAVE_AVX2INTRIN_H=1 # AVX2
163-
HAVE_AVX512FINTRIN_H # AVX512F
164-
)
165-
166-
if(NOT target MATCHES "win32")
167-
target_compile_definitions(
168-
sodium
169-
PRIVATE
170-
HAVE_AMD64_ASM=1
171-
HAVE_AVX_ASM=1
172-
)
173-
174-
target_sources(
175-
sodium
176-
PRIVATE
177-
${sodium_asm_sources}
178-
)
179-
endif()
180-
endif()
181-
182-
if(target MATCHES "arm64")
183-
target_compile_definitions(
184-
sodium
185-
PRIVATE
186-
HAVE_ARMCRYPTO=1
187-
)
188-
endif()
189-
190-
if(CMAKE_C_BYTE_ORDER MATCHES "BIG_ENDIAN")
191-
target_compile_definitions(
192-
sodium
193-
PRIVATE
194-
NATIVE_BIG_ENDIAN=1
195-
)
196-
else()
197-
target_compile_definitions(
198-
sodium
199-
PRIVATE
200-
NATIVE_LITTLE_ENDIAN=1
201-
)
202-
endif()
203-
204-
if(target MATCHES "linux|android")
205-
target_link_options(
206-
sodium
207-
PUBLIC
208-
-Wl,-z,noexecstack
209-
)
210-
endif()
12+
find_port(libsodium)
21113

21214
add_library(sodium_extensions OBJECT)
21315

@@ -237,7 +39,6 @@ target_sources(
23739
target_link_libraries(
23840
${sodium_native_bare}
23941
PRIVATE
240-
$<TARGET_OBJECTS:sodium>
24142
$<TARGET_OBJECTS:sodium_extensions>
24243
jstl
24344
PUBLIC
@@ -262,7 +63,6 @@ target_compile_definitions(
26263
target_link_libraries(
26364
${sodium_native_node}
26465
PRIVATE
265-
$<TARGET_OBJECTS:sodium>
26666
$<TARGET_OBJECTS:sodium_extensions>
26767
jstl
26868
PUBLIC

binding.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2939,6 +2939,8 @@ sn_crypto_stream_xor_wrap_update(
29392939
auto *c_ptr = c.data();
29402940
auto *m_ptr = m.data();
29412941

2942+
if (c_ptr == nullptr) return;
2943+
29422944
if (state->remainder) {
29432945
uint64_t offset = 0;
29442946
int rem = state->remainder;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
diff --git a/build.zig b/build.zig
2+
index 0ad8c867..a0a27eb9 100644
3+
--- a/build.zig
4+
+++ b/build.zig
5+
@@ -59,7 +59,6 @@ fn initLibConfig(b: *std.Build, target: std.Build.ResolvedTarget, lib: *Compile)
6+
},
7+
.windows => {
8+
lib.root_module.addCMacro("HAVE_RAISE", "1");
9+
- lib.root_module.addCMacro("HAVE_SYS_PARAM_H", "1");
10+
if (lib.isStaticLibrary()) {
11+
lib.root_module.addCMacro("SODIUM_STATIC", "1");
12+
}

cmake/ports/libsodium/port.cmake

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
include_guard(GLOBAL)
2+
3+
if(WIN32)
4+
set(lib sodium.lib)
5+
else()
6+
set(lib libsodium.a)
7+
endif()
8+
9+
declare_port(
10+
"github:jedisct1/libsodium#a937222"
11+
sodium
12+
ZIG
13+
BYPRODUCTS lib/${lib}
14+
ARGS
15+
-Dstatic=true
16+
-Dshared=false
17+
-Dtest=false
18+
PATCHES
19+
patches/01-windows-sys-param.patch
20+
)
21+
22+
add_library(sodium STATIC IMPORTED GLOBAL)
23+
24+
add_dependencies(sodium ${sodium})
25+
26+
set_target_properties(
27+
sodium
28+
PROPERTIES
29+
IMPORTED_LOCATION "${sodium_PREFIX}/lib/${lib}"
30+
)
31+
32+
file(MAKE_DIRECTORY "${sodium_PREFIX}/include")
33+
34+
target_include_directories(
35+
sodium
36+
INTERFACE "${sodium_PREFIX}/include"
37+
)
38+
39+
target_compile_definitions(
40+
sodium
41+
INTERFACE
42+
SODIUM_STATIC
43+
)

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"cmake-bare": "^1.6.1",
3030
"cmake-fetch": "^1.4.3",
3131
"cmake-napi": "^1.2.1",
32+
"cmake-ports": "^1.3.0",
3233
"prettier": "^3.6.2",
3334
"prettier-config-holepunch": "^2.0.0"
3435
},

0 commit comments

Comments
 (0)