mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
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`.
39 lines
995 B
Python
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",
|
|
]
|