nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 clang_20,
5
6 fetchFromGitHub,
7 fetchYarnDeps,
8 replaceVars,
9 writeShellScriptBin,
10
11 copyDesktopItems,
12 cctools,
13 clojure,
14 darwin,
15 makeDesktopItem,
16 makeWrapper,
17 nodejs,
18 removeReferencesTo,
19 yarnBuildHook,
20 yarnConfigHook,
21 xcbuild,
22 zip,
23
24 electron,
25 git,
26}:
27
28stdenv.mkDerivation (finalAttrs: {
29 pname = "logseq";
30 version = "0.10.15";
31
32 src = fetchFromGitHub {
33 owner = "logseq";
34 repo = "logseq";
35 tag = finalAttrs.version;
36 hash = "sha256-knosNA2Gqy10Kr9HWnBdYNlV51zzgFuL8cdioVlAk0Q=";
37 };
38
39 patches = [
40 (replaceVars ./hardcode-git-paths.patch {
41 cljs_time_src = fetchFromGitHub {
42 owner = "logseq";
43 repo = "cljs-time";
44 rev = "5704fbf48d3478eedcf24d458c8964b3c2fd59a9";
45 hash = "sha256-IApL+SEm7AhbTN7J/1KiAKTx7rd53hchRh3jmPQ412g=";
46 };
47 bb_tasks_src = fetchFromGitHub {
48 owner = "logseq";
49 repo = "bb-tasks";
50 rev = "70d3edeb287f5cec7192e642549a401f7d6d4263";
51 hash = "sha256-xVJj5XCkqfaNjnhYZkuqTSJN0ry8UVMaN44r9pxggB0=";
52 };
53 })
54
55 ./electron-forge-package-instead-of-make.patch
56 ./electron-forge-disable-signing.patch
57 ./fix-yarn-lock.patch
58 ];
59
60 mavenRepo = stdenv.mkDerivation {
61 name = "logseq-${finalAttrs.version}-maven-deps";
62 inherit (finalAttrs) src patches;
63
64 nativeBuildInputs = [ clojure ];
65
66 buildPhase = ''
67 runHook preBuild
68
69 export HOME="$(mktemp -d)"
70 mkdir -p "$out"
71
72 # -P -> resolve all normal deps
73 # -M:alias -> resolve extra-deps of the listed aliases
74 clj -Sdeps "{:mvn/local-repo \"$out\"}" -P -M:cljs
75
76 runHook postBuild
77 '';
78
79 # copied from buildMavenPackage
80 # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
81 installPhase = ''
82 runHook preInstall
83
84 find $out -type f \( \
85 -name \*.lastUpdated \
86 -o -name resolver-status.properties \
87 -o -name _remote.repositories \) \
88 -delete
89
90 runHook postInstall
91 '';
92
93 dontFixup = true;
94
95 outputHash = "sha256-gcq9zP5AQtpZU7sC9Oq3PkTj6uDo2NSShigkcuglV98=";
96 outputHashMode = "recursive";
97 outputHashAlgo = "sha256";
98 };
99
100 yarnOfflineCacheRoot = fetchYarnDeps {
101 name = "logseq-${finalAttrs.version}-yarn-deps-root";
102 inherit (finalAttrs) src patches;
103 hash = "sha256-xfAJ38shd92KdRfh/P7BH4eolZHQmzl4raoH1aZpGRk=";
104 };
105
106 # ./static and ./resources are combined into ./static by the build process
107 # ./static contains the lockfile and ./resources contains everything else
108 yarnOfflineCacheStaticResources = fetchYarnDeps {
109 name = "logseq-${finalAttrs.version}-yarn-deps-static-resources";
110 inherit (finalAttrs) src patches;
111 postPatch = "cd ./static";
112 hash = "sha256-zAGEQlOqKfPDrIoZQUnjBifgdYDYRsiHH7PUNrd0u+8=";
113 };
114
115 yarnOfflineCacheAmplify = fetchYarnDeps {
116 name = "logseq-${finalAttrs.version}-yarn-deps-amplify";
117 inherit (finalAttrs) src patches;
118 postPatch = "cd ./packages/amplify";
119 hash = "sha256-IOhSwIf5goXCBDGHCqnsvWLf3EUPqq75xfQg55snIp4=";
120 };
121
122 yarnOfflineCacheTldraw = fetchYarnDeps {
123 name = "logseq-${finalAttrs.version}-yarn-deps-tldraw";
124 inherit (finalAttrs) src patches;
125 postPatch = "cd ./tldraw";
126 hash = "sha256-CtMl3MPlyO5nWfFhCC1SLb/+1HUM3YfFATAPqJg3rUo=";
127 };
128
129 strictDeps = true;
130
131 nativeBuildInputs =
132 let
133 clojureWithCache = writeShellScriptBin "clojure" ''
134 exec ${lib.getExe' clojure "clojure"} -Sdeps '{:mvn/local-repo "${finalAttrs.mavenRepo}"}' "$@"
135 '';
136
137 # the build process runs `git describe --long --always --dirty`
138 fakeGit = writeShellScriptBin "git" ''
139 echo "${finalAttrs.src.rev or finalAttrs.version}@nixpkgs"
140 '';
141 in
142 [
143 clojureWithCache
144 copyDesktopItems
145 fakeGit
146 makeWrapper
147 nodejs
148 (nodejs.python.withPackages (ps: [ ps.setuptools ]))
149 removeReferencesTo
150 yarnBuildHook
151 yarnConfigHook
152 zip
153 ]
154 ++ lib.optionals stdenv.hostPlatform.isDarwin [
155 cctools
156 darwin.autoSignDarwinBinariesHook
157 xcbuild
158 clang_20 # newer clang breaks node-addon-api on darwin
159 ];
160
161 # we'll run the hook manually multiple times
162 dontYarnInstallDeps = true;
163
164 env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
165
166 postConfigure = ''
167 yarnOfflineCache="$yarnOfflineCacheRoot" yarnConfigHook
168
169 cp resources/package.json static/package.json
170 pushd static
171 yarnOfflineCache="$yarnOfflineCacheStaticResources" yarnConfigHook
172 popd
173
174 pushd packages/amplify
175 yarnOfflineCache="$yarnOfflineCacheAmplify" yarnConfigHook
176 popd
177
178 pushd tldraw
179 cp yarn.lock apps/tldraw-logseq/yarn.lock
180 yarnOfflineCache="$yarnOfflineCacheTldraw" yarnConfigHook
181 pushd apps/tldraw-logseq
182 yarnOfflineCache="$yarnOfflineCacheTldraw" yarnConfigHook
183 popd
184 popd
185
186 # this has to be done after everything is set up, because for some reason
187 # the shebangs somehow get unpatched... I don't know why...
188 patchShebangs node_modules
189 patchShebangs static/node_modules
190 patchShebangs packages/amplify/node_modules
191 patchShebangs tldraw/node_modules
192 patchShebangs tldraw/apps/tldraw-logseq/node_modules
193
194 yarn --offline --cwd tldraw postinstall
195
196 export npm_config_nodedir=${nodejs}
197 pushd packages/amplify
198 npm rebuild --verbose
199 popd
200
201 export npm_config_nodedir=${electron.headers}
202
203 pushd static
204
205 # we want to use our own git, don't try downloading it
206 substituteInPlace node_modules/dugite/package.json \
207 --replace-fail '"postinstall"' '"_postinstall"'
208
209 # this doesn't seem to build with electron.headers
210 rm node_modules/macos-alias/binding.gyp
211
212 # the electron-rebuild command deadlocks for some reason, let's just use normal npm rebuild (since we overrode the nodedir anyways)
213 npm rebuild --verbose
214
215 # remove most references to electron.headers
216 shopt -s globstar
217 rm -r node_modules/**/{*.target.mk,config.gypi,Makefile,Release/.deps}
218 shopt -u globstar
219
220 popd
221
222 cp -r ${electron.dist} electron-dist
223 chmod -R u+w electron-dist
224
225 pushd electron-dist
226 zip -0Xqr ../electron.zip .
227 popd
228
229 rm -r electron-dist
230
231 substituteInPlace static/node_modules/@electron/packager/dist/packager.js \
232 --replace-fail "await this.getElectronZipPath(downloadOpts)" "\"$(pwd)/electron.zip\""
233
234 cp -r static/node_modules resources/node_modules
235 '';
236
237 yarnBuildScript = "release-electron";
238
239 installPhase = ''
240 runHook preInstall
241
242 # remove references to nodejs
243 find static/out/*/resources/app/node_modules -type f -executable -exec remove-references-to -t ${nodejs} '{}' \;
244 ''
245 + lib.optionalString stdenv.hostPlatform.isLinux ''
246 install -Dm644 static/icons/logseq.png "$out/share/icons/hicolor/512x512/apps/logseq.png"
247
248 mkdir -p $out/share/logseq
249 cp -r static/out/*/{locales,resources{,.pak}} $out/share/logseq
250
251 makeWrapper ${lib.getExe electron} $out/bin/logseq \
252 --add-flags $out/share/logseq/resources/app \
253 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
254 --set-default LOCAL_GIT_DIRECTORY ${git} \
255 --inherit-argv0
256 ''
257 + lib.optionalString stdenv.hostPlatform.isDarwin ''
258 mkdir -p $out/Applications
259 cp -r static/out/*/Logseq.app $out/Applications
260
261 wrapProgram $out/Applications/Logseq.app/Contents/MacOS/Logseq \
262 --set-default LOCAL_GIT_DIRECTORY ${git}
263
264 makeWrapper $out/Applications/Logseq.app/Contents/MacOS/Logseq $out/bin/logseq
265 ''
266 + ''
267 runHook postInstall
268 '';
269
270 desktopItems = [
271 (makeDesktopItem {
272 name = "Logseq";
273 desktopName = "Logseq";
274 exec = "logseq %U";
275 terminal = false;
276 icon = "logseq";
277 startupWMClass = "Logseq";
278 comment = "A privacy-first, open-source platform for knowledge management and collaboration.";
279 mimeTypes = [ "x-scheme-handler/logseq" ];
280 categories = [ "Utility" ];
281 })
282 ];
283
284 meta = {
285 description = "Privacy-first, open-source platform for knowledge management and collaboration";
286 homepage = "https://github.com/logseq/logseq";
287 license = lib.licenses.agpl3Only;
288 maintainers = with lib.maintainers; [ tomasajt ];
289 mainProgram = "logseq";
290 platforms = electron.meta.platforms;
291 };
292})