Unified · Split
| @@ -305,7 +305,7 @@ libtcc_test$(EXESUF): libtcc_test.c libtcc.a · 304 unmodified lines | ||
| 305 | 305 | $(CC) $(CFLAGS) -o $@ $< libtcc.a $(LIBS) |
| 306 | 306 | |
| 307 | 307 | libtest: libtcc_test |
| 308 | − ./libtcc_test | |
| 308 | + ./libtcc_test lib_path=. | |
| 309 | 309 | |
| 310 | 310 | # targets for development |
| 311 | 311 | |
| @@ -92,6 +92,9 @@ int tcc_relocate(TCCState *s1, void *ptr); · 91 unmodified lines | ||
| 92 | 92 | /* return symbol value or NULL if not found */ |
| 93 | 93 | void *tcc_get_symbol(TCCState *s, const char *name); |
| 94 | 94 | |
| 95 | +/* set CONFIG_TCCDIR at runtime */ | |
| 96 | +void tcc_set_lib_path(TCCState *s, const char *path); | |
| 97 | + | |
| 95 | 98 | #ifdef __cplusplus |
| 96 | 99 | } |
| 97 | 100 | #endif |
| @@ -5,6 +5,7 @@ · 4 unmodified lines | ||
| 5 | 5 | */ |
| 6 | 6 | #include <stdlib.h> |
| 7 | 7 | #include <stdio.h> |
| 8 | +#include <string.h> | |
| 8 | 9 | |
| 9 | 10 | #include "libtcc.h" |
| 10 | 11 | |
| @@ -14,7 +15,7 @@ int add(int a, int b) · 3 unmodified lines | ||
| 14 | 15 | return a + b; |
| 15 | 16 | } |
| 16 | 17 | |
| 17 | −char my_program[] = | |
| 18 | +char my_program[] = | |
| 18 | 19 | "int fib(int n)\n" |
| 19 | 20 | "{\n" |
| 20 | 21 | " if (n <= 2)\n" |
| @@ -37,22 +38,27 @@ int main(int argc, char **argv) · 16 unmodified lines | ||
| 37 | 38 | int (*func)(int); |
| 38 | 39 | void *mem; |
| 39 | 40 | int size; |
| 40 | − | |
| 41 | + | |
| 41 | 42 | s = tcc_new(); |
| 42 | 43 | if (!s) { |
| 43 | 44 | fprintf(stderr, "Could not create tcc state\n"); |
| 44 | 45 | exit(1); |
| 45 | 46 | } |
| 46 | 47 | |
| 47 | − /* MUST BE CALLED before any compilation or file loading */ | |
| 48 | + /* if tcclib.h and libtcc1.a are not installed, where can we find them */ | |
| 49 | + if (argc == 2 && !memcmp(argv[1], "lib_path=",9)) | |
| 50 | + tcc_set_lib_path(s, argv[1]+9); | |
| 51 | + | |
| 52 | + /* MUST BE CALLED before any compilation */ | |
| 48 | 53 | tcc_set_output_type(s, TCC_OUTPUT_MEMORY); |
| 49 | 54 | |
| 50 | − tcc_compile_string(s, my_program); | |
| 55 | + if (tcc_compile_string(s, my_program) == -1) | |
| 56 | + return 1; | |
| 51 | 57 | |
| 52 | 58 | /* as a test, we add a symbol that the compiled program can use. |
| 53 | 59 | You may also open a dll with tcc_add_dll() and use symbols from that */ |
| 54 | 60 | tcc_add_symbol(s, "add", add); |
| 55 | − | |
| 61 | + | |
| 56 | 62 | /* get needed size of the code */ |
| 57 | 63 | size = tcc_relocate(s, NULL); |
| 58 | 64 | if (size == -1) |
| @@ -1122,7 +1122,7 @@ char *normalize_slashes(char *path) · 1121 unmodified lines | ||
| 1122 | 1122 | return path; |
| 1123 | 1123 | } |
| 1124 | 1124 | |
| 1125 | −char *w32_tcc_lib_path(void) | |
| 1125 | +void tcc_set_lib_path_w32(TCCState *s) | |
| 1126 | 1126 | { |
| 1127 | 1127 | /* on win32, we suppose the lib and includes are at the location |
| 1128 | 1128 | of 'tcc.exe' */ |
| @@ -1134,7 +1134,7 @@ char *w32_tcc_lib_path(void) · 5 unmodified lines | ||
| 1134 | 1134 | else if (p > path) |
| 1135 | 1135 | p--; |
| 1136 | 1136 | *p = 0; |
| 1137 | − return strdup(path); | |
| 1137 | + tcc_set_lib_path(s, path); | |
| 1138 | 1138 | } |
| 1139 | 1139 | #endif |
| 1140 | 1140 | |
| @@ -10967,6 +10967,12 @@ int tcc_set_flag(TCCState *s, const char *flag_name, int value) · 9826 unmodified lines | ||
| 10967 | 10967 | flag_name, value); |
| 10968 | 10968 | } |
| 10969 | 10969 | |
| 10970 | +/* set CONFIG_TCCDIR at runtime */ | |
| 10971 | +void tcc_set_lib_path(TCCState *s, const char *path) | |
| 10972 | +{ | |
| 10973 | + tcc_lib_path = tcc_strdup(path); | |
| 10974 | +} | |
| 10975 | + | |
| 10970 | 10976 | #if !defined(LIBTCC) |
| 10971 | 10977 | |
| 10972 | 10978 | static int64_t getclock_us(void) |
| @@ -11217,7 +11223,7 @@ int parse_args(TCCState *s, int argc, char **argv) · 244 unmodified lines | ||
| 11217 | 11223 | break; |
| 11218 | 11224 | case TCC_OPTION_B: |
| 11219 | 11225 | /* set tcc utilities path (mainly for tcc development) */ |
| 11220 | − tcc_lib_path = optarg; | |
| 11226 | + tcc_set_lib_path(s, optarg); | |
| 11221 | 11227 | break; |
| 11222 | 11228 | case TCC_OPTION_l: |
| 11223 | 11229 | dynarray_add((void ***)&files, &nb_files, r); |
| @@ -11350,11 +11356,10 @@ int main(int argc, char **argv) · 126 unmodified lines | ||
| 11350 | 11356 | char objfilename[1024]; |
| 11351 | 11357 | int64_t start_time = 0; |
| 11352 | 11358 | |
| 11359 | + s = tcc_new(); | |
| 11353 | 11360 | #ifdef _WIN32 |
| 11354 | − tcc_lib_path = w32_tcc_lib_path(); | |
| 11361 | + tcc_set_lib_path_w32(s); | |
| 11355 | 11362 | #endif |
| 11356 | − | |
| 11357 | − s = tcc_new(); | |
| 11358 | 11363 | output_type = TCC_OUTPUT_EXE; |
| 11359 | 11364 | outfile = NULL; |
| 11360 | 11365 | multiple_files = 1; |