📄 jlibtool.c
字号:
* Add a directory to the runtime library search path. */void add_runtimedirlib(char *arg, command_t *cmd_data){#ifdef RPATH add_rpath(cmd_data->shared_opts.dependencies, arg);#else#endif}int parse_long_opt(char *arg, command_t *cmd_data){ char *equal_pos = strchr(arg, '='); char var[50]; char value[500]; if (equal_pos) { strncpy(var, arg, equal_pos - arg); var[equal_pos - arg] = 0; strcpy(value, equal_pos + 1); } else { strcpy(var, arg); } if (strcmp(var, "silent") == 0) { cmd_data->options.silent = 1; } else if (strcmp(var, "mode") == 0) { if (strcmp(value, "compile") == 0) { cmd_data->mode = mCompile; cmd_data->output = otObject; } if (strcmp(value, "link") == 0) { cmd_data->mode = mLink; cmd_data->output = otLibrary; } if (strcmp(value, "install") == 0) { cmd_data->mode = mInstall; } } else if (strcmp(var, "shared") == 0) { if (cmd_data->mode == mLink) { cmd_data->output = otDynamicLibraryOnly; } cmd_data->options.shared = share_SHARED; } else if (strcmp(var, "export-all") == 0) { cmd_data->options.export_all = 1; } else if (strcmp(var, "dry-run") == 0) { printf("Dry-run mode on!\n"); cmd_data->options.dry_run = 1; } else if (strcmp(var, "version") == 0) { printf("Version " VERSION "\n"); } else if (strcmp(var, "help") == 0) { printf("Sorry. No help available.\n"); } else if (strcmp(var, "config") == 0) { print_config(); } else if (strcmp(var, "tag") == 0) { if (strcmp(value, "CC") == 0) { /* Do nothing. */ } if (strcmp(value, "CXX") == 0) { /* Do nothing. */ } } else { return 0; } return 1;}/* Return 1 if we eat it. */int parse_short_opt(char *arg, command_t *cmd_data){ if (strcmp(arg, "export-dynamic") == 0) { cmd_data->options.export_dynamic = 1; return 1; } if (strcmp(arg, "module") == 0) { cmd_data->output = otModule; return 1; } if (strcmp(arg, "shared") == 0) { if (cmd_data->mode == mLink) { cmd_data->output = otDynamicLibraryOnly; } cmd_data->options.shared = share_SHARED; return 1; } if (strcmp(arg, "Zexe") == 0) { return 1; } if (strcmp(arg, "avoid-version") == 0) { return 1; } if (strcmp(arg, "prefer-pic") == 0) { cmd_data->options.pic_mode = pic_PREFER; return 1; } if (strcmp(arg, "prefer-non-pic") == 0) { cmd_data->options.pic_mode = pic_AVOID; return 1; } if (strcmp(arg, "static") == 0) { cmd_data->options.shared = share_STATIC; return 1; } if (cmd_data->mode == mLink) { if (strcmp(arg, "no-install") == 0) { cmd_data->options.no_install = 1; return 1; } if (arg[0] == 'L' || arg[0] == 'l') { /* Hack... */ arg--; push_count_chars(cmd_data->shared_opts.dependencies, arg); return 1; } else if (arg[0] == 'R' && arg[1]) { /* -Rdir Add dir to runtime library search path. */ add_runtimedirlib(&arg[1], cmd_data); return 1; } } return 0;}char *truncate_dll_name(char *path){ /* Cut DLL name down to 8 characters after removing any mod_ prefix */ char *tmppath = strdup(path); char *newname = strrchr(tmppath, '/') + 1; char *ext = strrchr(tmppath, '.'); int len; if (ext == NULL) return tmppath; len = ext - newname; if (strncmp(newname, "mod_", 4) == 0) { strcpy(newname, newname + 4); len -= 4; } if (len > 8) { strcpy(newname + 8, strchr(newname, '.')); } return tmppath;}long safe_strtol(const char *nptr, const char **endptr, int base){ long rv; errno = 0; rv = strtol(nptr, (char**)endptr, 10); if (errno == ERANGE) { return 0; } return rv; }void safe_mkdir(const char *path){ mode_t old_umask; old_umask = umask(0); umask(old_umask);#ifdef MKDIR_NO_UMASK mkdir(path);#else mkdir(path, ~old_umask);#endif}/* version_info is in the form of MAJOR:MINOR:PATCH */const char *darwin_dynamic_link_function(const char *version_info){ char *newarg; long major, minor, patch; major = 0; minor = 0; patch = 0; if (version_info) { major = safe_strtol(version_info, &version_info, 10); if (version_info) { if (version_info[0] == ':') { version_info++; } minor = safe_strtol(version_info, &version_info, 10); if (version_info) { if (version_info[0] == ':') { version_info++; } patch = safe_strtol(version_info, &version_info, 10); } } } /* Avoid -dylib_compatibility_version must be greater than zero errors. */ if (major == 0) { major = 1; } newarg = (char*)malloc(100); snprintf(newarg, 99, "-compatibility_version %ld -current_version %ld.%ld", major, major, minor); return newarg;}/* genlib values * 0 - static * 1 - dynamic * 2 - module */char *gen_library_name(const char *name, int genlib){ char *newarg, *newext; newarg = (char *)malloc(strlen(name) + 10); strcpy(newarg, ".libs/"); if (genlib == 2 && strncmp(name, "lib", 3) == 0) { name += 3; } strcat(newarg, name); newext = strrchr(newarg, '.') + 1; switch (genlib) { case 0: strcpy(newext, STATIC_LIB_EXT); break; case 1: strcpy(newext, DYNAMIC_LIB_EXT); break; case 2: strcpy(newext, MODULE_LIB_EXT); break; } return newarg;}/* genlib values * 0 - static * 1 - dynamic * 2 - module */char *gen_install_name(const char *name, int genlib){ struct stat sb; char *newname; int rv; newname = gen_library_name(name, genlib); /* Check if it exists. If not, return NULL. */ rv = stat(newname, &sb); if (rv) { return NULL; } return newname;}char *check_object_exists(command_t *cmd, const char *arg, int arglen){ char *newarg, *ext; int pass, rv; newarg = (char *)malloc(arglen + 10); memcpy(newarg, arg, arglen); newarg[arglen] = 0; ext = newarg + arglen; pass = 0; do { struct stat sb; switch (pass) { case 0: strcpy(ext, OBJECT_EXT); break;/* case 1: strcpy(ext, NO_PIC_EXT); break;*/ default: break; } if (!cmd->options.silent) { printf("Checking (obj): %s\n", newarg); } rv = stat(newarg, &sb); } while (rv != 0 && ++pass < 1); if (rv == 0) { if (pass == 1) { cmd->options.pic_mode = pic_AVOID; } return newarg; } return NULL;}/* libdircheck values: * 0 - no .libs suffix * 1 - .libs suffix */char *check_library_exists(command_t *cmd, const char *arg, int pathlen, int libdircheck, enum lib_type *libtype){ char *newarg, *ext; int pass, rv, newpathlen; newarg = (char *)malloc(strlen(arg) + 10); strcpy(newarg, arg); newarg[pathlen] = 0; newpathlen = pathlen; if (libdircheck) { strcat(newarg, ".libs/"); newpathlen += sizeof(".libs/") - 1; } strcpy(newarg+newpathlen, arg+pathlen); ext = strrchr(newarg, '.') + 1; pass = 0; do { struct stat sb; switch (pass) { case 0: if (cmd->options.pic_mode != pic_AVOID && cmd->options.shared != share_STATIC) { strcpy(ext, DYNAMIC_LIB_EXT); *libtype = type_DYNAMIC_LIB; break; } pass = 1; /* Fall through */ case 1: strcpy(ext, STATIC_LIB_EXT); *libtype = type_STATIC_LIB; break; case 2: strcpy(ext, MODULE_LIB_EXT); *libtype = type_MODULE_LIB; break; case 3: strcpy(ext, OBJECT_EXT); *libtype = type_OBJECT; break; default: *libtype = type_UNKNOWN; break; } if (!cmd->options.silent) { printf("Checking (lib): %s\n", newarg); } rv = stat(newarg, &sb); } while (rv != 0 && ++pass < 4); if (rv == 0) { return newarg; } return NULL;}char * load_install_path(const char *arg){ FILE *f; char *path; path = malloc(PATH_MAX); f = fopen(arg,"r"); if (f == NULL) { return NULL; } fgets(path, PATH_MAX, f); fclose(f); if (path[strlen(path)-1] == '\n') { path[strlen(path)-1] = '\0'; } /* Check that we have an absolute path. * Otherwise the file could be a GNU libtool file. */ if (path[0] != '/') { return NULL; } return path;}char * load_noinstall_path(const char *arg, int pathlen){ char *newarg, *expanded_path; int newpathlen; newarg = (char *)malloc(strlen(arg) + 10); strcpy(newarg, arg); newarg[pathlen] = 0; newpathlen = pathlen; strcat(newarg, ".libs"); newpathlen += sizeof(".libs") - 1; newarg[newpathlen] = 0;#ifdef HAS_REALPATH expanded_path = malloc(PATH_MAX); expanded_path = realpath(newarg, expanded_path); /* Uh, oh. There was an error. Fall back on our first guess. */ if (!expanded_path) { expanded_path = newarg; }#else /* We might get ../ or something goofy. Oh, well. */ expanded_path = newarg;#endif return expanded_path;}void add_dynamic_link_opts(command_t *cmd_data, count_chars *args){#ifdef DYNAMIC_LINK_OPTS if (cmd_data->options.pic_mode != pic_AVOID) { if (!cmd_data->options.silent) { printf("Adding: %s\n", DYNAMIC_LINK_OPTS); } push_count_chars(args, DYNAMIC_LINK_OPTS); if (cmd_data->undefined_flag) { push_count_chars(args, "-undefined");#if defined(__APPLE__) /* -undefined dynamic_lookup is used by the bundled Python in * 10.4, but if we don't set MACOSX_DEPLOYMENT_TARGET to 10.3+, * we'll get a linker error if we pass this flag. */ if (strcasecmp(cmd_data->undefined_flag, "dynamic_lookup") == 0) { insert_count_chars(cmd_data->program_opts, "MACOSX_DEPLOYMENT_TARGET=10.3", 0); }#endif push_count_chars(args, cmd_data->undefined_flag); } else {#ifdef DYNAMIC_LINK_UNDEFINED if (!cmd_data->options.silent) { printf("Adding: %s\n", DYNAMIC_LINK_UNDEFINED); } push_count_chars(args, DYNAMIC_LINK_UNDEFINED);#endif } }#endif}/* Read the final install location and add it to runtime library search path. */#ifdef RPATHvoid add_rpath(count_chars *cc, const char *path){ int size = 0; char *tmp;#ifdef LINKER_FLAG_PREFIX size = strlen(LINKER_FLAG_PREFIX);#endif size = size + strlen(path) + strlen(RPATH) + 2; tmp = malloc(size); if (tmp == NULL) { return; }#ifdef LINKER_FLAG_PREFIX strcpy(tmp, LINKER_FLAG_PREFIX); strcat(tmp, RPATH);#else strcpy(tmp, RPATH);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -