cgen: add support for `v -cmain SDL_main sdl_example.v`
							parent
							
								
									e50d73983f
								
							
						
					
					
						commit
						8cecea9965
					
				|  | @ -25,7 +25,20 @@ see also `v help build`. | |||
| 
 | ||||
|    -cstrict | ||||
|       Turn on additional C warnings. This slows down compilation | ||||
|       slightly (~10% for gcc), but sometimes provides better diagnosis. | ||||
|       slightly (~10% for gcc), but sometimes provides better error diagnosis. | ||||
| 
 | ||||
|    -cmain <MainFunctionName> | ||||
|       Useful with framework like code, that uses macros to re-define `main`, like SDL2 does for example. | ||||
|       With that option, V will always generate: | ||||
|         `int MainFunctionName(int ___argc, char** ___argv) {` , for the program entry point function, *no matter* the OS. | ||||
|       Without it, on non Windows systems, it will generate: | ||||
|         `int main(int ___argc, char** ___argv) {` | ||||
|         ... and on Windows, it will generate: | ||||
|           a) `int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, LPWSTR cmd_line, int show_cmd){` | ||||
|           when you are compiling applications that `import gg`. | ||||
|         ... or it will generate: | ||||
|           b) `int wmain(int ___argc, wchar_t* ___argv[], wchar_t* ___envp[]){` | ||||
|           when you are compiling console apps. | ||||
| 
 | ||||
|    -showcc | ||||
|       Prints the C command that is used to build the program. | ||||
|  |  | |||
|  | @ -50,7 +50,11 @@ fn (mut g Gen) gen_vlines_reset() { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (mut g Gen) gen_c_main_function_header() { | ||||
| fn (mut g Gen) gen_c_main_function_only_header() { | ||||
| 	if g.pref.cmain != '' { | ||||
| 		g.writeln('int ${g.pref.cmain}(int ___argc, char** ___argv){') | ||||
| 		return | ||||
| 	} | ||||
| 	if g.pref.os == .windows { | ||||
| 		if g.is_gui_app() { | ||||
| 			$if msvc { | ||||
|  | @ -65,13 +69,17 @@ fn (mut g Gen) gen_c_main_function_header() { | |||
| 			g.writeln('\tcmd_line_to_argv CommandLineToArgvW = (cmd_line_to_argv)GetProcAddress(shell32_module, "CommandLineToArgvW");') | ||||
| 			g.writeln('\tint ___argc;') | ||||
| 			g.writeln('\twchar_t** ___argv = CommandLineToArgvW(full_cmd_line, &___argc);') | ||||
| 		} else { | ||||
| 			// Console application
 | ||||
| 			g.writeln('int wmain(int ___argc, wchar_t* ___argv[], wchar_t* ___envp[]){') | ||||
| 			return | ||||
| 		} | ||||
| 	} else { | ||||
| 		g.writeln('int main(int ___argc, char** ___argv){') | ||||
| 		// Console application
 | ||||
| 		g.writeln('int wmain(int ___argc, wchar_t* ___argv[], wchar_t* ___envp[]){') | ||||
| 		return | ||||
| 	} | ||||
| 	g.writeln('int main(int ___argc, char** ___argv){') | ||||
| } | ||||
| 
 | ||||
| fn (mut g Gen) gen_c_main_function_header() { | ||||
| 	g.gen_c_main_function_only_header() | ||||
| 	g.writeln('\tg_main_argc = ___argc;') | ||||
| 	g.writeln('\tg_main_argv = ___argv;') | ||||
| 	if g.nr_closures > 0 { | ||||
|  |  | |||
|  | @ -163,6 +163,7 @@ pub mut: | |||
| 	bare_builtin_dir string // Set by -bare-builtin-dir xyz/ . The xyz/ module should contain implementations of malloc, memset, etc, that are used by the rest of V's `builtin` module. That option is only useful with -freestanding (i.e. when is_bare is true).
 | ||||
| 	no_preludes      bool   // Prevents V from generating preludes in resulting .c files
 | ||||
| 	custom_prelude   string // Contents of custom V prelude that will be prepended before code in resulting .c files
 | ||||
| 	cmain            string // The name of the generated C main function. Useful with framework like code, that uses macros to re-define `main`, like SDL2 does. When set, V will always generate `int THE_NAME(int ___argc, char** ___argv){`, *no matter* the platform.
 | ||||
| 	lookup_path      []string | ||||
| 	output_cross_c   bool // true, when the user passed `-os cross`
 | ||||
| 	output_es5       bool | ||||
|  | @ -686,6 +687,10 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin | |||
| 				res.custom_prelude = prelude | ||||
| 				i++ | ||||
| 			} | ||||
| 			'-cmain' { | ||||
| 				res.cmain = cmdline.option(current_args, '-cmain', '') | ||||
| 				i++ | ||||
| 			} | ||||
| 			else { | ||||
| 				if command == 'build' && is_source_file(arg) { | ||||
| 					eprintln('Use `v $arg` instead.') | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue