Files
jsix/src/libraries/libc/libc.module
Justin C. Miller f5208d1641 [all] Remove dependencies on non-freestanding libc
This is the first of two rather big changes to clean up includes
throughout the project. In this commit, the implicit semi-dependency on
libc that bonnibel adds to every module is removed. Previously, I was
sloppy with includes of libc headers and include directory order. Now,
the freestanding headers from libc are split out into libc_free, and an
implicit real dependency is added onto this module, unless `no_libc` is
set to `True`. The full libc needs to be explicitly specified as a
dependency to be used.

Several things needed to change in order to do this:

- Many places use `memset` or `memcpy` that cannot depend on libc. The
  kernel has basic implementations of them itself for this reason. Now
  those functions are moved into the lower-level `j6/memutils.h`, and
  libc merely references them. Other modules are now free to reference
  those functions from libj6 instead.
- The kernel's `assert.h` was renamed kassert.h (matching its `kassert`
  function) so that the new `util/assert.h` can use `__has_include` to
  detect it and make sure the `assert` macro is usable in libutil code.
- Several implementation header files under `__libj6/` also moved under
  the new libc_free.
- A new `include_phase` property has been added to modules for Bonnibel,
  which can be "normal" (default) or "late" which uses `-idirafter`
  instead of `-I` for includes.
- Since `<utility>` and `<new>` are not freestanding, implementations of
  `remove_reference`, `forward`, `move`, and `swap` were added to the
  `util` namespace to replace those from `std`, and `util/new.h` was
  added to declare `operator new` and `operator delete`.
2023-07-12 19:38:31 -07:00

39 lines
995 B
Python

# vim: ft=python
# Normally I prefer listing every source file so that ninja can pick
# up on added files and regenerate appropriately, but libc has _so_
# many files that it's unweildy. So if a file is added or removed in
# libc, remember to run configure again.
def glob(ext):
from glob import glob
def resolve(path):
from pathlib import Path
return str(Path(path).relative_to(module_root))
return list(map(resolve, glob(f"{module_root}/**/*.{ext}", recursive=True)))
sources = []
for ext in ("c", "cpp", "s", "inc"):
sources += glob(ext) + glob(ext + ".cog")
headers = []
for ext in ("h",):
headers += glob(ext) + glob(ext + ".cog")
libc = module("libc",
kind = "lib",
deps = [ "j6" ],
output = "libc.a",
include_phase = "late",
sources = sources,
public_headers = headers,
)
libc.variables["ccflags"] = [
"${ccflags}",
"-DPRINTF_SUPPORT_DECIMAL_SPECIFIERS=0",
"-DPRINTF_SUPPORT_EXPONENTIAL_SPECIFIERS=0",
]