|
|
|
|
|
by sparkie
330 days ago
|
|
An idea I had was to implement a FUSE filesystem for includes, so instead of the separate `#define type_argument` (and `#undef type_argument` that would need to follow the #include), we could stick the type argument in the included filename. #include <vector.h(int32_t)>
#include <vector.h(int64_t)>
The written `vector.h(type_argument)` file could just be a regular C header or an m4 file which has `type_argument` in its template. When requesting `vector.h(int32_t)` the FUSE filesystem would effectively give the output of calling `gcc -E` or `m4` on the template file as the content of the file being requested.Eg, if `vector.h(type_argument)` was an m4 file containing: `#ifndef VECTOR_'type_argument`_INCLUDED'
`#define VECTOR_'type_argument`_INCLUDED'
typedef struct `vector_'type_argument {
size_t length;
type_argument values[];
} `vector_'type_argument;
...
#endif
Then `m4 -D type_argument=int32_t vector.h(type_argument)` gives the output: #ifndef VECTOR_int32_t_INCLUDED
#define VECTOR_int32_t_INCLUDED
typedef struct vector_int32_t {
size_t length;
int32_t values[];
} vector_int32_t;
...
#endif
But the idea is to make it transparent so that existing tools just see the pre-processed file and don't need to call `m4` manually. We would need to mount each include directory that uses this approach using said filesystem. This shouldn't require changing a project's structure as we could use the existing `include/` or `src/` directory as input when mounting, and just pick some new directory name such as `cfuse/include` or `cfuse/src`, and mount a new directory `cfuse` in the project's root directory. The change we'd need to make is in any Makefiles or other parts of the build, where instead of `gcc -Iinclude` we'd have `gcc -Icfuse/include`. Any non-templated headers in `include/` would just appear as live copies in cfuse/include/, so in theory this could work without causing anything to break. |
|