CCCC
C bytecode compiler + VM interpreter
Loading...
Searching...
No Matches
building.h
Go to the documentation of this file.
1
38#pragma once
39
40// ============================================================================
41// Opaque build types (owned by the VM / host runner)
42// ============================================================================
43
45typedef struct __cccc_Builder Builder;
46
48typedef struct __cccc_BuildTarget BuildTarget;
49
50// ============================================================================
51// Underlying FFI-callable functions
52// ============================================================================
53
59const char *__builtin_build_root(Builder *ctx);
60
67
73const char *__builtin_build_host(Builder *ctx);
74
81
83void __builtin_build_watch(Builder *ctx, const char *path);
85void __builtin_build_watch_glob(Builder *ctx, const char *pattern);
87void __builtin_build_ignore_watch(Builder *ctx, const char *pattern);
90
100
108
116
125
148
170
176void __builtin_build_set_output(BuildTarget *t, const char *path);
177
194
211
227void __builtin_build_add_input(BuildTarget *t, const char *path);
228
234void __builtin_build_add_source(BuildTarget *t, const char *path);
235
243void __builtin_build_add_sources_glob(BuildTarget *t, const char *pattern);
244
255 const char *pattern);
256
266 const char *content);
267
275void __builtin_build_exclude_source(BuildTarget *t, const char *pattern);
276
282void __builtin_build_add_include(BuildTarget *t, const char *path);
283
291
298void __builtin_build_add_define(BuildTarget *t, const char *name,
299 const char *value);
300
306void __builtin_build_add_undef(BuildTarget *t, const char *name);
307
313void __builtin_build_add_cflag(BuildTarget *t, const char *flag);
314
320void __builtin_build_add_ldflag(BuildTarget *t, const char *flag);
321
332 const char *value);
333
341
351
357void __builtin_build_add_lib(BuildTarget *t, const char *name);
358
364void __builtin_build_add_libpath(BuildTarget *t, const char *path);
365
372const char *__builtin_build_get_env(Builder *ctx, const char *name);
373
383const char *__builtin_build_capture_command(Builder *ctx, const char *cmd);
384
391int __builtin_build_file_exists(Builder *ctx, const char *path);
392
400int __builtin_build_have_tool(Builder *ctx, const char *name);
401
411
424 const char *cmd);
425
442void __builtin_build_set_profile(BuildTarget *t, const char *profile);
443
450
461
471
478
488
495const char *__builtin_build_target_name(Builder *ctx, int i);
496
505const char *__builtin_build_find_tool(Builder *ctx, const char *name);
506
514const char *__builtin_build_get_build_option(Builder *ctx, const char *name);
515
523int __builtin_build_have_build_option(Builder *ctx, const char *name);
524
532
540
547
554
562const char *__builtin_build_argv(Builder *ctx, int i);
563
570void __builtin_build_set_install_prefix(Builder *ctx, const char *path);
571
580
587
594int __builtin_build_dir_exists(Builder *ctx, const char *path);
595
605const char **__builtin_build_glob_files(Builder *ctx, const char *pattern);
606
615const char *__builtin_build_read_file(Builder *ctx, const char *path);
616
624int __builtin_build_write_file(Builder *ctx, const char *path,
625 const char *content);
626
638int __builtin_build_set_cwd(Builder *ctx, const char *path);
639
648
656int __builtin_build_copy_file(Builder *ctx, const char *src, const char *dst);
657
666int __builtin_build_move_file(Builder *ctx, const char *src, const char *dst);
667
674int __builtin_build_delete_file(Builder *ctx, const char *path);
675
683int __builtin_build_mkdir(Builder *ctx, const char *path);
684
693int __builtin_build_delete_dir(Builder *ctx, const char *path);
694
702
709
716
717// ============================================================================
718// PascalCase macro wrappers (ctx is passed explicitly by the build entry)
719// ============================================================================
720
724#define BuildRoot(ctx) __builtin_build_root(ctx)
725
729#define BuildOutDir(ctx) __builtin_build_out_dir(ctx)
730
734#define BuildHost(ctx) __builtin_build_host(ctx)
735
739#define BuildVerbose(ctx) __builtin_build_verbose(ctx)
740
747#define Watch(ctx, path) __builtin_build_watch(ctx, path)
748
754#define WatchGlob(ctx, pat) __builtin_build_watch_glob(ctx, pat)
755
761#define IgnoreWatch(ctx, pat) __builtin_build_ignore_watch(ctx, pat)
762
766#define BuildWatching(ctx) __builtin_build_watching(ctx)
767
772#define CcccPath(ctx) __builtin_build_cccc_path(ctx)
773
778#define Executable(ctx, name) __builtin_build_executable(ctx, name)
779
784#define StaticLib(ctx, name) __builtin_build_static_lib(ctx, name)
785
791#define DynamicLib(ctx, name) __builtin_build_dynamic_lib(ctx, name)
792
802#define CcccExecutable(ctx, name) __builtin_build_cccc_executable(ctx, name)
803
810#define CcccObject(ctx, name) __builtin_build_cccc_object(ctx, name)
811
816#define SetOutput(t, p) __builtin_build_set_output(t, p)
817
821#define TargetOutput(t) __builtin_build_target_output(t)
822
827#define DeclareOutput(t, p) __builtin_build_declare_output(t, p)
828
833#define AddSource(t, p) __builtin_build_add_source(t, p)
834
840#define AddSourcesGlob(t, pat) __builtin_build_add_sources_glob(t, pat)
841
847#define AddSourcesGlobDeferred(t, pat) \
848 __builtin_build_add_sources_glob_deferred(t, pat)
849
856#define AddSourceStr(t, n, c) __builtin_build_add_source_str(t, n, c)
857
871#define AddInput(t, p) __builtin_build_add_input(t, p)
872
877#define ExcludeSource(t, pat) __builtin_build_exclude_source(t, pat)
878
883#define AddInclude(t, p) __builtin_build_add_include(t, p)
884
890#define AddSystemInclude(t, p) __builtin_build_add_system_include(t, p)
891
897#define AddDefine(t, n, v) __builtin_build_add_define(t, n, v)
898
903#define AddUndef(t, n) __builtin_build_add_undef(t, n)
904
909#define AddCFlag(t, f) __builtin_build_add_cflag(t, f)
910
915#define AddLdFlag(t, f) __builtin_build_add_ldflag(t, f)
916
923#define SetTargetEnv(t, n, v) __builtin_build_set_target_env(t, n, v)
924
929#define LinkWith(t, dep) __builtin_build_link_with(t, dep)
930
936#define DependsOn(t, dep) __builtin_build_depends_on(t, dep)
937
942#define AddLib(t, n) __builtin_build_add_lib(t, n)
943
948#define AddLibPath(t, p) __builtin_build_add_libpath(t, p)
949
954#define GetEnv(ctx, name) __builtin_build_get_env(ctx, name)
955
960#define CaptureCommand(ctx, cmd) __builtin_build_capture_command(ctx, cmd)
961
966#define FileExists(ctx, path) __builtin_build_file_exists(ctx, path)
967
972#define DirExists(ctx, path) __builtin_build_dir_exists(ctx, path)
973
978#define GlobFiles(ctx, pattern) __builtin_build_glob_files(ctx, pattern)
979
984#define ReadFile(ctx, path) __builtin_build_read_file(ctx, path)
985
991#define WriteFile(ctx, path, c) __builtin_build_write_file(ctx, path, c)
992
997#define SetCwd(ctx, path) __builtin_build_set_cwd(ctx, path)
998
1002#define GetCwd(ctx) __builtin_build_get_cwd(ctx)
1003
1009#define CopyFile(ctx, src, dst) __builtin_build_copy_file(ctx, src, dst)
1010
1016#define MoveFile(ctx, src, dst) __builtin_build_move_file(ctx, src, dst)
1017
1022#define DeleteFile(ctx, path) __builtin_build_delete_file(ctx, path)
1023
1029#define MkDir(ctx, path) __builtin_build_mkdir(ctx, path)
1030
1035#define DeleteDir(ctx, path) __builtin_build_delete_dir(ctx, path)
1036
1041#define HaveTool(ctx, name) __builtin_build_have_tool(ctx, name)
1042
1047#define FindTool(ctx, name) __builtin_build_find_tool(ctx, name)
1048
1054#define PkgConfig(t, pkg) __builtin_build_pkg_config(t, pkg)
1055
1062#define RunCustom(ctx, name, cmd) __builtin_build_run_custom(ctx, name, cmd)
1063
1069#define GetBuildOption(ctx, name) __builtin_build_get_build_option(ctx, name)
1070
1075#define HaveBuildOption(ctx, name) __builtin_build_have_build_option(ctx, name)
1076
1081#define AddFramework(t, name) __builtin_build_add_framework(t, name)
1082
1088#define AddFrameworkPath(t, p) __builtin_build_add_framework_path(t, p)
1089
1094#define UseSystemHeaders(t) __builtin_build_use_system_headers(t)
1095
1099#define BuildArgc(ctx) __builtin_build_argc(ctx)
1100
1106#define BuildArgv(ctx, i) __builtin_build_argv(ctx, i)
1107
1112#define SetInstallPrefix(ctx, path) \
1113 __builtin_build_set_install_prefix(ctx, path)
1114
1119#define InstallArtifact(ctx, t) __builtin_build_install_artifact(ctx, t)
1120
1124#define BuildWantsInstall(ctx) __builtin_build_wants_install(ctx)
1125
1132#define SetProfile(t, p) __builtin_build_set_profile(t, p)
1133
1137#define BuildProfile(ctx) __builtin_build_profile(ctx)
1138
1144#define SetToolchain(t, cc) __builtin_build_set_toolchain(t, cc)
1145
1151#define SetTargetTriple(t, triple) __builtin_build_set_target_triple(t, triple)
1152
1156#define BuildTargetTriple(ctx) __builtin_build_target_triple(ctx)
1157
1162#define BuildTargetCount(ctx) __builtin_build_target_count(ctx)
1163
1168#define BuildTargetName(ctx, i) __builtin_build_target_name(ctx, i)
1169
1174#define Build(ctx, t) __builtin_build_run(ctx, t)
1175
1179#define BuildAll(ctx) __builtin_build_run_all(ctx)
1180
1184#define BuildDefault(ctx) __builtin_build_run_default(ctx)
void __builtin_build_add_framework_path(BuildTarget *t, const char *path)
Add a macOS framework search path (-F, or --iframework for a cccc-compiled target).
const char * __builtin_build_target_output(BuildTarget *t)
On-disk output path for t.
const char * __builtin_build_get_cwd(Builder *ctx)
Return the current process working directory.
void __builtin_build_add_cflag(BuildTarget *t, const char *flag)
Add a raw compiler flag (e.g. "-O2").
int __builtin_build_move_file(Builder *ctx, const char *src, const char *dst)
Move (rename) file src to dst.
void __builtin_build_add_lib(BuildTarget *t, const char *name)
Add a system library to link against (-l<name>).
void __builtin_build_add_system_include(BuildTarget *t, const char *path)
Add a system include search path (-isystem) to the target's compiles.
void __builtin_build_ignore_watch(Builder *ctx, const char *pattern)
Drops --watch events for paths matching an fnmatch glob.
const char ** __builtin_build_glob_files(Builder *ctx, const char *pattern)
Expand pattern and return the matching paths.
void __builtin_build_use_system_headers(BuildTarget *t)
Compile a cccc-compiled target against the host's own system headers (--use-system-headers).
void __builtin_build_add_include(BuildTarget *t, const char *path)
Add an include search path (-I) to the target's compiles.
void __builtin_build_watch_glob(Builder *ctx, const char *pattern)
Adds an fnmatch glob to the --watch set.
int __builtin_build_run(Builder *ctx, BuildTarget *t)
Build t and its transitive dependencies.
int __builtin_build_delete_file(Builder *ctx, const char *path)
Delete the file at path (unlink).
int __builtin_build_target_count(Builder *ctx)
Return the number of [[cccc::build_target]] factory functions declared in the current build script.
const char * __builtin_build_out_dir(Builder *ctx)
Output directory for build artifacts (default build/).
void __builtin_build_add_source_str(BuildTarget *t, const char *name, const char *content)
Write content to <out_dir>/gen/<name> and add it as a source.
int __builtin_build_dir_exists(Builder *ctx, const char *path)
Check whether a path exists and is a directory.
int __builtin_build_wants_install(Builder *ctx)
Check whether install was requested.
void __builtin_build_set_output(BuildTarget *t, const char *path)
Override the target's output path (relative to the out dir).
BuildTarget * __builtin_build_cccc_executable(Builder *ctx, const char *name)
Create an executable compiled by the running cccc itself (output bin/<name>).
int __builtin_build_pkg_config(BuildTarget *t, const char *pkg)
Run pkg-config to obtain compile and link flags for pkg and add them to t.
int __builtin_build_copy_file(Builder *ctx, const char *src, const char *dst)
Copy file src to dst.
BuildTarget * __builtin_build_static_lib(Builder *ctx, const char *name)
Create a static-library target (output lib/lib<name>.a).
const char * __builtin_build_get_env(Builder *ctx, const char *name)
Return the value of environment variable name.
void __builtin_build_exclude_source(BuildTarget *t, const char *pattern)
Exclude sources matching pattern from compilation.
void __builtin_build_link_with(BuildTarget *t, BuildTarget *dep)
Declare that t links against (and is built after) dep.
int __builtin_build_set_cwd(Builder *ctx, const char *path)
Change the process working directory to path.
void __builtin_build_add_sources_glob(BuildTarget *t, const char *pattern)
Expand a glob pattern relative to the build root and add each match as a source file,...
void __builtin_build_install_artifact(Builder *ctx, BuildTarget *t)
Register t for installation when --build-install is active.
void __builtin_build_watch(Builder *ctx, const char *path)
Adds a file, or a directory (recursively), to the --watch set.
BuildTarget * __builtin_build_cccc_object(Builder *ctx, const char *name)
Create an object file compiled by the running cccc itself (output obj/<name>.o).
int __builtin_build_run_default(Builder *ctx)
Build every declared target and print a summary.
int __builtin_build_verbose(Builder *ctx)
Non-zero when verbose output was requested.
const char * __builtin_build_target_name(Builder *ctx, int i)
Return the name of the i -th [[cccc::build_target]] factory.
void __builtin_build_add_undef(BuildTarget *t, const char *name)
Add a preprocessor undefine (-U).
const char * __builtin_build_get_build_option(Builder *ctx, const char *name)
Return the value of a --build-option=key=value option passed on the command line.
void __builtin_build_add_input(BuildTarget *t, const char *path)
Record a file path a RunCustom or CcccExecutable target reads.
void __builtin_build_add_ldflag(BuildTarget *t, const char *flag)
Add a raw linker flag.
struct __cccc_Builder Builder
Opaque build context; passed to the entry and forwarded to macros.
Definition building.h:45
void __builtin_build_declare_output(BuildTarget *t, const char *path)
Record a file path a RunCustom target (only) produces.
void __builtin_build_add_define(BuildTarget *t, const char *name, const char *value)
Add a preprocessor define (-D).
BuildTarget * __builtin_build_executable(Builder *ctx, const char *name)
Create an executable target named name (output bin/<name>).
int __builtin_build_watching(Builder *ctx)
Non-zero under --watch.
int __builtin_build_argc(Builder *ctx)
Number of positional arguments forwarded via -- on the CLI.
void __builtin_build_set_target_env(BuildTarget *t, const char *name, const char *value)
Set an environment variable for t's compiler/linker child process only (e.g. AFL_USE_ASAN=1 for an af...
int __builtin_build_write_file(Builder *ctx, const char *path, const char *content)
Write content to path, creating parent directories as needed.
void __builtin_build_add_framework(BuildTarget *t, const char *name)
Add a macOS -framework Name linker flag.
const char * __builtin_build_root(Builder *ctx)
Absolute path of the directory the build was launched from.
int __builtin_build_delete_dir(Builder *ctx, const char *path)
Recursively delete path and all contents (rm -rf semantics).
void __builtin_build_set_install_prefix(Builder *ctx, const char *path)
Override the install prefix for InstallArtifact.
BuildTarget * __builtin_build_dynamic_lib(Builder *ctx, const char *name)
Create a dynamic-library target (output lib/lib<name>.{so,dylib}).
int __builtin_build_file_exists(Builder *ctx, const char *path)
Check whether a path exists.
const char * __builtin_build_host(Builder *ctx)
Host platform name ("darwin", "linux", ...).
const char * __builtin_build_capture_command(Builder *ctx, const char *cmd)
Run cmd via sh -c and return its stdout.
int __builtin_build_mkdir(Builder *ctx, const char *path)
Create path and all intermediate directories (mkdir -p semantics).
const char * __builtin_build_target_triple(Builder *ctx)
Return the global cross-compilation triple.
const char * __builtin_build_cccc_path(Builder *ctx)
Absolute path of the running cccc executable.
const char * __builtin_build_argv(Builder *ctx, int i)
Return the i -th positional argument forwarded via -- on the CLI.
void __builtin_build_add_sources_glob_deferred(BuildTarget *t, const char *pattern)
Like AddSourcesGlob, but expansion happens at build time, after t's dependencies have already been bu...
const char * __builtin_build_profile(Builder *ctx)
Return the global build profile name.
struct __cccc_BuildTarget BuildTarget
Opaque handle to a declared build target.
Definition building.h:48
void __builtin_build_depends_on(BuildTarget *t, BuildTarget *dep)
Ordering-only dependency: t is built after dep but does not add a -l<dep> linker flag.
int __builtin_build_run_all(Builder *ctx)
Build every declared target in topological order.
const char * __builtin_build_read_file(Builder *ctx, const char *path)
Read the file at path into a string.
void __builtin_build_set_toolchain(BuildTarget *t, const char *cc)
Override the compiler binary for t (e.g. "aarch64-linux-gnu-gcc").
void __builtin_build_add_libpath(BuildTarget *t, const char *path)
Add a library search path (-L<path>).
void __builtin_build_add_source(BuildTarget *t, const char *path)
Add a C source file to the target.
const char * __builtin_build_find_tool(Builder *ctx, const char *name)
Return the full path of a named tool.
void __builtin_build_set_target_triple(BuildTarget *t, const char *triple)
Set a clang-style target triple for t (e.g. "aarch64-linux-gnu").
void __builtin_build_set_profile(BuildTarget *t, const char *profile)
Set the build profile for target t, overriding any global --build-profile default.
int __builtin_build_have_build_option(Builder *ctx, const char *name)
Check whether a --build-option was passed on the command line.
int __builtin_build_have_tool(Builder *ctx, const char *name)
Check whether a named tool is available.
BuildTarget * __builtin_build_run_custom(Builder *ctx, const char *name, const char *cmd)
Register a custom shell-command target named name that runs cmd when the target is reached in the bui...