-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc] Add unistd overlay #119312
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc] Add unistd overlay #119312
Conversation
@llvm/pr-subscribers-libc Author: Tristan Ross (RossComputerGuy) ChangesReverts the revert #119295 of #118882 by expanding #118882 with additional fixes which made CI unhappy. Full diff: https://github.com/llvm/llvm-project/pull/119312.diff 33 Files Affected:
diff --git a/libc/hdr/CMakeLists.txt b/libc/hdr/CMakeLists.txt
index 5eb311f4bb2298..7f523c50e86943 100644
--- a/libc/hdr/CMakeLists.txt
+++ b/libc/hdr/CMakeLists.txt
@@ -126,10 +126,13 @@ add_proxy_header_library(
libc.include.llvm-libc-macros.sys_stat_macros
)
+add_header_library(unistd_overlay HDRS unistd_overlay.h)
add_proxy_header_library(
unistd_macros
HDRS
unistd_macros.h
+ DEPENDS
+ .unistd_overlay
FULL_BUILD_DEPENDS
libc.include.unistd
libc.include.llvm-libc-macros.unistd_macros
diff --git a/libc/hdr/unistd_macros.h b/libc/hdr/unistd_macros.h
index 132e123280139f..5c2b24354dd3ee 100644
--- a/libc/hdr/unistd_macros.h
+++ b/libc/hdr/unistd_macros.h
@@ -15,7 +15,7 @@
#else // Overlay mode
-#include <unistd.h>
+#include "unistd_overlay.h"
#endif // LLVM_LIBC_FULL_BUILD
diff --git a/libc/hdr/unistd_overlay.h b/libc/hdr/unistd_overlay.h
new file mode 100644
index 00000000000000..e3001e0cda08f5
--- /dev/null
+++ b/libc/hdr/unistd_overlay.h
@@ -0,0 +1,69 @@
+//===-- Including unistd.h in overlay mode -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_HDR_UNISTD_OVERLAY_H
+#define LLVM_LIBC_HDR_UNISTD_OVERLAY_H
+
+#ifdef LIBC_FULL_BUILD
+#error "This header should only be included in overlay mode"
+#endif
+
+// Overlay mode
+
+// glibc <unistd.h> header might provide extern inline definitions for few
+// functions, causing external alias errors. They are guarded by
+// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES`
+// macro by defining `__NO_INLINE__` before including <stdio.h>.
+// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled
+// with `_FORTIFY_SOURCE`.
+
+#ifdef _FORTIFY_SOURCE
+#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#ifdef __USE_EXTERN_INLINES
+#define LIBC_OLD_USE_EXTERN_INLINES
+#undef __USE_EXTERN_INLINES
+#endif
+
+#ifdef __USE_FORTIFY_LEVEL
+#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL
+#undef __USE_FORTIFY_LEVEL
+#define __USE_FORTIFY_LEVEL 0
+#endif
+
+#ifndef __NO_INLINE__
+#define __NO_INLINE__ 1
+#define LIBC_SET_NO_INLINE
+#endif
+
+#include <unistd.h>
+
+#ifdef LIBC_OLD_FORTIFY_SOURCE
+#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE
+#undef LIBC_OLD_FORTIFY_SOURCE
+#endif
+
+#ifdef LIBC_SET_NO_INLINE
+#undef __NO_INLINE__
+#undef LIBC_SET_NO_INLINE
+#endif
+
+#ifdef LIBC_OLD_USE_FORTIFY_LEVEL
+#undef __USE_FORTIFY_LEVEL
+#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL
+#undef LIBC_OLD_USE_FORTIFY_LEVEL
+#endif
+
+#ifdef LIBC_OLD_USE_EXTERN_INLINES
+#define __USE_EXTERN_INLINES
+#undef LIBC_OLD_USE_EXTERN_INLINES
+#endif
+
+#endif // LLVM_LIBC_HDR_UNISTD_OVERLAY_H
diff --git a/libc/src/unistd/dup.h b/libc/src/unistd/dup.h
index 63f093c0ee4365..57601455acc61c 100644
--- a/libc/src/unistd/dup.h
+++ b/libc/src/unistd/dup.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP_H
#define LLVM_LIBC_SRC_UNISTD_DUP_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/dup2.h b/libc/src/unistd/dup2.h
index 060c112daf08fb..e2cf62389bca87 100644
--- a/libc/src/unistd/dup2.h
+++ b/libc/src/unistd/dup2.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP2_H
#define LLVM_LIBC_SRC_UNISTD_DUP2_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/dup3.h b/libc/src/unistd/dup3.h
index f3868867123b43..06d9b23dbd200f 100644
--- a/libc/src/unistd/dup3.h
+++ b/libc/src/unistd/dup3.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP3_H
#define LLVM_LIBC_SRC_UNISTD_DUP3_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/fork.h b/libc/src/unistd/fork.h
index b6fd5763b3a5f6..f55ec740cfb12c 100644
--- a/libc/src/unistd/fork.h
+++ b/libc/src/unistd/fork.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_FORK_H
#define LLVM_LIBC_SRC_UNISTD_FORK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/ftruncate.h b/libc/src/unistd/ftruncate.h
index cd8d363727c4ad..e22df0efee50ec 100644
--- a/libc/src/unistd/ftruncate.h
+++ b/libc/src/unistd/ftruncate.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_FTRUNCATE_H
#define LLVM_LIBC_SRC_UNISTD_FTRUNCATE_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/off_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getcwd.h b/libc/src/unistd/getcwd.h
index 8b63a91c26b5c7..36ca48141b93fb 100644
--- a/libc/src/unistd/getcwd.h
+++ b/libc/src/unistd/getcwd.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETCWD_H
#define LLVM_LIBC_SRC_UNISTD_GETCWD_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/geteuid.h b/libc/src/unistd/geteuid.h
index 9469797bd3d4ef..a6f32c6a772d05 100644
--- a/libc/src/unistd/geteuid.h
+++ b/libc/src/unistd/geteuid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETEUID_H
#define LLVM_LIBC_SRC_UNISTD_GETEUID_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/uid_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getopt.h b/libc/src/unistd/getopt.h
index 1be3331dcd98a4..0be639d8711961 100644
--- a/libc/src/unistd/getopt.h
+++ b/libc/src/unistd/getopt.h
@@ -10,8 +10,8 @@
#define LLVM_LIBC_SRC_UNISTD_GETOPT_H
#include "hdr/types/FILE.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getpid.h b/libc/src/unistd/getpid.h
index c3c55b0c06b108..d99a31a6ad0685 100644
--- a/libc/src/unistd/getpid.h
+++ b/libc/src/unistd/getpid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETPID_H
#define LLVM_LIBC_SRC_UNISTD_GETPID_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/pid_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getppid.h b/libc/src/unistd/getppid.h
index d820791bc06fad..55804503b0500c 100644
--- a/libc/src/unistd/getppid.h
+++ b/libc/src/unistd/getppid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETPPID_H
#define LLVM_LIBC_SRC_UNISTD_GETPPID_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/pid_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getuid.h b/libc/src/unistd/getuid.h
index dd82c7119d4017..93dc80494c05a7 100644
--- a/libc/src/unistd/getuid.h
+++ b/libc/src/unistd/getuid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETUID_H
#define LLVM_LIBC_SRC_UNISTD_GETUID_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/uid_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/isatty.h b/libc/src/unistd/isatty.h
index 6dd1b7b817171a..5c8be6541c99cb 100644
--- a/libc/src/unistd/isatty.h
+++ b/libc/src/unistd/isatty.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_ISATTY_H
#define LLVM_LIBC_SRC_UNISTD_ISATTY_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/link.h b/libc/src/unistd/link.h
index 9b27aa1accf4ea..c1c26c5e0d4948 100644
--- a/libc/src/unistd/link.h
+++ b/libc/src/unistd/link.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_LINK_H
#define LLVM_LIBC_SRC_UNISTD_LINK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/ftruncate.cpp b/libc/src/unistd/linux/ftruncate.cpp
index 39cb3b5778faaf..ccbb0634664aad 100644
--- a/libc/src/unistd/linux/ftruncate.cpp
+++ b/libc/src/unistd/linux/ftruncate.cpp
@@ -11,11 +11,11 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
#include <stdint.h> // For uint64_t.
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/lseek.cpp b/libc/src/unistd/linux/lseek.cpp
index 9486cecf3b1234..0e957498da7460 100644
--- a/libc/src/unistd/linux/lseek.cpp
+++ b/libc/src/unistd/linux/lseek.cpp
@@ -14,8 +14,8 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
+#include "hdr/types/off_t.h"
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h> // For off_t.
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/sysconf.cpp b/libc/src/unistd/linux/sysconf.cpp
index 1540eb499ec12d..f785ff321c7d7e 100644
--- a/libc/src/unistd/linux/sysconf.cpp
+++ b/libc/src/unistd/linux/sysconf.cpp
@@ -10,11 +10,11 @@
#include "src/__support/common.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
#include "src/sys/auxv/getauxval.h"
#include <sys/auxv.h>
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/truncate.cpp b/libc/src/unistd/linux/truncate.cpp
index 283cf4098cf457..8236edb480d108 100644
--- a/libc/src/unistd/linux/truncate.cpp
+++ b/libc/src/unistd/linux/truncate.cpp
@@ -13,9 +13,9 @@
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
+#include "hdr/unistd_macros.h"
#include <stdint.h> // For uint64_t.
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/lseek.h b/libc/src/unistd/lseek.h
index a8704ec7058dd2..4b8ecf173c338f 100644
--- a/libc/src/unistd/lseek.h
+++ b/libc/src/unistd/lseek.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_LSEEK_H
#define LLVM_LIBC_SRC_UNISTD_LSEEK_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/off_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/pread.h b/libc/src/unistd/pread.h
index 4723675e82a20a..e2cfce6b53ed5f 100644
--- a/libc/src/unistd/pread.h
+++ b/libc/src/unistd/pread.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_PREAD_H
#define LLVM_LIBC_SRC_UNISTD_PREAD_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/pwrite.h b/libc/src/unistd/pwrite.h
index baffbe48b64371..2f5646b048ec96 100644
--- a/libc/src/unistd/pwrite.h
+++ b/libc/src/unistd/pwrite.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_PWRITE_H
#define LLVM_LIBC_SRC_UNISTD_PWRITE_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/read.h b/libc/src/unistd/read.h
index 01231cb82e35e5..a12c49e4254eca 100644
--- a/libc/src/unistd/read.h
+++ b/libc/src/unistd/read.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READ_H
#define LLVM_LIBC_SRC_UNISTD_READ_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/readlink.h b/libc/src/unistd/readlink.h
index a73e9740c74637..9047097f46b24a 100644
--- a/libc/src/unistd/readlink.h
+++ b/libc/src/unistd/readlink.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READLINK_H
#define LLVM_LIBC_SRC_UNISTD_READLINK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/readlinkat.h b/libc/src/unistd/readlinkat.h
index 6bdd48b537fc8c..10fd8bb6a14b8d 100644
--- a/libc/src/unistd/readlinkat.h
+++ b/libc/src/unistd/readlinkat.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READLINKAT_H
#define LLVM_LIBC_SRC_UNISTD_READLINKAT_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/swab.h b/libc/src/unistd/swab.h
index caa9c71001097b..f6fa3414c43f55 100644
--- a/libc/src/unistd/swab.h
+++ b/libc/src/unistd/swab.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SWAB_H
#define LLVM_LIBC_SRC_UNISTD_SWAB_H
+#include "hdr/types/ssize_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h> // For ssize_t
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/symlink.h b/libc/src/unistd/symlink.h
index 47f04f8845b460..c743a32a8930f9 100644
--- a/libc/src/unistd/symlink.h
+++ b/libc/src/unistd/symlink.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYMLINK_H
#define LLVM_LIBC_SRC_UNISTD_SYMLINK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/symlinkat.h b/libc/src/unistd/symlinkat.h
index 9f8ad517af5a62..6697ce4d537e6a 100644
--- a/libc/src/unistd/symlinkat.h
+++ b/libc/src/unistd/symlinkat.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYMLINKAT_H
#define LLVM_LIBC_SRC_UNISTD_SYMLINKAT_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/syscall.h b/libc/src/unistd/syscall.h
index db70745719cfe3..7f82bd8a452f62 100644
--- a/libc/src/unistd/syscall.h
+++ b/libc/src/unistd/syscall.h
@@ -9,9 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYSCALL_H
#define LLVM_LIBC_SRC_UNISTD_SYSCALL_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include <stdarg.h>
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/sysconf.h b/libc/src/unistd/sysconf.h
index 1b3f39e413508b..470c4d846568c7 100644
--- a/libc/src/unistd/sysconf.h
+++ b/libc/src/unistd/sysconf.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYSCONF_H
#define LLVM_LIBC_SRC_UNISTD_SYSCONF_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/truncate.h b/libc/src/unistd/truncate.h
index 9ba5cf83175291..5206a864bcf5db 100644
--- a/libc/src/unistd/truncate.h
+++ b/libc/src/unistd/truncate.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_TRUNCATE_H
#define LLVM_LIBC_SRC_UNISTD_TRUNCATE_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/write.h b/libc/src/unistd/write.h
index e40ce19e21769c..a22660211c150c 100644
--- a/libc/src/unistd/write.h
+++ b/libc/src/unistd/write.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_WRITE_H
#define LLVM_LIBC_SRC_UNISTD_WRITE_H
+#include "hdr/unistd_macros.h"
+#include "include/llvm-libc-types/ssize_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
|
f05a7a1
to
89b03ba
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the types, you should use the headers in hdr/types/type_name.h
instead of include/llvm-libc-types/type_name.h
. After that's fixed this looks fine to land.
So just run a |
that should update the |
89b03ba
to
05f968c
Compare
Oki, how does this look? I updated the CMake and changed those headers. |
Oh fun, it fails CI and I don't know why:
Are all the ones I updated aliases? |
ded1bc9
to
acc2f76
Compare
acc2f76
to
1af49ff
Compare
This patch fixes the bazel build after llvm#119312 lands. Also fixes where ssize_t is requested from in overlay mode.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This patch LGTM, to make sure the bazel build doesn't break could you apply this patch on top: #120127?
Link to the raw diff is here: https://github.com/llvm/llvm-project/pull/120127.diff
I've applied the patch. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perfect, thanks for working on this
Reverts the revert #119295 of #118882 by expanding #118882 with additional fixes which made CI unhappy.