// Put this script in tinycc, compile it, then run it. #ifndef ENV_CC #define ENV_CC "tcc" #endif /* #define ENV_SPATH "C:\\tinycc" #define ENV_CC ENV_SPATH"\\tcc.exe","-I"ENV_SPATH"\\win32\\include","-I"ENV_SPATH"\\win32\\include\\sec_api","-I"ENV_SPATH"\\win32\\include\\sys","-I"ENV_SPATH"\\win32\\include\\tcc","-I"ENV_SPATH"\\win32\\include\\winapi","-I"ENV_SPATH"\\include","-I"ENV_SPATH,"-L"ENV_SPATH"\\win32\\lib","-L"ENV_SPATH"\\lib","-L"ENV_SPATH */ #ifndef ENV_CFLAGS #define ENV_CFLAGS "-D__MTC_NONE" #endif #include #include #include #include #if PLATFORM_LINUX #define ENV_PLATFORM "linux" #include #include #elif PLATFORM_WINDOWS #define ENV_PLATFORM "windows" #include #include #else #warning "ERROR: Please define a platform with -DPLATFORM_*." #warning "" #warning "Available platforms:" #warning "* LINUX" #warning "* WINDOWS" #warning "" #warning "Example: -DPLATFORM_LINUX" #define ENV_QUIT #endif #if ARCH_I386 #if PLATFORM_LINUX #define ARCH_TRIPLET "i386-linux-gnu" #endif #define ARCH_NAME "I386" #elif ARCH_X86_64 #if PLATFORM_LINUX #define ARCH_TRIPLET "x86_64-linux-gnu" #endif #define ARCH_NAME "X86_64" #else #warning "ERROR: Please define an architecture with -DARCH_*." #warning "" #warning "Available architectures:" #warning "* I386" #warning "* X86_64" #warning "" #warning "Example: -DARCH_I386" #define ENV_QUIT #endif #if ENV_QUIT #error "Compilation failed." #endif int _call_proc(char * argv[]) { #if PLATFORM_LINUX pid_t pid; int status; pid = fork(); if (pid == -1) { return -1; } if (pid == 0) { // Child process execvp(argv[0],argv); // execvp only returns if an error occurs. return -1; } else { // Parent process waitpid(pid,&status,0); if (WIFEXITED(status) != 1) { return -1; } return WEXITSTATUS(status); } return -1; #elif PLATFORM_WINDOWS char * command; long commandLength = 0; int i; for (i = 0; argv[i] != NULL; i++) { commandLength += strlen(argv[i]) + 3; int si; for (si = 0; argv[i][si] != 0; si++) { if (argv[i][si] == '"') { commandLength++; } } } commandLength += 1; command = malloc(commandLength); command[0] = 0; for (i = 0; argv[i] != NULL; i++) { int si; strcat(command,"\""); for (si = 0; argv[i][si] != 0; si++) { if (argv[i][si] == '"') { strcat(command,"\\"); } strncat(command,(char *)&argv[i][si],1); } strcat(command,"\" "); } command[commandLength - 2] = 0; // windows-specific section STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi,sizeof(pi)); BOOL b = CreateProcess(NULL,command,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); free(command); if (b == 0) { return -1; } WaitForSingleObject(pi.hProcess,INFINITE); DWORD status; if (!GetExitCodeProcess(pi.hProcess,&status)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return -1; } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return status; #endif } int call_proc(char * file, ...) { char ** argv = malloc(sizeof(char *)); argv[0] = file; int i = 1; char * str = file; va_list args; va_start(args,file); while (str != NULL) { str = va_arg(args, char *); argv = realloc(argv,sizeof(char *) * (i + 1)); argv[i] = str; i++; } int code = _call_proc(argv); free(argv); va_end(args); return code; } void call_proc_error(char * file, ...) { char ** argv = malloc(sizeof(char *)); argv[0] = file; int i = 1; char * str = file; va_list args; va_start(args,file); while (str != NULL) { str = va_arg(args, char *); argv = realloc(argv,sizeof(char *) * (i + 1)); argv[i] = str; i++; } printf("* "); int di; for (di = 0; argv[di] != NULL; di++) { printf("\""); printf("%s",argv[di]); printf("\" "); } printf("\n"); fflush(stdout); int code = _call_proc(argv); free(argv); va_end(args); if (code != 0) { printf("Error %d, quitting.\n",code); exit(code); } } int main (int argc, const char * argv[]) { /*printf("* ENV_PLATFORM: '"ENV_PLATFORM"'\n"); printf("* ENV_CC: '"ENV_CC"'\n"); printf("* ENV_CFLAGS: '"ENV_CFLAGS"'\n"); printf("\n");*/ #if PLATFORM_LINUX call_proc_error(ENV_CC,"-o","tcc.o","-c","tcc.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-DTCC_GITHASH=\"2024-02-19 mob@d2f8ceac\"","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","libtcc.o","-c","libtcc.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-DC2STR","conftest.c","-o","c2str.exe",NULL); call_proc_error("./c2str.exe","include/tccdefs.h","tccdefs_.h",NULL); call_proc_error(ENV_CC,"-o","tccpp.o","-c","tccpp.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccgen.o","-c","tccgen.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccdbg.o","-c","tccdbg.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccelf.o","-c","tccelf.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccasm.o","-c","tccasm.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccrun.o","-c","tccrun.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","x86_64-gen.o","-c","x86_64-gen.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","x86_64-link.o","-c","x86_64-link.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","i386-asm.o","-c","i386-asm.c","-DCONFIG_TRIPLET=\""ARCH_TRIPLET"\"","-DTCC_TARGET_"ARCH_NAME,"-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-shared","-o","libtcc.a","libtcc.o","tccpp.o","tccgen.o","tccdbg.o","tccelf.o","tccasm.o","tccrun.o","x86_64-gen.o","x86_64-link.o","i386-asm.o",NULL); call_proc_error(ENV_CC,"-o","tcc","tcc.o","libtcc.a","-lm","-ldl","-lpthread",NULL); chdir("lib"); call_proc_error("../tcc","-c","libtcc1.c","-o","libtcc1.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","alloca.S","-o","alloca.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","alloca-bt.S","-o","alloca-bt.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","stdatomic.c","-o","stdatomic.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","atomic.S","-o","atomic.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","builtin.c","-o","builtin.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","tcov.c","-o","tcov.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","va_list.c","-o","va_list.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","dsohandle.c","-o","dsohandle.o","-B..","-I..",NULL); call_proc_error("../tcc","-ar","rcs","../libtcc1.a","libtcc1.o","alloca.o","alloca-bt.o","stdatomic.o","atomic.o","builtin.o","tcov.o","va_list.o","dsohandle.o",NULL); call_proc_error("../tcc","-c","bt-exe.c","-o","../bt-exe.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","bt-log.c","-o","../bt-log.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","runmain.c","-o","../runmain.o","-B..","-I..",NULL); call_proc_error("../tcc","-c","bcheck.c","-o","../bcheck.o","-B..","-I..","-bt",NULL); chdir(".."); #endif #if PLATFORM_WINDOWS call_proc_error(ENV_CC,"-o","tcc.o","-c","tcc.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DONE_SOURCE=0","-DTCC_GITHASH=\"2024-02-22 master@9546894\"","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","libtcc.o","-c","libtcc.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-DC2STR","conftest.c","-o","c2str.exe",NULL); call_proc_error("./c2str.exe","include/tccdefs.h","tccdefs_.h",NULL); call_proc_error(ENV_CC,"-o","tccpp.o","-c","tccpp.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccgen.o","-c","tccgen.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccdbg.o","-c","tccdbg.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccelf.o","-c","tccelf.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccasm.o","-c","tccasm.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccrun.o","-c","tccrun.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","i386-gen.o","-c","i386-gen.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","i386-link.o","-c","i386-link.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","i386-asm.o","-c","i386-asm.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-o","tccpe.o","-c","tccpe.c","-DTCC_TARGET_"ARCH_NAME,"-DTCC_TARGET_PE","-DLIBTCC_AS_DLL","-DONE_SOURCE=0","-Wall","-O2","-Wdeclaration-after-statement","-fno-strict-aliasing","-Wno-pointer-sign","-Wno-sign-compare","-Wno-unused-result","-Wno-format-truncation","-Wno-stringop-truncation","-I.",NULL); call_proc_error(ENV_CC,"-shared","-o","libtcc.dll","libtcc.o","tccpp.o","tccgen.o","tccdbg.o","tccelf.o","tccasm.o","tccrun.o","i386-gen.o","i386-link.o","i386-asm.o","tccpe.o","-static","-s",NULL); call_proc_error(ENV_CC,"-o","tcc.exe","tcc.o","libtcc.dll","-static","-s",NULL); call_proc_error("./tcc.exe","-impdef","libtcc.dll","-o","libtcc.def",NULL); chdir("lib"); call_proc_error("../tcc.exe","-c","libtcc1.c","-o","libtcc1.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","alloca.S","-o","alloca.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","alloca-bt.S","-o","alloca-bt.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","stdatomic.c","-o","stdatomic.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","atomic.S","-o","atomic.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","builtin.c","-o","builtin.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","tcov.c","-o","tcov.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/chkstk.S","-o","chkstk.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/crt1.c","-o","crt1.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/crt1w.c","-o","crt1w.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/wincrt1.c","-o","wincrt1.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/wincrt1w.c","-o","wincrt1w.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/dllcrt1.c","-o","dllcrt1.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","../win32/lib/dllmain.c","-o","dllmain.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-ar","rcs","../libtcc1.a","libtcc1.o","alloca.o","alloca-bt.o","stdatomic.o","atomic.o","builtin.o","tcov.o","chkstk.o","crt1.o","crt1w.o","wincrt1.o","wincrt1w.o","dllcrt1.o","dllmain.o",NULL); call_proc_error("../tcc.exe","-c","bt-exe.c","-o","../bt-exe.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","bt-log.c","-o","../bt-log.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","runmain.c","-o","../runmain.o","-B../win32","-I../include","-I..",NULL); call_proc_error("../tcc.exe","-c","bcheck.c","-o","../bcheck.o","-B../win32","-I../include","-I..","-bt",NULL); call_proc_error("../tcc.exe","-c","bt-dll.c","-o","../bt-dll.o","-B../win32","-I../include","-I..",NULL); chdir(".."); #endif return 0; }