diff options
| author | gingerBill <bill@gingerbill.org> | 2019-12-21 11:22:46 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-12-21 11:22:46 +0000 |
| commit | 494b1e7eaa0368f95fa7bd6d993a2f3ecec831ea (patch) | |
| tree | c1d3c07aa31eea60ad85f868af57f017ddd179d3 /src | |
| parent | c43d17bfec9cc99f4d282fe05c5579e318825c2a (diff) | |
Add `-help` which prints information about the compiler flags
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 2 | ||||
| -rw-r--r-- | src/main.cpp | 139 |
2 files changed, 139 insertions, 2 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 865c7e565..4b76106bd 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -102,6 +102,8 @@ struct BuildContext { TargetMetrics metrics; + bool show_help; + String out_filepath; String resource_filepath; String pdb_filepath; diff --git a/src/main.cpp b/src/main.cpp index 3cb33037e..6950f3ecb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -177,6 +177,9 @@ void usage(String argv0) { print_usage_line(1, "query parse, type check, and output a .json file containing information about the program"); print_usage_line(1, "docs generate documentation for a .odin file"); print_usage_line(1, "version print version"); + print_usage_line(0, ""); + print_usage_line(0, "For more information of flags, apply the flag to see what is possible"); + print_usage_line(1, "-help"); } @@ -213,6 +216,8 @@ bool string_is_valid_identifier(String str) { enum BuildFlagKind { BuildFlag_Invalid, + BuildFlag_Help, + BuildFlag_OutFile, BuildFlag_OptimizationLevel, BuildFlag_ShowTimings, @@ -301,6 +306,7 @@ ExactValue build_param_to_exact_value(String name, String param) { bool parse_build_flags(Array<String> args) { auto build_flags = array_make<BuildFlag>(heap_allocator(), 0, BuildFlag_COUNT); + add_flag(&build_flags, BuildFlag_Help, str_lit("help"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String); add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None); @@ -447,6 +453,10 @@ bool parse_build_flags(Array<String> args) { } if (ok) switch (bf.kind) { + case BuildFlag_Help: + build_context.show_help = true; + break; + case BuildFlag_OutFile: { GB_ASSERT(value.kind == ExactValue_String); String path = value.value_string; @@ -616,7 +626,7 @@ bool parse_build_flags(Array<String> args) { String str = value.value_string; bool found = false; - for (int i = 0; i < sizeof(named_targets) / sizeof(named_targets[0]); i++) { + for (isize i = 0; i < gb_count_of(named_targets); i++) { if (str_eq_ignore_case(str, named_targets[i].name)) { found = true; selected_target_metrics = named_targets + i; @@ -1023,6 +1033,131 @@ int main(int arg_count, char const **arg_ptr) { return 1; } + if (build_context.show_help) { + print_usage_line(0, "%.*s is a tool for managing Odin source code", LIT(args[0])); + print_usage_line(0, "Usage"); + print_usage_line(1, "%.*s %.*s [arguments]", LIT(args[0]), LIT(command)); + print_usage_line(0, ""); + + bool build = command == "build"; + bool run_or_build = command == "run" || command == "build"; + bool check = command == "run" || command == "build" || command == "check"; + + + if (run_or_build) { + print_usage_line(1, "-out:<filepath>"); + print_usage_line(2, "Set the file name of the outputted executable"); + print_usage_line(2, "Example: -out:foo.exe"); + print_usage_line(0, ""); + + print_usage_line(1, "-opt:<integer>"); + print_usage_line(2, "Set the optimization level for complication"); + print_usage_line(2, "Accepted values: 0, 1, 2, 3"); + print_usage_line(2, "Example: -opt:2"); + print_usage_line(0, ""); + } + + if (check) { + print_usage_line(1, "-show-timings"); + print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds"); + print_usage_line(0, ""); + + print_usage_line(1, "-show-more-timings"); + print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds"); + print_usage_line(0, ""); + + print_usage_line(1, "-thread-count:<integer>"); + print_usage_line(2, "Override the number of threads the compiler will use to compile with"); + print_usage_line(2, "Example: -thread-count:2"); + print_usage_line(0, ""); + } + + if (run_or_build) { + print_usage_line(1, "-keep-temp-files"); + print_usage_line(2, "Keeps the temporary files generated during compilation"); + print_usage_line(0, ""); + } + + if (check) { + print_usage_line(1, "-collection:<name>=<filepath>"); + print_usage_line(2, "Defines a library collection used for imports"); + print_usage_line(2, "Example: -collection:shared:dir/to/shared"); + print_usage_line(2, "Usage in Code:"); + print_usage_line(3, "import \"shared:foo\""); + print_usage_line(0, ""); + + print_usage_line(1, "-define:<name>=<expression>"); + print_usage_line(2, "Defines a global constant with a value"); + print_usage_line(2, "Example: -define:SPAM=123"); + print_usage_line(0, ""); + } + + if (build) { + print_usage_line(1, "-build-mode:<mode>"); + print_usage_line(2, "Sets the build mode"); + print_usage_line(2, "Available options:"); + print_usage_line(3, "-build-mode:exe Build as an executable"); + print_usage_line(3, "-build-mode:dll Build as a dynamically linked library"); + print_usage_line(3, "-build-mode:shared Build as a dynamically linked library"); + print_usage_line(0, ""); + } + + if (check) { + print_usage_line(1, "-target:<string>"); + print_usage_line(2, "Sets the target for the executable to be built in"); + print_usage_line(0, ""); + } + + if (run_or_build) { + print_usage_line(1, "-debug"); + print_usage_line(2, "Enabled debug information, and defines the global constant ODIN_DEBUG to be 'true'"); + print_usage_line(0, ""); + + print_usage_line(1, "-no-bounds-check"); + print_usage_line(2, "Disables bounds checking program wide"); + print_usage_line(0, ""); + + print_usage_line(1, "-no-crt"); + print_usage_line(2, "Disables automatic linking with the C Run Time"); + print_usage_line(0, ""); + + print_usage_line(1, "-use-lld"); + print_usage_line(2, "Use the LLD linker rather than the default"); + print_usage_line(0, ""); + } + + if (check) { + print_usage_line(1, "-vet"); + print_usage_line(2, "Do extra checks on the code"); + print_usage_line(2, "Extra checks include:"); + print_usage_line(3, "Variable shadowing within procedures"); + print_usage_line(3, "Unused declarations"); + print_usage_line(0, ""); + + print_usage_line(1, "-ignore-unknown-attributes"); + print_usage_line(2, "Ignores unknown attributes"); + print_usage_line(2, "This can be used with metaprogramming tools"); + print_usage_line(0, ""); + } + + if (run_or_build) { + #if defined(GB_SYSTEM_WINDOWS) + print_usage_line(1, "-resource:<filepath>"); + print_usage_line(2, "[Windows only]"); + print_usage_line(2, "Defines the resource file for the executable"); + print_usage_line(2, "Example: -resource:path/to/file.rc"); + print_usage_line(0, ""); + + print_usage_line(1, "-pdb-name:<filepath>"); + print_usage_line(2, "[Windows only]"); + print_usage_line(2, "Defines the generated PDB name when -debug is enabled"); + print_usage_line(2, "Example: -pdb-name:different.pdb"); + print_usage_line(0, ""); + #endif + } + return 0; + } + // NOTE(bill): add 'shared' directory if it is not already set @@ -1180,7 +1315,7 @@ int main(int arg_count, char const **arg_ptr) { // NOTE(ic): It would be nice to extend this so that we could specify the Visual Studio version that we want instead of defaulting to the latest. Find_Result_Utf8 find_result = find_visual_studio_and_windows_sdk_utf8(); - // defer(free_resources(&find_result)); + // defer(free_"resource"s(&find_result)); if (find_result.windows_sdk_version == 0) { gb_printf_err("Windows SDK not found.\n"); |