Files
jak-project/third-party/curl/projects/vms/gnv_link_curl.com
Alexander J. Semenuk 5d5e35fb9b fix: Windows toolchain compatibility (curl 8.21 re-vendor, endless reconfigure loop) (#4355)
## Problem

Windows builds break with a current local toolchain (Scoop LLVM 22.1.8,
CMake 4.4.0, VS 2026), in two independent ways:

1. The build stops at curl's deliberate guard: `#error "no non-blocking
method was found/used/set"` in `third-party/curl/lib/nonblock.c`.
2. From the second configure onward, `cmake --build` re-runs CMake in an
endless loop (observed 42 consecutive reconfigure cycles in a single
build). Likely the same mechanism behind the "endlessly building" VS
2026 note in `docs/setup/dev/vs.md`.

## Root cause

1. `third-party/curl/CMake/CurlTests.c` passes `int *` to
`ioctlsocket()`, whose third parameter is `u_long *`. Clang 22 promotes
`-Wincompatible-pointer-types` to a hard error in C, so the
`HAVE_IOCTLSOCKET_FIONBIO` try_compile silently fails and
`curl_config.h` never defines it. Upstream CI does not see this because
the windows-2022 runner image ships an older LLVM. GCC 14 promotes the
same warning to a hard error, which is very likely the `CurlTests.c.obj`
failure reported from MSYS2 in open-goal/jak-project#3551. Upstream curl
hit the identical problem with GCC 14 and fixed the probe in curl 8.8.0
(curl/curl#13578).
2. The root CMakeLists copies the build tree's `compile_commands.json`
into `<src>/build/` for clangd using `configure_file()`, which registers
its input as a configure dependency. CMake rewrites
`compile_commands.json` late in every generation, after
`CTestTestfile.cmake` and `cmake_install.cmake` (outputs of the same
Ninja regen rule), so once the dependency is registered the rule is
deterministically dirty and every `ninja` invocation re-runs CMake. A
pristine first configure is safe (the file does not exist yet, so the
`if(EXISTS ...)` guard skips the copy), which is why the loop looks
machine- or IDE-specific.

## Fix

1. Per review, re-vendor `third-party/curl` at the `curl-8_21_0` tag
(previously `curl-8_3_0`), which carries the upstream probe fix plus two
years of upstream development; `vendor.yaml` updated to match.
Adjustments the version jump forced:
- curl 8.15 removed the native macOS Secure Transport backend
(`CURL_USE_SECTRANSP`), so macOS now builds curl against OpenSSL like
Linux. The two macOS workflows install Homebrew `openssl@3` and export
`OPENSSL_ROOT_DIR` (keg-only), and the macOS setup docs gained the same
two lines.
- `CURL_BROTLI` / `CURL_ZSTD` switched to AUTO-detection in curl 8.10;
pinned OFF to keep the previous no-compression behavior and avoid
silently linking whatever the CI images happen to have.
- curl's new top-level `BUILD_EXAMPLES` cache option (default ON) leaked
into discord-rpc's identically named option and broke configure at a
nonexistent `examples/send-presence` directory; pinned OFF ahead of the
third-party subdirectories.

The diff is dominated by the mechanical tag-tree swap under
`third-party/curl` (linguist-vendored, collapsed in review). The
hand-written changes are `CMakeLists.txt`, the two macOS workflows,
`docs/setup/system/macos.md`, and `vendor.yaml`.
2. Swap `configure_file()` for `file(COPY ...)`: the same clangd copy
with no configure dependency registered. (`file(COPY_FILE ...
ONLY_IF_DIFFERENT)` would be cleaner still but requires CMake 3.21,
above the declared `cmake_minimum_required(VERSION 3.10)`.)

## Test plan

- [x] Fresh `cmake --preset Release-windows-clang` (LLVM 22, no cache
seeding) completes and logs `Enabled SSL backends: Schannel`; the
FIONBIO probe passes without the previous `#error`
- [x] Full Windows Release build from scratch in the branch worktree
(all 1422 targets)
- [x] goalc-test suite: 1509 passed, 0 failed
- [x] Second consecutive configure with `compile_commands.json` present:
the regen rule in `build.ninja` has no `compile_commands.json` input;
`<src>/build/compile_commands.json` is still refreshed for clangd
- [x] Repeated `ninja` invocations after a full build no longer re-run
CMake
- [x] macOS Intel and ARM CI green (first exercise of the OpenSSL
backend switch)

---

I work off a self-hosted forge, so this GitHub account is quiet; the
configure logs and ninja dirty-node traces from the investigation are
available if anyone wants the raw data.

(AI-assisted)
2026-07-27 19:19:18 -04:00

852 lines
25 KiB
Plaintext
Vendored
Generated

$! File: gnv_link_curl.com
$!
$! File to build images using gnv$libcurl.exe
$!
$! Copyright (C) John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
$! copyright notice and this permission notice appear in all copies.
$!
$! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
$! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
$! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
$! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
$! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
$! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
$! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
$!
$! SPDX-License-Identifier: ISC
$!
$!============================================================================
$!
$! Save this so we can get back.
$ default_dir = f$environment("default")
$ define/job gnv_packages_vms 'default_dir'
$!
$ on warning then goto all_exit
$!
$! On VAX, we need to generate a Macro transfer vector.
$ parse_style = "TRADITIONAL"
$ if (f$getsyi("HW_MODEL") .lt. 1024)
$ then
$ @generate_vax_transfer.com
$ arch_name = "VAX"
$ else
$ arch_name = ""
$ arch_name = arch_name + f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
$ if (arch_name .eqs. "") then arch_name = "UNK"
$!
$! Extended parsing option starts with VMS 7.3-1.
$! There is no 7.4, so that simplifies the parse a bit.
$!
$ node_swvers = f$getsyi("node_swvers")
$ version_patch = f$extract(1, f$length(node_swvers), node_swvers)
$ maj_ver = f$element(0, ".", version_patch)
$ min_ver_patch = f$element(1, ".", version_patch)
$ min_ver = f$element(0, "-", min_ver_patch)
$ patch = f$element(1, "-", min_ver_patch)
$ if patch .eqs. "-" then patch = ""
$ parse_x = 0
$ if maj_ver .ges. "8"
$ then
$ parse_x = 1
$ else
$ if maj_ver .eqs. "7" .and. min_ver .ges. "3" .and. patch .nes. ""
$ then
$ parse_x = 1
$ endif
$ endif
$ if parse_x
$ then
$ parse_style = f$getjpi("", "parse_style_perm")
$ endif
$ endif
$!
$!
$! Move to where the base directories.
$ set def [--]
$!
$!
$! Build the Message file.
$!--------------------------
$ if f$search("[.projects.vms]curlmsg.obj") .eqs. ""
$ then
$ message [.projects.vms]curlmsg.msg/object=[.projects.vms]
$ endif
$ if f$search("gnv$curlmsg.exe") .eqs. ""
$ then
$ link/share=gnv$curlmsg.exe [.projects.vms]curlmsg.obj
$ endif
$!
$!
$! Need to build the common init module.
$!-------------------------------------------
$ cflags = "/list/show=(expan,includ)"
$ init_obj = "[.projects.vms]curl_crtl_init.obj"
$ if f$search(init_obj) .eqs. ""
$ then
$ cc'cflags' 'default_dir'curl_crtl_init.c/obj='init_obj'
$ endif
$ purge 'init_obj'
$ rename 'init_obj' ;1
$!
$!
$! Need to build the module to test the HP OpenSSL version
$!--------------------------------------------------------
$ if arch_name .nes. "VAX"
$ then
$ rpt_obj = "[.projects.vms]report_openssl_version.obj
$ if f$search(rpt_obj) .eqs. ""
$ then
$ cc'cflags' 'default_dir'report_openssl_version.c/obj='rpt_obj'
$ endif
$ purge 'rpt_obj'
$ rename 'rpt_obj' ;1
$!
$ link/exe='default_dir'report_openssl_version.exe 'rpt_obj'
$ report_openssl_version := $'default_dir'report_openssl_version.exe
$ endif
$!
$!
$ base_link_opt_file = "[.projects.vms.''arch_name']gnv_libcurl_linker.opt"
$ share_link_opt_file = "[.projects.vms.''arch_name']gnv_ssl_libcurl_linker.opt"
$ if f$search(base_link_opt_file) .eqs. ""
$ then
$ base_link_opt_file = "[.projects.vms]gnv_libcurl_linker.opt"
$ share_link_opt_file = "[.projects.vms]gnv_ssl_libcurl_linker.opt"
$ if f$search(base_link_opt_file) .eqs. ""
$ then
$ write sys$output "Can not find base library option file!"
$ goto all_exit
$ endif
$ endif
$!
$! Create the a new option file with special fixup for HP SSL
$! For a shared image, we always want ZLIB and 32-bit HPSSL
$!
$ if f$search("gnv$libzshr32") .eqs. ""
$ then
$ write sys$output "VMSPORTS/GNV LIBZ Shared image not found!"
$ goto all_exit
$ endif
$!
$!
$! Need to check the version of the HP SSL shared image.
$!
$! VAX platform can not be checked this way, it appears symbol lookup
$! was disabled. VAX has not been updated in a while.
$ if arch_name .eqs. "VAX"
$ then
$ hp_ssl_libcrypto32 = "sys$common:[syslib]ssl$libcrypto_shr32.exe"
$ hp_ssl_libssl32 = "sys$common:[syslib]ssl$libssl_shr32.exe"
$ if f$search(hp_ssl_libcrypto32) .nes. ""
$ then
$ use_hp_ssl = 1
$ curl_ssl_libcrypto32 = hp_ssl_libcrypto32
$ curl_ssl_libssl32 = hp_ssl_libssl32
$ curl_ssl_version = "OpenSSL/0.9.6g"
$ else
$ write sys$output "HP OpenSSL Shared images not found!"
$ goto all_exit
$ endif
$ else
$!
$! Minimum HP version we can use reports:
$! "OpenSSL 0.9.8w 23 Apr 2012"
$!
$ use_hp_ssl = 0
$ hp_ssl_libcrypto32 = "sys$share:ssl$libcrypto_shr32.exe"
$ hp_ssl_libssl32 = "sys$share:ssl$libssl_shr32.exe"
$ if f$search(hp_ssl_libcrypto32) .nes. ""
$ then
$ curl_ssl_libcrypto32 = hp_ssl_libcrypto32
$ curl_ssl_libssl32 = hp_ssl_libssl32
$ report_openssl_version 'hp_ssl_libcrypto32' hp_ssl_version
$ endif
$!
$ if f$type(hp_ssl_version) .eqs. "STRING"
$ then
$ curl_ssl_version = hp_ssl_version
$ full_version = f$element(1, " ", hp_ssl_version)
$ ver_maj = f$element(0, ".", full_version)
$ ver_min = f$element(1, ".", full_version)
$ ver_patch = f$element(2, ".", full_version)
$! ! ver_patch is typically both a number and some letters
$ ver_patch_len = f$length(ver_patch)
$ ver_patchltr = ""
$ver_patch_loop:
$ ver_patchltr_c = f$extract(ver_patch_len - 1, 1, ver_patch)
$ if ver_patchltr_c .les. "9" then goto ver_patch_loop_end
$ ver_patchltr = ver_patchltr_c + ver_patchltr
$ ver_patch_len = ver_patch_len - 1
$ goto ver_patch_loop
$ver_patch_loop_end:
$ ver_patchnum = ver_patch - ver_patchltr
$ if 'ver_maj' .ge. 0
$ then
$ if 'ver_min' .ge. 9
$ then
$ if 'ver_patchnum' .ge. 8
$ then
$ if ver_patchltr .ges. "w" then use_hp_ssl = 1
$ endif
$ endif
$ endif
$set nover
$ if use_hp_ssl .eq. 0
$ then
$ write sys$output -
" HP OpenSSL version of ""''hp_ssl_version'"" is too old for shared libcurl!"
$ endif
$ else
$ write sys$output "Unable to get version of HP OpenSSL"
$ endif
$!
$ gnv_ssl_libcrypto32 = "gnv$gnu:[lib]ssl$libcrypto_shr32.exe"
$ gnv_ssl_libssl32 = "gnv$gnu:[lib]ssl$libssl_shr32.exe"
$ if f$search(gnv_ssl_libcrypto32) .nes. ""
$ then
$ report_openssl_version 'gnv_ssl_libcrypto32' gnv_ssl_version
$ endif
$!
$ use_gnv_ssl = 0
$ if f$type(gnv_ssl_version) .eqs. "STRING"
$ then
$ gnv_full_version = f$element(1, " ", gnv_ssl_version)
$ gnv_ver_maj = f$element(0, ".", gnv_full_version)
$ gnv_ver_min = f$element(1, ".", gnv_full_version)
$ gnv_ver_patch = f$element(2, ".", gnv_full_version)
$ gnv_ver_patch_len = f$length(gnv_ver_patch)
$ gnv_ver_patchnum = f$extract(0, gnv_ver_patch_len - 1, gnv_ver_patch)
$ gnv_ver_patchltr = f$extract(gnv_ver_patch_len - 1, 1, gnv_ver_patch)
$ if 'gnv_ver_maj' .ge. 0
$ then
$ if 'gnv_ver_min' .ge. 9
$ then
$ if 'gnv_ver_patchnum' .ge. 8
$ then
$ if gnv_ver_patchltr .ges. "w" then use_gnv_ssl = 1
$ endif
$ endif
$ endif
$ if use_gnv_ssl .eq. 0
$ then
$ write sys$output -
"GNV OpenSSL version of ""''gnv_ssl_version'" is too old for shared libcurl!"
$ endif
$!
$! Prefer to break the tie with the lowest supported version
$! For simplicity, if the GNV image is present, it will be used.
$! Version tuple is not a simple compare.
$!
$ if use_gnv_ssl .eq. 1 then
$ curl_ssl_libcrypto32 = gnv_ssl_libcrypto32
$ curl_ssl_libssl32 = gnv_ssl_libssl32
$ curl_ssl_version = gnv_ssl_version
$ use_hp_ssl = 0
$ endif
!$!
$ else
$ write sys$output "Unable to get version of GNV OpenSSL"
$ endif
$!
$! Need to write a release note section about HP OpenSSL
$!
$create 'default_dir'hp_ssl_release_info.txt
$deck
This package is built on with the OpenSSL version listed below and requires
the shared images from the HP OpenSSL product that is kitted with that
version or a compatible later version.
For Alpha and IA64 platforms, see the URL below to register to get the
download URL. The kit will be HP 1.4-467 or later.
https://h41379.www4.hpe.com/openvms/products/ssl/ssl.html
For VAX, use the same registration, but remove the kit name from any of the
download URLs provided and put in CPQ-VAXVMS-SSL-V0101-B-1.PCSI-DCX_VAXEXE
If your system can not be upgraded to a compatible version of OpenSSL, then
you can extract the two shared images from the kit and place them in the
[vms$common.gnv.lib]directory of the volume that you are installing GNV and
or GNV compatible components like curl.
If GNV is installed, you must run the GNV startup procedure before these steps
and before installing curl.
1. make sure that [vms$common.gnv.lib] exists by using the following
commands. We want the directory to be in lowercase except on VAX.
$SET PROCESS/PARSE=extend !If not VAX.
$CREATE/DIR device:[vms$common.gnv.lib]/prot=w:re
2. Extract the ssl$crypto_shr32.exe and ssl$libssl_shr32.exe images.
$PRODUCT EXTRACT FILE -
/select=(ssl$libcrypto_shr32.exe,ssl$libssl_shr32.exe)-
/source=device:[dir] -
/options=noconfirm -
/destination=device:[vms$common.gnv.lib] SSL
The [vms$common.sys$startup}curl_startup.com procedure will then configure
libcurl to use these shared images instead of the system ones.
When you upgrade SSL on VMS to the newer version of HP SSL, then these copies
should be deleted.
$eod
$!
$ open/append sslr 'default_dir'hp_ssl_release_info.txt
$ write sslr "OpenSSL version used for building this kit: ",curl_ssl_version
$ write sslr ""
$ close sslr
$!
$!
$! LIBZ
$ libzshr_line = ""
$ try_shr = "gnv$libzshr32"
$ if f$search(try_shr) .nes. ""
$ then
$ libzshr_line = "''try_shr'/share"
$ else
$ write sys$output "''try_shr' image not found!"
$ goto all_exit
$ endif
$!
$!
$ gssrtlshr_line = ""
$ if arch_name .nes. "VAX"
$ then
$ try_shr = "sys$share:gss$rtl"
$ if f$search("''try_shr'.exe") .nes. ""
$ then
$ gssrtlshr_line = "''try_shr'/share"
$ else
$ write sys$output "''try_shr' image not found!"
$ goto all_exit
$ endif
$ endif
$!
$!
$!
$ if f$search(share_link_opt_file) .eqs. ""
$ then
$ create 'share_link_opt_file'
$ open/append slopt 'share_link_opt_file'
$ if libzshr_line .nes. "" then write slopt libzshr_line
$ if gssrtlshr_line .nes. "" then write slopt gssrtlshr_line
$ write slopt "gnv$curl_ssl_libcryptoshr32/share"
$ write slopt "gnv$curl_ssl_libsslshr32/share"
$ close slopt
$ endif
$!
$! DCL build puts curllib in architecture directory
$! GNV build uses the makefile.
$ libfile = "[.projects.vms.''arch_name']curllib.olb"
$ if f$search(libfile) .nes. ""
$ then
$ olb_file = libfile
$ else
$ ! GNV based build
$ libfile = "[.lib.^.libs]libcurl.a"
$ if f$search(libfile) .nes. ""
$ then
$ olb_file = libfile
$ else
$ write sys$output -
"Can not build shared image, libcurl object library not found!"
$ goto all_exit
$ endif
$ endif
$!
$gnv_libcurl_share = "''default_dir'gnv$libcurl.exe"
$!
$ if f$search(gnv_libcurl_share) .eqs. ""
$ then
$ if arch_name .nes. "VAX"
$ then
$ define/user gnv$curl_ssl_libcryptoshr32 'curl_ssl_libcrypto32'
$ define/user gnv$curl_ssl_libsslshr32 'curl_ssl_libssl32'
$ link/dsf='default_dir'gnv$libcurl.dsf/share='gnv_libcurl_share' -
/map='default_dir'gnv$libcurl.map -
gnv_packages_vms:gnv_libcurl_symbols.opt/opt,-
'olb_file'/lib,-
'share_link_opt_file'/opt
$ else
$! VAX will not allow the logical name hack for the
$! SSL libcryto library, it is pulling it in twice if I try it.
$ link/share='gnv_libcurl_share'/map='default_dir'gnv$libcurl.map -
gnv_packages_vms:gnv_libcurl_xfer.opt/opt,-
'olb_file'/lib,-
'base_link_opt_file'/opt
$ endif
$ endif
$!
$!
$ if f$search("[.src]curl-tool_main.o") .nes. ""
$ then
$! From src/makefile.inc:
$! # libcurl has sources that provide functions named curlx_* that are not
$! # part of the official API, but we reuse the code here to avoid
$! # duplication.
$!
$!
$ if f$search("[.src]curl.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.src]curl.exe/dsf=[.src]curl.dsf -
[.src]curl-tool_main.o, -
[.src]curl-tool_bname.o, [.src]curl-tool_cb_dbg.o, -
[.src]curl-tool_cb_hdr.o, [.src]curl-tool_cb_prg.o, -
[.src]curl-tool_cb_rea.o, [.src]curl-tool_cb_see.o, -
[.src]curl-tool_cb_soc.o, -
[.src]curl-tool_cb_wrt.o, [.src]curl-tool_cfgable.o, -
[.src]curl-tool_convert.o, [.src]curl-tool_dirhie.o, -
[.src]curl-tool_doswin.o, [.src]curl-tool_easysrc.o, -
[.src]curl-tool_formparse.o, [.src]curl-tool_getparam.o, -
[.src]curl-tool_getpass.o, [.src]curl-tool_help.o, -
[.src]curl-tool_helpers.o, [.src]curl-tool_homedir.o, -
[.src]curl-tool_hugehelp.o, [.src]curl-tool_libinfo.o, -
[.src]curl-tool_mfiles.o, -
[.src]curl-tool_msgs.o, [.src]curl-tool_operate.o, -
[.src]curl-tool_operhlp.o, -
[.src]curl-tool_paramhlp.o, [.src]curl-tool_parsecfg.o, -
[.src]curl-tool_setopt.o, -
[.src]curl-tool_urlglob.o, [.src]curl-tool_util.o, -
[.src]curl-tool_vms.o, [.src]curl-tool_writeenv.o, -
[.src]curl-tool_writeout.o, [.src]curl-tool_xattr.o, -
[.src]curl-nonblock.o, gnv_packages_vms:curlmsg.obj,-
sys$input:/opt
gnv$libcurl/share
gnv_packages_vms:curl_crtl_init.obj
$ endif
$ else
$ curl_exe = "[.src]curl.exe"
$ curl_dsf = "[.src]curl.dsf"
$ curl_main = "[.projects.vms.''arch_name']tool_main.obj"
$ curl_src = "[.projects.vms.''arch_name']curlsrc.olb"
$ curl_lib = "[.projects.vms.''arch_name']curllib.olb"
$ strcase = "strcase"
$ nonblock = "nonblock"
$ warnless = "warnless"
$!
$! Extended parse style requires special quoting
$!
$ if (arch_name .nes. "VAX") .and. (parse_style .eqs. "EXTENDED")
$ then
$ strcase = """strcase"""
$ nonblock = """nonblock"""
$ warnless = """warnless"""
$ endif
$ if f$search(curl_exe) .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe='curl_exe'/dsf='curl_dsf' -
'curl_main','curl_src'/lib, -
'curl_lib'/library/include=-
('strcase','nonblock','warnless'),-
gnv_packages_vms:curlmsg.obj,-
sys$input:/opt
gnv$libcurl/share
gnv_packages_vms:curl_crtl_init.obj
$ endif
$ endif
$!
$!
$!
$! in6addr_missing so skip building:
$! [.server]sws.o
$! [.server]sockfilt.o
$! [.server]tftpd.o
$!
$!
$ target = "10-at-a-time"
$ if f$search("[.docs.examples]''target'.o") .eqs. ""
$ then
$ write sys$output "examples not built"
$ goto all_exit
$ endif
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "anyauthput"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "certinfo"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "cookie_interface"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "debug"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "fileupload"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "fopen"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$target = "ftpget"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "ftpgetresp"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "ftpupload"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "getinfo"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "getinmemory"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "http-post"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "httpcustomheader"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "httpput"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "https"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-app"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-debugcallback"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-double"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-post"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-single"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "persistent"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "post-callback"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "postit2"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "sendrecv"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "sepheaders"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simple"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simplepost"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simplessl"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$! =============== End of docs/examples =========================
$!
$!
$all_exit:
$set def 'default_dir'
$exit '$status'
$!