Skip to content

Commit 64f2cfc

Browse files
author
Jonah Petri
committed
uclibc: fix build, enable CI, add unstable support of 64-bit time_t
1 parent f3417ae commit 64f2cfc

10 files changed

Lines changed: 254 additions & 167 deletions

File tree

.github/workflows/ci.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ jobs:
223223
- target: x86_64-unknown-linux-musl
224224
env: { RUST_LIBC_UNSTABLE_MUSL_V1_2_3: 1 }
225225
artifact-tag: new-musl
226+
- target: armv7-unknown-linux-uclibceabihf
227+
- target: armv7-unknown-linux-uclibceabihf
228+
env: { TEST_UCLIBC_TIIME64: 1 }
226229
# FIXME: It seems some items in `src/unix/mod.rs` aren't defined on redox actually.
227230
# - target: x86_64-unknown-redox
228231

build.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ fn main() {
131131
}
132132
}
133133

134+
let uclibc_use_time64 = env_flag("CARGO_CFG_LIBC_UNSTABLE_UCLIBC_TIME64");
135+
if target_env == "uclibc" && uclibc_use_time64 {
136+
set_cfg("linux_time_bits64");
137+
}
138+
134139
let linux_time_bits64 = env::var("RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64").is_ok();
135140
println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64");
136141
if linux_time_bits64 {

ci/docker/armv7-unknown-linux-uclibceabihf/Dockerfile

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,9 @@ RUN sed -i -E 's/(archive|security)\.ubuntu\.com/old-releases.ubuntu.com/g' \
1414
qemu-user \
1515
xz-utils
1616

17-
RUN mkdir /toolchain
18-
19-
RUN curl --retry 5 -L https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf--uclibc--bleeding-edge-2021.11-1.tar.bz2 | \
20-
tar xjf - -C /toolchain --strip-components=1
21-
RUN /toolchain/relocate-sdk.sh
17+
ARG TEST_UCLIBC_TIIME64
18+
COPY install-uclibc.sh /
19+
RUN /install-uclibc.sh "$TEST_UCLIBC_TIIME64"
2220

2321
ENV PATH=$PATH:/rust/bin:/toolchain/bin \
2422
STAGING_DIR=/toolchain/armv7-buildroot-linux-uclibceabihf/sysroot \

ci/install-uclibc.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/bash
2+
#
3+
# Installs the appropriate uclibc toolchain into /toolchain
4+
5+
set -eux
6+
7+
time64="$1"
8+
9+
if [ "${time64:-0}" != "0" ]; then
10+
version='bleeding-edge-2025.08-1'
11+
else
12+
version='bleeding-edge-2024.05-1' # last version with 32-bit time_t
13+
fi
14+
15+
mkdir /toolchain
16+
17+
curl --retry 5 -L "https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf--uclibc--${version}.tar.xz" | \
18+
tar xjf - -C /toolchain --strip-components=1
19+
20+
/toolchain/relocate-sdk.sh

ci/run-docker.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ run() {
4444
fi
4545
fi
4646

47+
if [[ "$run_target" = *"uclibc"* ]]; then
48+
if [ -n "${TEST_UCLIBC_TIIME64:-}" ]; then
49+
build_args+=("--build-arg=TEST_UCLIBC_TIIME64=1")
50+
export RUSTFLAGS="$RUSTFLAGS --cfg=libc_unstable_uclibc_time64"
51+
fi
52+
fi
53+
4754
# use -f so we can use ci/ as build context
4855
docker build "${build_args[@]}"
4956

libc-test/build.rs

Lines changed: 170 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3736,6 +3736,12 @@ fn test_linux(target: &str) {
37363736
cfg.cfg("musl_redir_time64", None);
37373737
}
37383738
}
3739+
let uclibc_use_time64 = env::var("CARGO_CFG_LIBC_UNSTABLE_UCLIBC_TIME64")
3740+
.map(|val| val != "0")
3741+
.unwrap_or(false);
3742+
if uclibc && uclibc_use_time64 {
3743+
cfg.cfg("linux_time_bits64", None);
3744+
}
37393745
cfg.define("_GNU_SOURCE", None)
37403746
// This macro re-defines fscanf,scanf,sscanf to link to the symbols that are
37413747
// deprecated since glibc >= 2.29. This allows Rust binaries to link against
@@ -3939,8 +3945,7 @@ fn test_linux(target: &str) {
39393945
"linux/wait.h",
39403946
"linux/wireless.h",
39413947
"sys/fanotify.h",
3942-
// <sys/auxv.h> is not present on uclibc
3943-
(!uclibc, "sys/auxv.h"),
3948+
"sys/auxv.h",
39443949
(gnu || musl, "linux/close_range.h"),
39453950
);
39463951
}
@@ -4177,6 +4182,18 @@ fn test_linux(target: &str) {
41774182
// On 64 bits the size did not change, skip only for 32 bits.
41784183
"ptrace_syscall_info" if pointer_width == 32 => true,
41794184

4185+
"canxl_frame"
4186+
| "fanotify_event_info_header" // not in sys/fanotify.h in uclibc
4187+
| "fanotify_event_info_fid" // not in sys/fanotify.h in uclibc
4188+
| "tls12_crypto_info_sm4_gcm"
4189+
| "tls12_crypto_info_sm4_ccm"
4190+
| "tls12_crypto_info_aria_gcm_128"
4191+
| "tls12_crypto_info_aria_gcm_256"
4192+
if uclibc =>
4193+
{
4194+
true
4195+
}
4196+
41804197
_ => false,
41814198
}
41824199
});
@@ -4365,18 +4382,159 @@ fn test_linux(target: &str) {
43654382
// Skip as this signal codes and trap reasons need newer headers
43664383
"TRAP_PERF" => true,
43674384

4368-
// kernel constants not available in uclibc 1.0.34
4369-
"EXTPROC"
4385+
// constants not available in uclibc 1.0.45
4386+
// but defined outside the uclibc library,
4387+
// e.g. file format constants or kernel-defined
4388+
// constants.
4389+
"ALG_SET_KEY_BY_KEY_SERIAL"
4390+
| "AT_MINSIGSTKSZ"
4391+
| "BUS_MCEERR_AO"
4392+
| "BUS_MCEERR_AR"
4393+
| "CAN_BUS_OFF_THRESHOLD"
4394+
| "CAN_CTRLMODE_TDC_AUTO"
4395+
| "CAN_CTRLMODE_TDC_MANUAL"
4396+
| "CAN_ERR_CNT"
4397+
| "CAN_ERROR_PASSIVE_THRESHOLD"
4398+
| "CAN_ERROR_WARNING_THRESHOLD"
4399+
| "CAN_RAW_XL_FRAMES"
4400+
| "CANXL_HDR_SIZE"
4401+
| "CANXL_MAX_DLC_MASK"
4402+
| "CANXL_MAX_DLC"
4403+
| "CANXL_MAX_DLEN"
4404+
| "CANXL_MAX_MTU"
4405+
| "CANXL_MIN_DLC"
4406+
| "CANXL_MIN_DLEN"
4407+
| "CANXL_MIN_MTU"
4408+
| "CANXL_MTU"
4409+
| "CANXL_PRIO_BITS"
4410+
| "CANXL_PRIO_MASK"
4411+
| "CANXL_SEC"
4412+
| "CANXL_XLF"
4413+
| "CLOSE_RANGE_CLOEXEC"
4414+
| "CLOSE_RANGE_UNSHARE"
4415+
| "EM_ARC_A5"
4416+
| "EM_OPENRISC"
4417+
| "EM_TILEGX"
4418+
| "EM_TILEPRO"
4419+
| "EXTPROC"
4420+
| "FAN_ATTRIB"
4421+
| "FAN_AUDIT"
4422+
| "FAN_CREATE"
4423+
| "FAN_DELETE_SELF"
4424+
| "FAN_DELETE"
4425+
| "FAN_ENABLE_AUDIT"
4426+
| "FAN_EPIDFD"
4427+
| "FAN_EVENT_INFO_TYPE_DFID_NAME"
4428+
| "FAN_EVENT_INFO_TYPE_DFID"
4429+
| "FAN_EVENT_INFO_TYPE_ERROR"
4430+
| "FAN_EVENT_INFO_TYPE_FID"
4431+
| "FAN_EVENT_INFO_TYPE_NEW_DFID_NAME"
4432+
| "FAN_EVENT_INFO_TYPE_OLD_DFID_NAME"
4433+
| "FAN_EVENT_INFO_TYPE_PIDFD"
4434+
| "FAN_FS_ERROR"
4435+
| "FAN_INFO"
4436+
| "FAN_MARK_EVICTABLE"
4437+
| "FAN_MARK_FILESYSTEM"
4438+
| "FAN_MARK_IGNORE_SURV"
4439+
| "FAN_MARK_IGNORE"
4440+
| "FAN_MARK_INODE"
4441+
| "FAN_MOVE_SELF"
4442+
| "FAN_MOVE"
4443+
| "FAN_MOVED_FROM"
4444+
| "FAN_MOVED_TO"
4445+
| "FAN_NOPIDFD"
4446+
| "FAN_OPEN_EXEC_PERM"
4447+
| "FAN_OPEN_EXEC"
4448+
| "FAN_RENAME"
4449+
| "FAN_REPORT_DFID_NAME_TARGET"
4450+
| "FAN_REPORT_DFID_NAME"
4451+
| "FAN_REPORT_DIR_FID"
4452+
| "FAN_REPORT_FID"
4453+
| "FAN_REPORT_NAME"
4454+
| "FAN_REPORT_PIDFD"
4455+
| "FAN_REPORT_TARGET_FID"
4456+
| "FAN_REPORT_TID"
4457+
| "FAN_RESPONSE_INFO_AUDIT_RULE"
4458+
| "FAN_RESPONSE_INFO_NONE"
4459+
| "IFF_NO_CARRIER"
4460+
| "IN_MASK_CREATE"
43704461
| "IPPROTO_BEETPH"
4462+
| "IPPROTO_ETHERNET"
43714463
| "IPPROTO_MPLS"
4464+
| "IPPROTO_MPTCP"
43724465
| "IPV6_HDRINCL"
43734466
| "IPV6_MULTICAST_ALL"
43744467
| "IPV6_PMTUDISC_INTERFACE"
43754468
| "IPV6_PMTUDISC_OMIT"
43764469
| "IPV6_ROUTER_ALERT_ISOLATE"
4470+
| "MADV_DONTNEED_LOCKED"
4471+
| "MFD_EXEC"
4472+
| "MFD_NOEXEC_SEAL"
4473+
| "NF_NETDEV_EGRESS"
4474+
| "NFQA_PRIORITY"
4475+
| "NLM_F_BULK"
4476+
| "NT_PRFPREG"
4477+
| "PACKET_FANOUT_FLAG_IGNORE_OUTGOING"
43774478
| "PACKET_MR_UNICAST"
4479+
| "PACKET_VNET_HDR_SZ"
4480+
| "POSIX_SPAWN_SETSID"
4481+
| "PR_GET_MDWE"
4482+
| "PR_MDWE_NO_INHERIT"
4483+
| "PR_MDWE_REFUSE_EXEC_GAIN"
4484+
| "PR_SCHED_CORE_SCOPE_PROCESS_GROUP"
4485+
| "PR_SCHED_CORE_SCOPE_THREAD_GROUP"
4486+
| "PR_SCHED_CORE_SCOPE_THREAD"
4487+
| "PR_SET_MDWE"
4488+
| "PR_SET_VMA_ANON_NAME"
4489+
| "PR_SET_VMA"
4490+
| "RTNLGRP_MCTP_IFADDR"
4491+
| "RTNLGRP_STATS"
4492+
| "RTNLGRP_TUNNEL"
43784493
| "RUSAGE_THREAD"
4494+
| "SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV"
4495+
| "SEM_STAT_ANY"
43794496
| "SHM_EXEC"
4497+
| "SI_DETHREAD"
4498+
| "SO_PASSPIDFD"
4499+
| "SO_PEERPIDFD"
4500+
| "SO_RCVMARK"
4501+
| "SO_RESERVE_MEM"
4502+
| "SO_TXREHASH"
4503+
| "SOF_TIMESTAMPING_OPT_ID_TCP"
4504+
| "TFD_TIMER_CANCEL_ON_SET"
4505+
| "TLS_CIPHER_ARIA_GCM_128_IV_SIZE"
4506+
| "TLS_CIPHER_ARIA_GCM_128_KEY_SIZE"
4507+
| "TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE"
4508+
| "TLS_CIPHER_ARIA_GCM_128_SALT_SIZE"
4509+
| "TLS_CIPHER_ARIA_GCM_128_TAG_SIZE"
4510+
| "TLS_CIPHER_ARIA_GCM_128"
4511+
| "TLS_CIPHER_ARIA_GCM_256_IV_SIZE"
4512+
| "TLS_CIPHER_ARIA_GCM_256_KEY_SIZE"
4513+
| "TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE"
4514+
| "TLS_CIPHER_ARIA_GCM_256_SALT_SIZE"
4515+
| "TLS_CIPHER_ARIA_GCM_256_TAG_SIZE"
4516+
| "TLS_CIPHER_ARIA_GCM_256"
4517+
| "TLS_CIPHER_SM4_CCM_IV_SIZE"
4518+
| "TLS_CIPHER_SM4_CCM_KEY_SIZE"
4519+
| "TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE"
4520+
| "TLS_CIPHER_SM4_CCM_SALT_SIZE"
4521+
| "TLS_CIPHER_SM4_CCM_TAG_SIZE"
4522+
| "TLS_CIPHER_SM4_CCM"
4523+
| "TLS_CIPHER_SM4_GCM_IV_SIZE"
4524+
| "TLS_CIPHER_SM4_GCM_KEY_SIZE"
4525+
| "TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE"
4526+
| "TLS_CIPHER_SM4_GCM_SALT_SIZE"
4527+
| "TLS_CIPHER_SM4_GCM_TAG_SIZE"
4528+
| "TLS_CIPHER_SM4_GCM"
4529+
| "TLS_INFO_RX_NO_PAD"
4530+
| "TLS_INFO_ZC_RO_TX"
4531+
| "TLS_RX_EXPECT_NO_PAD"
4532+
| "TLS_TX_ZEROCOPY_RO"
4533+
| "TRAP_BRANCH"
4534+
| "TRAP_HWBKPT"
4535+
| "TRAP_UNK"
4536+
| "TUN_F_USO4"
4537+
| "TUN_F_USO6"
43804538
| "UDP_GRO"
43814539
| "UDP_SEGMENT"
43824540
if uclibc =>
@@ -4424,6 +4582,10 @@ fn test_linux(target: &str) {
44244582
// value changed
44254583
"NF_NETDEV_NUMHOOKS" if sparc64 => true,
44264584

4585+
// Canonical uclibc latest from toolchains.bootlin.com is based on kernel 5.15,
4586+
// so opt out of tests for constants which are different in later kernels.
4587+
"NF_NETDEV_NUMHOOKS" | "RLIM_NLIMITS" | "NFT_MSG_MAX" if uclibc => true,
4588+
44274589
// kernel 6.9 minimum
44284590
"RWF_NOAPPEND" => true,
44294591

@@ -4633,8 +4795,9 @@ fn test_linux(target: &str) {
46334795
// Needs glibc 2.33 or later.
46344796
"mallinfo2" => true,
46354797

4636-
// Not defined in uclibc as of 1.0.34
4798+
// Not defined in uclibc as of 1.0.45
46374799
"gettid" if uclibc => true,
4800+
"getauxval" if uclibc => true,
46384801

46394802
// There are two versions of basename(3) on Linux with glibc, see
46404803
//
@@ -4766,7 +4929,7 @@ fn test_linux(target: &str) {
47664929
// FIXME(linux): `max_phase_adj` requires >= 5.19 kernel headers
47674930
// the rsv field shrunk when those fields got added, so is omitted too
47684931
("ptp_clock_caps", "adjust_phase" | "max_phase_adj" | "rsv")
4769-
if loongarch64 || sparc64 =>
4932+
if loongarch64 || sparc64 || uclibc =>
47704933
{
47714934
true
47724935
}
@@ -4783,7 +4946,7 @@ fn test_linux(target: &str) {
47834946
("bcm_msg_head", "frames") => true,
47844947
// FAM
47854948
("af_alg_iv", "iv") => true,
4786-
("file_handle", "f_handle") if musl => true,
4949+
("file_handle", "f_handle") if musl || uclibc => true,
47874950
// FIXME(ctest): ctest does not translate the rust code which computes the padding size
47884951
("pthread_cond_t", "__padding") if l4re => true,
47894952
_ => false,

src/unix/linux_like/linux/uclibc/arm/mod.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,24 @@ use crate::off64_t;
22
use crate::prelude::*;
33

44
pub type wchar_t = c_uint;
5-
pub type time_t = c_long;
5+
6+
cfg_if! {
7+
// Set cfg(libc_unstable_uclibc_time64) in rustflags if your uclibc has 64-bit time
8+
if #[cfg(linux_time_bits64)] {
9+
pub type time_t = c_longlong;
10+
pub type suseconds_t = c_longlong;
11+
} else {
12+
pub type time_t = c_long;
13+
pub type suseconds_t = c_long;
14+
}
15+
}
616

717
pub type clock_t = c_long;
818
pub type fsblkcnt_t = c_ulong;
919
pub type fsfilcnt_t = c_ulong;
1020
pub type ino_t = c_ulong;
1121
pub type off_t = c_long;
1222
pub type pthread_t = c_ulong;
13-
pub type suseconds_t = c_long;
1423

1524
pub type nlink_t = c_uint;
1625
pub type blksize_t = c_long;

0 commit comments

Comments
 (0)