Example of code
#define MAX_BUILD_LIB_DIRS 1024
#define MAX_COMMAND_LINE_FILES 4096
#define MAX_COMMAND_LINE_RUN_ARGS 2048
#define MAX_THREADS 0xFFFF
#define DEFAULT_SYMTAB_SIZE (256 * 1024)
#define DEFAULT_SWITCHRANGE_MAX_SIZE (256)
#define DEFAULT_SWITCH_JUMP_MAX_SIZE (0x3FFF)
#define DEFAULT_PATH "."
typedef enum
{
BACKEND_LLVM = 0,
BACKEND_TB = 1,
BACKEND_C = 2,
} CompilerBackend;
typedef enum
{
LINKER_TYPE_NOT_SET = -1,
LINKER_TYPE_BUILTIN = 0,
LINKER_TYPE_CC = 1,
LINKER_TYPE_CUSTOM = 2,
} LinkerType;
typedef enum
{
TRUST_NONE,
TRUST_INCLUDE,
TRUST_FULL
} TrustLevel;
typedef enum
{
TARGET_TYPE_EXECUTABLE,
TARGET_TYPE_STATIC_LIB,
TARGET_TYPE_DYNAMIC_LIB,
TARGET_TYPE_OBJECT_FILES,
TARGET_TYPE_BENCHMARK,
TARGET_TYPE_TEST,
TARGET_TYPE_PREPARE,
} TargetType;
typedef enum
{
PROJECT_VIEW_TYPE_AUTHOR,
PROJECT_VIEW_TYPE_VERSION,
PROJECT_VIEW_TYPE_LANGUAGE_REVISION,
PROJECT_VIEW_TYPE_WARNINGS_USED,
PROJECT_VIEW_TYPE_C3L_LIB_SEARCH_PATHS,
PROJECT_VIEW_TYPE_C3L_LIB_DEPENDENCIES,
PROJECT_VIEW_TYPE_SOURCE_PATHS,
PROJECT_VIEW_TYPE_OUTPUT_LOCATION,
PROJECT_VIEW_TYPE_DEFAULT_OPTIMIZATION,
PROJECT_VIEW_TYPE_TARGETS,
PROJECT_VIEW_TYPE_MAX = PROJECT_VIEW_TYPE_TARGETS
} ProjectViewType;
static const char *project_view_flags[PROJECT_VIEW_TYPE_MAX + 1] = {
[PROJECT_VIEW_TYPE_AUTHOR] = "authors",
[PROJECT_VIEW_TYPE_VERSION] = "version",
[PROJECT_VIEW_TYPE_LANGUAGE_REVISION] = "language-revision",
[PROJECT_VIEW_TYPE_WARNINGS_USED] = "warnings-used",
[PROJECT_VIEW_TYPE_C3L_LIB_SEARCH_PATHS] = "c3l-lib-search-paths",
[PROJECT_VIEW_TYPE_C3L_LIB_DEPENDENCIES] = "c3l-lib-dependencies",
[PROJECT_VIEW_TYPE_SOURCE_PATHS] = "source-paths",
[PROJECT_VIEW_TYPE_OUTPUT_LOCATION] = "output-location",
[PROJECT_VIEW_TYPE_DEFAULT_OPTIMIZATION] = "default-optimization",
[PROJECT_VIEW_TYPE_TARGETS] = "targets",
};
static const char *targets[7] = {
[TARGET_TYPE_EXECUTABLE] = "executable",
[TARGET_TYPE_STATIC_LIB] = "static-lib",
[TARGET_TYPE_DYNAMIC_LIB] = "dynamic-lib",
[TARGET_TYPE_BENCHMARK] = "benchmark",
[TARGET_TYPE_TEST] = "test",
[TARGET_TYPE_OBJECT_FILES] = "object-files",
[TARGET_TYPE_PREPARE] = "prepare",
};
static const char *target_desc[7] = {
[TARGET_TYPE_EXECUTABLE] = "Executable",
[TARGET_TYPE_STATIC_LIB] = "Static library",
[TARGET_TYPE_DYNAMIC_LIB] = "Dynamic library",
[TARGET_TYPE_BENCHMARK] = "benchmark suite",
[TARGET_TYPE_TEST] = "test suite",
[TARGET_TYPE_OBJECT_FILES] = "object files",
[TARGET_TYPE_PREPARE] = "prepare"
};
typedef struct BuildOptions_
{
const char *lib_dir[MAX_BUILD_LIB_DIRS];
size_t lib_dir_count;
const char *libs[MAX_BUILD_LIB_DIRS];
size_t lib_count;
const char* linker_args[MAX_BUILD_LIB_DIRS];
size_t linker_arg_count;
const char* linker_lib_dir[MAX_BUILD_LIB_DIRS];
size_t linker_lib_dir_count;
const char* linker_libs[MAX_BUILD_LIB_DIRS];
size_t linker_lib_count;
const char* std_lib_dir;
struct
{
const char *sdk;
const char *def;
const char *vs_dirs;
WinCrtLinking crt_linking;
} win;
struct
{
const char *sysroot;
const char *min_version;
const char *sdk_version;
} macos;
struct
{
const char *crt;
const char *crtbegin;
} linuxpaths;
struct
{
const char *ndk_path;
int api_version;
} android;
int build_threads;
const char **libraries_to_fetch;
const char **files;
const char *test_filter;
const char **args;
const char **feature_names;
const char **removed_feature_names;
const char *output_name;
const char *project_name;
const char *target_select;
const char *path;
const char *vendor_download_path;
const char *template;
LinkerType linker_type;
ValidationLevel validation_level;
Ansi ansi;
bool test_breakpoint;
bool test_quiet;
bool test_nosort;
bool test_noleak;
bool test_nocapture;
const char *custom_linker_path;
uint32_t symtab_size;
unsigned version;
bool silence_deprecation;
CompilerBackend backend;
CompilerCommand command;
struct
{
ProjectSubcommand command;
const char *target_name;
TargetType target_type;
const char **sources;
/* Support for flags for 'view' */
struct
{
uint16_t flags_bitvector;
bool verbose;
} view_modifier;
} project_options;
CompileOption compile_option;
TrustLevel trust_level;
DiagnosticsSeverity severity[DIAG_END_SENTINEL];
OptimizationSetting optsetting;
DebugInfo debug_info_override;
ShowBacktrace show_backtrace;
ArchOsTarget arch_os_target_override;
SafetyLevel safety_level;
PanicLevel panic_level;
SingleModule single_module;
UnrollLoops unroll_loops;
MergeFunctions merge_functions;
AutoVectorization loop_vectorization;
AutoVectorization slp_vectorization;
bool emit_llvm;
bool emit_asm;
bool benchmark_mode;
bool test_mode;
bool lsp_mode;
bool no_entry;
bool no_obj;
bool no_headers;
bool read_stdin;
bool print_output;
bool print_input;
bool run_once;
bool suppress_run;
bool old_slice_copy;
int verbosity_level;
const char *panicfn;
const char *benchfn;
const char *testfn;
const char *cc;
const char *build_dir;
const char *output_dir;
const char *llvm_out;
const char *asm_out;
const char *obj_out;
const char *script_dir;
RelocModel reloc_model;
X86VectorCapability x86_vector_capability;
X86CpuSet x86_cpu_set;
Win64Simd win_64_simd;
WinDebug win_debug;
FpOpt fp_math;
EmitStdlib emit_stdlib;
UseStdlib use_stdlib;
LinkLibc link_libc;
StripUnused strip_unused;
OptimizationLevel optlevel;
SizeOptimizationLevel optsize;
RiscvFloatCapability riscv_float_capability;
MemoryEnvironment memory_environment;
SanitizeMode sanitize_mode;
bool print_keywords;
bool print_attributes;
bool print_builtins;
bool print_operators;
bool print_type_properties;
bool print_project_properties;
bool print_manifest_properties;
bool print_precedence;
bool print_linking;
bool print_env;
bool benchmarking;
bool testing;
} BuildOptions;
typedef struct
{
struct Library__ *parent;
ArchOsTarget arch_os;
const char *cc;
const char *cflags;
WinCrtLinking win_crt;
const char **source_dirs;
const char **csource_dirs;
const char **csources;
const char **cinclude_dirs;
const char **execs;
const char **link_flags;
const char **linked_libs;
const char **dependencies;
} LibraryTarget;
typedef struct
{
TargetType type;
Library **library_list;
LibraryTarget **ccompiling_libraries;
const char *name;
const char *output_name;
const char *version;
const char *langrev;
const char **source_dirs;
const char **test_source_dirs;
const char **sources;
const char **object_files;
const char **libdirs;
const char **libs;
const char **linker_libdirs;
const char **linker_libs;
const char *cpu;
const char **link_args;
const char *build_dir;
const char *object_file_dir;
const char *output_dir;
const char *ir_file_dir;
const char *asm_file_dir;
const char *script_dir;
bool is_non_project;
bool run_after_compile;
bool delete_after_run;
bool generate_benchmark_runner;
bool generate_test_runner;
bool benchmark_output;
bool test_output;
bool lsp_output;
bool output_headers;
bool output_ast;
bool lex_only;
bool parse_only;
bool check_only;
bool emit_llvm;
bool emit_asm;
bool emit_object_files;
bool benchmarking;
bool testing;
bool silent;
bool read_stdin;
bool print_output;
bool print_input;
bool print_linking;
bool no_entry;
bool kernel_build;
bool silence_deprecation;
bool print_stats;
bool old_slice_copy;
int build_threads;
TrustLevel trust_level;
OptimizationSetting optsetting;
OptimizationLevel optlevel;
MemoryEnvironment memory_environment;
SizeOptimizationLevel optsize;
SingleModule single_module;
ValidationLevel validation_level;
UseStdlib use_stdlib;
EmitStdlib emit_stdlib;
LinkLibc link_libc;
ShowBacktrace show_backtrace;
StripUnused strip_unused;
DebugInfo debug_info;
MergeFunctions merge_functions;
UnrollLoops unroll_loops;
AutoVectorization loop_vectorization;
AutoVectorization slp_vectorization;
RelocModel reloc_model;
ArchOsTarget arch_os_target;
CompilerBackend backend;
LinkerType linker_type;
uint32_t symtab_size;
uint32_t switchrange_max_size;
uint32_t switchjump_max_size;
const char **args;
const char *panicfn;
const char *benchfn;
const char *testfn;
const char *cc;
const char *cflags;
const char **csource_dirs;
const char **csources;
const char **cinclude_dirs;
const char **exec;
const char **feature_list;
const char *custom_linker_path;
struct
{
WinDebug win_debug;
SoftFloat soft_float : 3;
StructReturn x86_struct_return : 3;
X86VectorCapability x86_vector_capability : 4;
RiscvFloatCapability riscv_float_capability : 4;
Win64Simd pass_win64_simd_as_arrays : 3;
bool trap_on_wrap : 1;
bool sanitize_address : 1;
bool sanitize_memory : 1;
bool sanitize_thread : 1;
FpOpt fp_math;
SafetyLevel safe_mode;
PanicLevel panic_level;
X86CpuSet x86_cpu_set;
} feature;
struct
{
const char *sysroot;
const char *min_version;
const char *sdk_version;
MacSDK *sdk;
} macos;
struct
{
const char *sdk;
const char *def;
const char *vs_dirs;
WinCrtLinking crt_linking;
bool use_win_subsystem;
} win;
struct
{
const char *crt;
const char *crtbegin;
} linuxpaths;
struct
{
const char *ndk_path;
int api_version;
} android;
} BuildTarget;
static const char *x86_cpu_set[8] = {
[X86CPU_BASELINE] = "baseline", // NOLINT
[X86CPU_SSSE3] = "ssse3",
[X86CPU_SSE4] = "sse4",
[X86CPU_AVX1] = "avx1",
[X86CPU_AVX2_V1] = "avx2-v1",
[X86CPU_AVX2_V2] = "avx2-v2",
[X86CPU_AVX512] = "avx512",
[X86CPU_NATIVE] = "native"
};
static BuildTarget default_build_target = {
.is_non_project = true,
.optlevel = OPTIMIZATION_NOT_SET,
.optsetting = OPT_SETTING_NOT_SET,
.memory_environment = MEMORY_ENV_NORMAL,
.optsize = SIZE_OPTIMIZATION_NOT_SET,
.arch_os_target = ARCH_OS_TARGET_DEFAULT,
.debug_info = DEBUG_INFO_NOT_SET,
.show_backtrace = SHOW_BACKTRACE_NOT_SET,
.use_stdlib = USE_STDLIB_NOT_SET,
.link_libc = LINK_LIBC_NOT_SET,
.emit_stdlib = EMIT_STDLIB_NOT_SET,
.linker_type = LINKER_TYPE_NOT_SET,
.validation_level = VALIDATION_NOT_SET,
.single_module = SINGLE_MODULE_NOT_SET,
.unroll_loops = UNROLL_LOOPS_NOT_SET,
.merge_functions = MERGE_FUNCTIONS_NOT_SET,
.slp_vectorization = VECTORIZATION_NOT_SET,
.loop_vectorization = VECTORIZATION_NOT_SET,
.strip_unused = STRIP_UNUSED_NOT_SET,
.symtab_size = DEFAULT_SYMTAB_SIZE,
.reloc_model = RELOC_DEFAULT,
.cc = NULL,
.version = "1.0.0",
.langrev = "1",
.cpu = "generic",
.type = TARGET_TYPE_EXECUTABLE,
.feature.x86_struct_return = STRUCT_RETURN_DEFAULT,
.feature.soft_float = SOFT_FLOAT_DEFAULT,
.feature.fp_math = FP_DEFAULT,
.feature.trap_on_wrap = false,
.feature.riscv_float_capability = RISCVFLOAT_DEFAULT,
.feature.x86_vector_capability = X86VECTOR_DEFAULT,
.feature.x86_cpu_set = X86CPU_DEFAULT,
.feature.win_debug = WIN_DEBUG_DEFAULT,
.feature.safe_mode = SAFETY_NOT_SET,
.feature.panic_level = PANIC_NOT_SET,
.win.crt_linking = WIN_CRT_DEFAULT,
.win.def = NULL,
.switchrange_max_size = DEFAULT_SWITCHRANGE_MAX_SIZE,
.switchjump_max_size = DEFAULT_SWITCH_JUMP_MAX_SIZE,
};