-
-
Notifications
You must be signed in to change notification settings - Fork 12.5k
/
node.rb
178 lines (151 loc) · 7.25 KB
/
node.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
class Node < Formula
desc "Platform built on V8 to build network applications"
homepage "https://nodejs.org/"
url "https://nodejs.org/dist/v22.3.0/node-v22.3.0.tar.xz"
sha256 "bfb85bd1dca517761f9046d61600f830d19935d6d6c36eded01578a19326104c"
license "MIT"
head "https://github.com/nodejs/node.git", branch: "main"
livecheck do
url "https://nodejs.org/dist/"
regex(%r{href=["']?v?(\d+(?:\.\d+)+)/?["' >]}i)
end
bottle do
sha256 arm64_sonoma: "1a441e29fd01eaf18ce6e8bff476268dab05ffe07385d042e311a5e47f815dc4"
sha256 arm64_ventura: "cf3316c3ff5a43e0649c06a71bec3cee0c810a21ed17d762381abe122edc640b"
sha256 arm64_monterey: "e02661cb763e8d626bb3a5bec299340dc12d47aa604d9c5fdcba782b2b596ff8"
sha256 sonoma: "a55dfc9f85e29f1000af224696da387b1f72bae6afeb003441c3bca411f5c1b7"
sha256 ventura: "cdf20c19388be86ad3e69c2a8ba4755f9887394e1799de4d7dd7a6566d9eb4ae"
sha256 monterey: "2de279a1bc9571ad22f46763f0495e95bbe22d59d62d6e30734fe3aafccfbd45"
sha256 x86_64_linux: "47aadd5527229ab504f934461d76f04f2266e48ce17a50b5d37e0db62c6c6fbd"
end
depends_on "pkg-config" => :build
depends_on "python@3.12" => :build
depends_on "brotli"
depends_on "c-ares"
depends_on "icu4c"
depends_on "libnghttp2"
depends_on "libuv"
depends_on "openssl@3"
uses_from_macos "python", since: :catalina
uses_from_macos "zlib"
on_macos do
depends_on "llvm" => [:build, :test] if DevelopmentTools.clang_build_version <= 1100
end
fails_with :clang do
build 1100
cause <<~EOS
error: calling a private constructor of class 'v8::internal::(anonymous namespace)::RegExpParserImpl<uint8_t>'
EOS
end
fails_with gcc: "5"
# We track major/minor from upstream Node releases.
# We will accept *important* npm patch releases when necessary.
resource "npm" do
url "https://registry.npmjs.org/npm/-/npm-10.8.1.tgz"
sha256 "b8807aebb9656758e2872fa6e7c564b506aa2faa9297439a478d471d2fe32483"
end
def install
ENV.llvm_clang if OS.mac? && (DevelopmentTools.clang_build_version <= 1100)
# The new linker crashed during LTO due to high memory usage.
ENV.append "LDFLAGS", "-Wl,-ld_classic" if DevelopmentTools.clang_build_version >= 1500
# make sure subprocesses spawned by make are using our Python 3
ENV["PYTHON"] = which("python3.12")
# Never install the bundled "npm", always prefer our
# installation from tarball for better packaging control.
args = %W[
--prefix=#{prefix}
--without-npm
--without-corepack
--with-intl=system-icu
--shared-libuv
--shared-nghttp2
--shared-openssl
--shared-zlib
--shared-brotli
--shared-cares
--shared-libuv-includes=#{Formula["libuv"].include}
--shared-libuv-libpath=#{Formula["libuv"].lib}
--shared-nghttp2-includes=#{Formula["libnghttp2"].include}
--shared-nghttp2-libpath=#{Formula["libnghttp2"].lib}
--shared-openssl-includes=#{Formula["openssl@3"].include}
--shared-openssl-libpath=#{Formula["openssl@3"].lib}
--shared-brotli-includes=#{Formula["brotli"].include}
--shared-brotli-libpath=#{Formula["brotli"].lib}
--shared-cares-includes=#{Formula["c-ares"].include}
--shared-cares-libpath=#{Formula["c-ares"].lib}
--openssl-use-def-ca-store
]
args << "--tag=head" if build.head?
# Enabling LTO errors on Linux with:
# terminate called after throwing an instance of 'std::out_of_range'
# Pre-Catalina macOS also can't build with LTO
# LTO is unpleasant if you have to build from source.
args << "--enable-lto" if OS.mac? && MacOS.version >= :catalina && build.bottle?
system "./configure", *args
system "make", "install"
# Allow npm to find Node before installation has completed.
ENV.prepend_path "PATH", bin
bootstrap = buildpath/"npm_bootstrap"
bootstrap.install resource("npm")
# These dirs must exists before npm install.
mkdir_p libexec/"lib"
system "node", bootstrap/"bin/npm-cli.js", "install", "-ddd", "--global",
"--prefix=#{libexec}", resource("npm").cached_download
# The `package.json` stores integrity information about the above passed
# in `cached_download` npm resource, which breaks `npm -g outdated npm`.
# This copies back over the vanilla `package.json` to fix this issue.
cp bootstrap/"package.json", libexec/"lib/node_modules/npm"
# These symlinks are never used & they've caused issues in the past.
rm_rf libexec/"share"
bash_completion.install bootstrap/"lib/utils/completion.sh" => "npm"
end
def post_install
node_modules = HOMEBREW_PREFIX/"lib/node_modules"
node_modules.mkpath
# Kill npm but preserve all other modules across node updates/upgrades.
rm_rf node_modules/"npm"
cp_r libexec/"lib/node_modules/npm", node_modules
# This symlink doesn't hop into homebrew_prefix/bin automatically so
# we make our own. This is a small consequence of our
# bottle-npm-and-retain-a-private-copy-in-libexec setup
# All other installs **do** symlink to homebrew_prefix/bin correctly.
# We ln rather than cp this because doing so mimics npm's normal install.
ln_sf node_modules/"npm/bin/npm-cli.js", bin/"npm"
ln_sf node_modules/"npm/bin/npx-cli.js", bin/"npx"
ln_sf bin/"npm", HOMEBREW_PREFIX/"bin/npm"
ln_sf bin/"npx", HOMEBREW_PREFIX/"bin/npx"
# Create manpage symlinks (or overwrite the old ones)
%w[man1 man5 man7].each do |man|
# Dirs must exist first: https://github.com/Homebrew/legacy-homebrew/issues/35969
mkdir_p HOMEBREW_PREFIX/"share/man/#{man}"
# still needed to migrate from copied file manpages to symlink manpages
rm_f Dir[HOMEBREW_PREFIX/"share/man/#{man}/{npm.,npm-,npmrc.,package.json.,npx.}*"]
ln_sf Dir[node_modules/"npm/man/#{man}/{npm,package-,shrinkwrap-,npx}*"], HOMEBREW_PREFIX/"share/man/#{man}"
end
(node_modules/"npm/npmrc").atomic_write("prefix = #{HOMEBREW_PREFIX}\n")
end
test do
# Make sure Mojave does not have `CC=llvm_clang`.
ENV.clang if OS.mac?
path = testpath/"test.js"
path.write "console.log('hello');"
output = shell_output("#{bin}/node #{path}").strip
assert_equal "hello", output
output = shell_output("#{bin}/node -e 'console.log(new Intl.NumberFormat(\"en-EN\").format(1234.56))'").strip
assert_equal "1,234.56", output
output = shell_output("#{bin}/node -e 'console.log(new Intl.NumberFormat(\"de-DE\").format(1234.56))'").strip
assert_equal "1.234,56", output
# make sure npm can find node
ENV.prepend_path "PATH", opt_bin
ENV.delete "NVM_NODEJS_ORG_MIRROR"
assert_equal which("node"), opt_bin/"node"
assert_predicate HOMEBREW_PREFIX/"bin/npm", :exist?, "npm must exist"
assert_predicate HOMEBREW_PREFIX/"bin/npm", :executable?, "npm must be executable"
npm_args = ["-ddd", "--cache=#{HOMEBREW_CACHE}/npm_cache", "--build-from-source"]
system HOMEBREW_PREFIX/"bin/npm", *npm_args, "install", "npm@latest"
system HOMEBREW_PREFIX/"bin/npm", *npm_args, "install", "ref-napi" unless head?
assert_predicate HOMEBREW_PREFIX/"bin/npx", :exist?, "npx must exist"
assert_predicate HOMEBREW_PREFIX/"bin/npx", :executable?, "npx must be executable"
assert_match "< hello >", shell_output("#{HOMEBREW_PREFIX}/bin/npx --yes cowsay hello")
end
end