curlをビルドする

## 概要
Oracle Linuxにて、リリース7ではcurl 7.29。最新は8.14とのこと。timeout の細かい制御が求められており、古いリリースでは必要コネクション確立までのオプションが有効に働かないことも判明している。curlをビルドしたので、その過程などを備忘録も兼ねて残す。

### 環境
クラウドでも、オンプレでもお好きな場所で。

### ゴール設定
```
#curl -V
curl 8.14.1 (aarch64-unknown-linux-gnu) libcurl/8.14.1 OpenSSL/3.1.4
Release-Date: 2025-06-04
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile NTLM SSL threadsafe TLS-SRP UnixSockets
```

- pkg-config >= 0.20
ただし、OracleLinux7.9では見つからなかった

- autoconf
- automake
- libtool
- m4
- libpsl-devel
- perl-IPC-Cmd


```bash
yum install autoconf automake libtool m4 groff libpsl-devel perl-IPC-Cmd
```

### quictlsのビルド
[curlの手順書](https://github.com/curl/curl/blob/master/docs/HTTP3.md#build-with-quictls)どおりにビルドする。

```bash
git clone --depth 1 -b openssl-3.1.4+quic https://github.com/quictls/openssl
cd openssl
# ./config enable-tls1_3 --prefix=<somewhere1>
./config enable-tls1_3 --prefix=$PWD/build
make
make install
```

### curlのビルド
最後にcurl本体のビルドです。これも基本は[curlの手順書](https://github.com/curl/curl/blob/master/docs/HTTP3.md#build-with-quictls)通りに実行しました。

最後のmake installだけ、そのまま実行するとエラーになってしまう。エラー内容がインストールする権限に依存するものだったため、sudoをつけて実行すると最後まで動作される。

「pkg-config」については「--without-libpsl」で逃げます。

```bash
cd ..
#git clone https://github.com/curl/curl
#これだと、DEVになるため、Version固定する
wget https://curl.se/download/curl-8.14.1.tar.gz
cd curl-8.14.1
autoreconf -fi
LDFLAGS="-Wl,-rpath,$PWD/../openssl/build/lib" ./configure --with-openssl=$PWD/../openssl/build  --without-libpsl
make
# make install
sudo make install
```

これにてcurlをビルドすることができました。実行ファイルは`/usr/local/bin/curl`もしくは、上の操作時点からフォルダを移動していなければ`./src/curl`にもありました。

## curlの動作確認
curlの動作を確認します。

```bash
curl https://www.google.com -v 1> /dev/null
```

結果として、以下のような記述が見られれば成功

```bash
curl  https://www.google.com -v 1> /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host www.google.com:443 was resolved.
* IPv6: 2404:6800:4004:822::2004
* IPv4: 172.217.174.100
*   Trying [2404:6800:4004:822::2004]:443...
* Immediate connect fail for 2404:6800:4004:822::2004: Network is unreachable
*   Trying 172.217.174.100:443...
* ALPN: curl offers http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [21 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3813 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / id-ecPublicKey
* ALPN: server accepted http/1.1
* Server certificate:
*  subject: CN=www.google.com
*  start date: May 19 08:43:37 2025 GMT
*  expire date: Aug 11 08:43:36 2025 GMT
*  subjectAltName: host "www.google.com" matched cert's "www.google.com"
*  issuer: C=US; O=Google Trust Services; CN=WR2
*  SSL certificate verify ok.
*   Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha384WithRSAEncryption
* Connected to www.google.com (172.217.174.100) port 443
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [288 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [288 bytes data]
< HTTP/1.1 200 OK
< Date: Thu, 19 Jun 2025 10:55:44 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-XO4CyauHww41TZgKnFauSg' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
< Accept-CH: Sec-CH-Prefers-Color-Scheme
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: AEC=AVh_V2h0x28I5tDaO_6b7T3-e28ZgnEkBaKObcQASXNwe2DNjSD5UCj4og; expires=Tue, 16-Dec-2025 10:55:44 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
< Set-Cookie: NID=525=S0hN59WkJ45bMxSdGutzetriwDM4Mcg-LUXIPwWJm_iCBWg3DP1HE8eje9i-ejrmumR7W4799vzrjJ01_OSELeIFjy0zu-1Huw6AKJiIgoJramgge1LHYJImXTKcD_wbkNJBLd6ix4jJ3wbWk2fQ1mHTln2f8dD3Ro493t5rjB146ySd-BX5jgte5KitDO7xpmbglwYSJlivHCPs5w; expires=Fri, 19-Dec-2025 10:55:44 GMT; path=/; domain=.google.com; HttpOnly
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [199 bytes data]
100 18827    0 18827    0     0  90584      0 --:--:-- --:--:-- --:--:-- 90951
* Connection #0 to host www.google.com left intact
```