From nobody Wed Jun 08 01:29:43 2022 X-Original-To: dev-commits-ports-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 30EDF850C74; Wed, 8 Jun 2022 01:29:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LHqQc0rwhz3Bwj; Wed, 8 Jun 2022 01:29:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1654651784; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=RRYX34Bi6ndcjyOfyXF6a3wGncvy0Am9ejKlgLLrc9g=; b=J8t1yY59l0yw6ZBnDDRA9q4Rly7C/aC+tQhTF55emoy6Wl9Yd1Zk+6liZDB3Mh6RS5Zxex rQeMWfcATmed4g+r965A6Meh8mZk7lkgLw6nw64g/1iS7Qa3fL6SODdVMCgcQXdORILnMT 2wo3EF99wQpOeNS0fXleMw3mSzSF0iG3si+s/6SnkNMzFCWmppQ8sEl5YlFbDRw5FFBjub 16aTkFfIWfzCL8248K6+bFQe47QGEWvMULFxzBVCTrIG0yj8OckT0FXKNXpa7abik3uxXu gh6WQHQG6p6YssvJ/O1vawyaRjTiOcPCMILUHXRAOWdBx0WbWjwNuFUwNCbTyw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id F2DB42628E; Wed, 8 Jun 2022 01:29:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2581Tht0015373; Wed, 8 Jun 2022 01:29:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2581ThLk015372; Wed, 8 Jun 2022 01:29:43 GMT (envelope-from git) Date: Wed, 8 Jun 2022 01:29:43 GMT Message-Id: <202206080129.2581ThLk015372@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-branches@FreeBSD.org From: Joseph Mingrone Subject: git: 7d351f62b50f - 2022Q2 - www/node14: Upgrade to 14.19.3 List-Id: Commit messages for all branches of the ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-all@freebsd.org X-BeenThere: dev-commits-ports-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jrm X-Git-Repository: ports X-Git-Refname: refs/heads/2022Q2 X-Git-Reftype: branch X-Git-Commit: 7d351f62b50fa17e6ec9061cabc7c53f34e0b1b2 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1654651784; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=RRYX34Bi6ndcjyOfyXF6a3wGncvy0Am9ejKlgLLrc9g=; b=A8wShh5+gVSQWjOTFNTKZhSPQXO+giiAiiP88rVffUnu1EN03QzjLPFK1UwwuhgIWCEkQr bFB2vLCBVVwyBRabOcFPH8Z9qK5fYC7PPKoeFyBeU7lYhCVJtCGj8VBLgpUv1m1lsBU5EN CXuaKKvKwEAtro4I3SzLnDHUJGsDf0Uqx8AWp5UEcLnMvfuBIZMmydxOdiSOR6vn5aIFa2 vWWzGg5se/EwREY71tj0RA0UYGWRX3hgjIEjFuPZQZf3fnehIB6A1BFdGYI5wBRnAXztod fZCmSJ7WuhY+p4nV6P2H9wKQTQE7z9rd8lEsbpiR9+/lZoYXOhoIFjdbZ8pjGQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1654651784; a=rsa-sha256; cv=none; b=XvbCQSO+i+Y/J+prmhWGCyN1rUJmNGs5cteVtxhnzCEVaa5LJ3kZGmlLf4HDofe8wsCvN8 cSzcjCcdvbsfFcx6EfPCZgo/zQjtn7sSR48EUCt9Byz+x5Fcej+eSUahQxgPABtUKrDwvL euPM+mbhrOw5+eqCHMTb+kjyqy3qWbiGEqUxYAqn7XQkwA89xm5TXssUWyi1PYpLueibdR Acbcl3/BzMMzfH4NFKI8BeNydeQ0/5NIuFHNQExSSEkQ9/8+gvQAfYRMFc+D//JB+UP05R EClW+E32zLMEuKziIyRgtuETZKhMxB/JiP3DSVoYAf4gDBqJ7km5+CcDllse2g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch 2022Q2 has been updated by jrm: URL: https://cgit.FreeBSD.org/ports/commit/?id=7d351f62b50fa17e6ec9061cabc7c53f34e0b1b2 commit 7d351f62b50fa17e6ec9061cabc7c53f34e0b1b2 Author: Derek Schrock AuthorDate: 2022-06-07 17:06:06 +0000 Commit: Joseph Mingrone CommitDate: 2022-06-08 01:29:01 +0000 www/node14: Upgrade to 14.19.3 https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md#14.19.3 This update is based on a patch from Dani I. that was originally attached to the PR. This update addresses CVE-2021-44531/44532/44533, CVE-2022-0778, and CVE-2022-21824. Notable port additions: - COREPACK option [1] - test target - python 3.10 build support - patch for failing test due to FreeBSD OpenSSL adding "-freebsd" to version string [1] Corepack is an experimental tool to help with managing versions of your package managers. It exposes binary proxies for each supported package manager that, when called, will identify whatever package manager is configured for the current project, transparently install it if needed, and finally run it without requiring explicit user interactions. PR: 263090 Approved by: bhughes (maintainer, timeout) Differential Revision: https://reviews.freebsd.org/D35192 (cherry picked from commit 8850edb8172d8562c80ac510d0c4a96a6f26d120) --- www/node14/Makefile | 124 +++++++++++---------- www/node14/distinfo | 6 +- www/node14/files/patch-node.gypi | 10 +- .../patch-test_parallel_test-process-versions.js | 11 ++ www/node14/pkg-plist | 57 ++++++++++ 5 files changed, 141 insertions(+), 67 deletions(-) diff --git a/www/node14/Makefile b/www/node14/Makefile index d3f472a0d42d..071d216d08a6 100644 --- a/www/node14/Makefile +++ b/www/node14/Makefile @@ -1,7 +1,6 @@ PORTNAME= node DISTVERSIONPREFIX= v -DISTVERSION= 14.18.1 -PORTREVISION= 1 +DISTVERSION= 14.19.3 CATEGORIES= www MASTER_SITES= http://nodejs.org/dist/v${DISTVERSION}/ PKGNAMESUFFIX= 14 @@ -12,17 +11,51 @@ COMMENT= V8 JavaScript for client and server LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE -BROKEN_SSL= libressl libressl-devel -BROKEN_SSL_REASON= Node.js 14.x LTS requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled -ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le +ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le -USES= compiler:c++11-lib gmake python:2.7-3.9,build pkgconfig \ - localbase shebangfix +BUILD_DEPENDS+= brotli>=1.0.9,1:archivers/brotli \ + c-ares>=1.17.2:dns/c-ares \ + libnghttp2>=1.42.0:www/libnghttp2 \ + libuv>=1.42.0:devel/libuv \ + objdump:devel/binutils +LIB_DEPENDS+= libbrotlidec.so:archivers/brotli \ + libcares.so:dns/c-ares \ + libnghttp2.so:www/libnghttp2 \ + libuv.so:devel/libuv + +USES= compiler:c++11-lib gmake localbase pkgconfig \ + python:2.7-3.10,build shebangfix +BROKEN_SSL= libressl libressl-devel +BROKEN_SSL_REASON= node.js 14.x LTS requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled +SHEBANG_FILES= deps/v8/third_party/inspector_protocol/*.py deps/v8/tools/*.py \ + tools/*.py tools/inspector_protocol/*.py -OPTIONS_DEFINE= BUNDLED_SSL DOCS NLS DTRACE -OPTIONS_DEFAULT= DTRACE +HAS_CONFIGURE= yes +CONFIGURE_ARGS= --prefix=${PREFIX_RELDEST} \ + --shared-brotli \ + --shared-cares \ + --shared-libuv \ + --shared-nghttp2 \ + --shared-zlib \ + --without-npm + +MAKE_ENV+= CC.host=${CC} \ + CFLAGS.host="${CFLAGS}" \ + CXX.host=${CXX} \ + CXXFLAGS.host="${CXXFLAGS}" \ + LDFLAGS.host="${LDFLAGS}" \ + LINK.host=${CXX} +TEST_ARGS= -i +TEST_TARGET= test-only + +CONFLICTS_INSTALL= node node10 node16 + +PREFIX_RELDEST= ${PREFIX:S,^${DESTDIR},,} +REINPLACE_ARGS= -i '' + +OPTIONS_DEFINE= BUNDLED_SSL COREPACK DOCS DTRACE NLS +OPTIONS_DEFAULT= COREPACK DTRACE OPTIONS_DEFAULT+= ${OPTIONS_DEFAULT_${OPSYS}_${OSREL:R}} -OPTIONS_SUB= yes .if !exists(/usr/sbin/dtrace) OPTIONS_EXCLUDE+= DTRACE @@ -30,59 +63,32 @@ OPTIONS_EXCLUDE+= DTRACE OPTIONS_EXCLUDE_aarch64= DTRACE # dt_modtext:/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c(820): arm not implemented -OPTIONS_EXCLUDE_armv6= DTRACE -OPTIONS_EXCLUDE_armv7= DTRACE +OPTIONS_EXCLUDE_armv6= DTRACE +OPTIONS_EXCLUDE_armv7= DTRACE OPTIONS_EXCLUDE_powerpc64= DTRACE OPTIONS_EXCLUDE_powerpc64le= DTRACE -BUNDLED_SSL_DESC= Use node.js's bundled OpenSSL implementation -BUNDLED_SSL_USES_OFF= ssl -BUNDLED_SSL_CONFIGURE_OFF= --shared-openssl --openssl-use-def-ca-store -BUNDLED_SSL_RUN_DEPENDS_OFF= ca_root_nss>=0:security/ca_root_nss +OPTIONS_SUB= yes -NLS_CONFIGURE_ON= --with-intl=system-icu -NLS_BUILD_DEPENDS= icu>=69.1:devel/icu -NLS_LIB_DEPENDS= libicui18n.so:devel/icu +BUNDLED_SSL_DESC= Use bundled OpenSSL implementation from node.js +COREPACK_DESC= Build and install corepack package manager -DTRACE_CONFIGURE_ON= --with-dtrace - -HAS_CONFIGURE= yes - -CONFLICTS_INSTALL= node10 node16 node - -CONFIGURE_ARGS= --prefix=${PREFIX_RELDEST} \ - --without-npm \ - --shared-brotli \ - --shared-cares \ - --shared-libuv \ - --shared-nghttp2 \ - --shared-zlib - -SHEBANG_FILES= deps/v8/tools/*.py \ - deps/v8/third_party/inspector_protocol/*.py \ - tools/*.py \ - tools/inspector_protocol/*.py +BUNDLED_SSL_RUN_DEPENDS_OFF= ca_root_nss>=0:security/ca_root_nss +BUNDLED_SSL_USES_OFF= ssl +BUNDLED_SSL_CONFIGURE_OFF= --openssl-use-def-ca-store \ + --shared-openssl -PREFIX_RELDEST= ${PREFIX:S,^${DESTDIR},,} -REINPLACE_ARGS= -i '' -MAKE_ENV+= CC.host=${CC} CFLAGS.host="${CFLAGS}" \ - CXX.host=${CXX} CXXFLAGS.host="${CXXFLAGS}" \ - LINK.host=${CXX} LDFLAGS.host="${LDFLAGS}" +COREPACK_CONFIGURE_OFF= --without-corepack +DTRACE_CONFIGURE_ON= --with-dtrace -BUILD_DEPENDS+= brotli>=1.0.9,1:archivers/brotli \ - c-ares>=1.17.2:dns/c-ares \ - libuv>=1.42.0:devel/libuv \ - libnghttp2>=1.42.0:www/libnghttp2 \ - objdump:devel/binutils -LIB_DEPENDS+= libbrotlidec.so:archivers/brotli \ - libcares.so:dns/c-ares\ - libuv.so:devel/libuv \ - libnghttp2.so:www/libnghttp2 +NLS_BUILD_DEPENDS= icu>=69.1:devel/icu +NLS_LIB_DEPENDS= libicui18n.so:devel/icu +NLS_CONFIGURE_ON= --with-intl=system-icu .include .if (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le -EXTRA_PATCHES= ${PATCHDIR}/extra-patch-common.gypi +EXTRA_PATCHES= ${PATCHDIR}/extra-patch-common.gypi .endif .if ${ARCH} == armv6 || ${ARCH} == armv7 @@ -90,7 +96,7 @@ EXTRA_PATCHES= ${PATCHDIR}/extra-patch-tools_v8__gypfiles_v8.gyp .endif .if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64 -CONFIGURE_ARGS+=--openssl-no-asm +CONFIGURE_ARGS+= --openssl-no-asm .endif post-patch: @@ -98,12 +104,12 @@ post-patch: ${WRKSRC}/tools/v8_gypfiles/v8.gyp post-configure: - # Post-process Makefile and *.mk files created by node-gyp and remove - # all occurrences of -I${LOCALBASE}/include. C*FLAGS include this - # before all -I../deps/* for bundled code. This can cause build - # breakages if the dependency is installed in ${LOCALBASE}. The - # USES+=localbase # above will ensure that we pick up includes for real - # external dependencies. +# Post-process Makefile and *.mk files created by node-gyp and remove +# all occurrences of -I${LOCALBASE}/include. C*FLAGS include this +# before all -I../deps/* for bundled code. This can cause build +# breakages if the dependency is installed in ${LOCALBASE}. The +# USES+=localbase # above will ensure that we pick up includes for real +# external dependencies. ${FIND} ${WRKSRC}/out -type f -print0 \ | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g" diff --git a/www/node14/distinfo b/www/node14/distinfo index 621d1c30712b..71b3a7548a95 100644 --- a/www/node14/distinfo +++ b/www/node14/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1634227132 -SHA256 (node-v14.18.1.tar.gz) = 89d22d34fd4ba3715252dcd2dd94d1699338436463b277163ed950040c7b621a -SIZE (node-v14.18.1.tar.gz) = 63849860 +TIMESTAMP = 1653106814 +SHA256 (node-v14.19.3.tar.gz) = 1df831a7b9d9ca76fb9af45244a309b7430bf54ba2be9d2d7b77d868ddaf0d3d +SIZE (node-v14.19.3.tar.gz) = 64983615 diff --git a/www/node14/files/patch-node.gypi b/www/node14/files/patch-node.gypi index 57871fff3e10..1b4cbf9420ab 100644 --- a/www/node14/files/patch-node.gypi +++ b/www/node14/files/patch-node.gypi @@ -1,9 +1,9 @@ ---- node.gypi.orig 2020-03-05 00:41:47 UTC +--- node.gypi.orig 2022-05-04 10:22:01 UTC +++ node.gypi -@@ -322,6 +322,9 @@ - ['openssl_fips != "" or openssl_is_fips=="true"', { - 'defines': [ 'NODE_FIPS_MODE' ], - }], +@@ -319,6 +319,9 @@ + [ 'node_use_openssl=="true"', { + 'defines': [ 'HAVE_OPENSSL=1' ], + 'conditions': [ + ['openssl_no_asm==1', { + 'defines': [ 'OPENSSL_NO_ASM' ], + }], diff --git a/www/node14/files/patch-test_parallel_test-process-versions.js b/www/node14/files/patch-test_parallel_test-process-versions.js new file mode 100644 index 000000000000..7ecfc24b0912 --- /dev/null +++ b/www/node14/files/patch-test_parallel_test-process-versions.js @@ -0,0 +1,11 @@ +--- test/parallel/test-process-versions.js.orig 2022-05-08 01:48:13 UTC ++++ test/parallel/test-process-versions.js +@@ -45,7 +45,7 @@ assert(/^\d+\.\d+\.\d+(?:\.\d+)?-node\.\d+(?: \(candid + assert(/^\d+$/.test(process.versions.modules)); + + if (common.hasCrypto) { +- assert(/^\d+\.\d+\.\d+[a-z]?(-fips)?$/.test(process.versions.openssl)); ++ assert(/^\d+\.\d+\.\d+[a-z]?(-freebsd|-fips)?$/.test(process.versions.openssl)); + } + + for (let i = 0; i < expected_keys.length; i++) { diff --git a/www/node14/pkg-plist b/www/node14/pkg-plist index 99dd57c03721..9c5cb92ea4c6 100644 --- a/www/node14/pkg-plist +++ b/www/node14/pkg-plist @@ -483,6 +483,63 @@ include/node/node_version.h %%BUNDLED_SSL%%include/node/openssl/x509err.h %%BUNDLED_SSL%%include/node/openssl/x509v3.h %%BUNDLED_SSL%%include/node/openssl/x509v3err.h +%%COREPACK%%bin/corepack +%%COREPACK%%lib/node_modules/corepack/LICENSE.md +%%COREPACK%%lib/node_modules/corepack/README.md +%%COREPACK%%lib/node_modules/corepack/dist/corepack.js +%%COREPACK%%lib/node_modules/corepack/dist/npm.js +%%COREPACK%%lib/node_modules/corepack/dist/npx.js +%%COREPACK%%lib/node_modules/corepack/dist/pnpm.js +%%COREPACK%%lib/node_modules/corepack/dist/pnpx.js +%%COREPACK%%lib/node_modules/corepack/dist/vcc.js +%%COREPACK%%lib/node_modules/corepack/dist/yarn.js +%%COREPACK%%lib/node_modules/corepack/dist/yarnpkg.js +%%COREPACK%%lib/node_modules/corepack/package.json +%%COREPACK%%lib/node_modules/corepack/shims/corepack +%%COREPACK%%lib/node_modules/corepack/shims/corepack.cmd +%%COREPACK%%lib/node_modules/corepack/shims/corepack.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/corepack +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/corepack.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/corepack.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npm +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npm.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npm.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npx +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npx.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/npx.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpm +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpm.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpm.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpx +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpx.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/pnpx.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/vcc +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/vcc.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/vcc.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarn +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarn.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarn.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarnpkg +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarnpkg.cmd +%%COREPACK%%lib/node_modules/corepack/shims/nodewin/yarnpkg.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/npm +%%COREPACK%%lib/node_modules/corepack/shims/npm.cmd +%%COREPACK%%lib/node_modules/corepack/shims/npm.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/npx +%%COREPACK%%lib/node_modules/corepack/shims/npx.cmd +%%COREPACK%%lib/node_modules/corepack/shims/npx.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/pnpm +%%COREPACK%%lib/node_modules/corepack/shims/pnpm.cmd +%%COREPACK%%lib/node_modules/corepack/shims/pnpm.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/pnpx +%%COREPACK%%lib/node_modules/corepack/shims/pnpx.cmd +%%COREPACK%%lib/node_modules/corepack/shims/pnpx.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/yarn +%%COREPACK%%lib/node_modules/corepack/shims/yarn.cmd +%%COREPACK%%lib/node_modules/corepack/shims/yarn.ps1 +%%COREPACK%%lib/node_modules/corepack/shims/yarnpkg +%%COREPACK%%lib/node_modules/corepack/shims/yarnpkg.cmd +%%COREPACK%%lib/node_modules/corepack/shims/yarnpkg.ps1 include/node/v8-fast-api-calls.h include/node/v8-internal.h include/node/v8-platform.h