📄 jlibtool.c
字号:
#ifndef LINKER_FLAG_NO_EQUALS strcat(tmp, "=");#endif strcat(tmp, path); push_count_chars(cc, tmp);}void add_rpath_file(count_chars *cc, const char *arg){ const char *path; path = load_install_path(arg); if (path) { add_rpath(cc, path); }}void add_rpath_noinstall(count_chars *cc, const char *arg, int pathlen){ const char *path; path = load_noinstall_path(arg, pathlen); if (path) { add_rpath(cc, path); }}#endif#ifdef DYNAMIC_LINK_NO_INSTALLvoid add_dylink_noinstall(count_chars *cc, const char *arg, int pathlen, int extlen){ const char *install_path, *current_path, *name; char *exp_argument; int i_p_len, c_p_len, name_len, dyext_len, cur_len; install_path = load_install_path(arg); current_path = load_noinstall_path(arg, pathlen); if (!install_path || !current_path) { return; } push_count_chars(cc, DYNAMIC_LINK_NO_INSTALL); i_p_len = strlen(install_path); c_p_len = strlen(current_path); name = arg+pathlen; name_len = extlen-pathlen; dyext_len = sizeof(DYNAMIC_LIB_EXT) - 1; /* No, we need to replace the extension. */ exp_argument = (char *)malloc(i_p_len + c_p_len + (name_len*2) + (dyext_len*2) + 2); cur_len = 0; strcpy(exp_argument, install_path); cur_len += i_p_len; exp_argument[cur_len++] = '/'; strncpy(exp_argument+cur_len, name, extlen-pathlen); cur_len += name_len; strcpy(exp_argument+cur_len, DYNAMIC_LIB_EXT); cur_len += dyext_len; exp_argument[cur_len++] = ':'; strcpy(exp_argument+cur_len, current_path); cur_len += c_p_len; exp_argument[cur_len++] = '/'; strncpy(exp_argument+cur_len, name, extlen-pathlen); cur_len += name_len; strcpy(exp_argument+cur_len, DYNAMIC_LIB_EXT); cur_len += dyext_len; push_count_chars(cc, exp_argument);}#endif/* use -L -llibname to allow to use installed libraries */void add_minus_l(count_chars *cc, const char *arg){ char *newarg; char *name = strrchr(arg, '/'); char *file = strrchr(arg, '.'); char *lib = strstr(name, "lib"); if (name !=NULL && file != NULL && lib == name+1) { *name = '\0'; *file = '\0'; file = name; file = file+4; push_count_chars(cc, "-L"); push_count_chars(cc, arg); /* we need one argument like -lapr-1 */ newarg = malloc(strlen(file) + 3); strcpy(newarg, "-l"); strcat(newarg, file); push_count_chars(cc, newarg); } else { push_count_chars(cc, arg); }}void add_linker_flag_prefix(count_chars *cc, const char *arg){#ifndef LINKER_FLAG_PREFIX push_count_chars(cc, arg);#else char *newarg; newarg = (char*)malloc(strlen(arg) + sizeof(LINKER_FLAG_PREFIX) + 1); strcpy(newarg, LINKER_FLAG_PREFIX); strcat(newarg, arg); push_count_chars(cc, newarg);#endif}/* returns just a file's name without the path */const char *jlibtool_basename(const char *fullpath){ const char *name = strrchr(fullpath, '/'); if (name == NULL) { name = strrchr(fullpath, '\\'); } if (name == NULL) { name = fullpath; } else { name++; } return name;}/* returns just a file's name without path or extension */const char *nameof(const char *fullpath){ const char *name; const char *ext; name = jlibtool_basename(fullpath); ext = strrchr(name, '.'); if (ext) { char *trimmed; trimmed = malloc(ext - name + 1); strncpy(trimmed, name, ext - name); trimmed[ext-name] = 0; return trimmed; } return name;}int explode_static_lib(command_t *cmd_data, const char *lib){ count_chars tmpdir_cc, libname_cc; const char *tmpdir, *libname; char savewd[PATH_MAX]; const char *name; DIR *dir; struct dirent *entry; const char *lib_args[4]; /* Bah! */ if (cmd_data->options.dry_run) { return 0; } name = jlibtool_basename(lib); init_count_chars(&tmpdir_cc); push_count_chars(&tmpdir_cc, ".libs/"); push_count_chars(&tmpdir_cc, name); push_count_chars(&tmpdir_cc, ".exploded/"); tmpdir = flatten_count_chars(&tmpdir_cc, 0); if (!cmd_data->options.silent) { printf("Making: %s\n", tmpdir); } safe_mkdir(tmpdir); push_count_chars(cmd_data->tmp_dirs, tmpdir); getcwd(savewd, sizeof(savewd)); if (chdir(tmpdir) != 0) { if (!cmd_data->options.silent) { printf("Warning: could not explode %s\n", lib); } return 1; } if (lib[0] == '/') { libname = lib; } else { init_count_chars(&libname_cc); push_count_chars(&libname_cc, "../../"); push_count_chars(&libname_cc, lib); libname = flatten_count_chars(&libname_cc, 0); } lib_args[0] = LIBRARIAN; lib_args[1] = "x"; lib_args[2] = libname; lib_args[3] = NULL; external_spawn(cmd_data, LIBRARIAN, lib_args); chdir(savewd); dir = opendir(tmpdir); while ((entry = readdir(dir)) != NULL) {#if defined(__APPLE__) && defined(RANLIB) /* Apple inserts __.SYMDEF which isn't needed. * Leopard (10.5+) can also add '__.SYMDEF SORTED' which isn't * much fun either. Just skip them. */ if (strstr(entry->d_name, "__.SYMDEF") != NULL) { continue; }#endif if (entry->d_name[0] != '.') { push_count_chars(&tmpdir_cc, entry->d_name); name = flatten_count_chars(&tmpdir_cc, 0); if (!cmd_data->options.silent) { printf("Adding: %s\n", name); } push_count_chars(cmd_data->obj_files, name); pop_count_chars(&tmpdir_cc); } } closedir(dir); return 0;}int parse_input_file_name(char *arg, command_t *cmd_data){ char *ext = strrchr(arg, '.'); char *name = strrchr(arg, '/'); int pathlen; enum lib_type libtype; char *newarg; if (!ext) { return 0; } ext++; if (name == NULL) { name = strrchr(arg, '\\'); if (name == NULL) { name = arg; } else { name++; } } else { name++; } pathlen = name - arg; if (strcmp(ext, "lo") == 0) { newarg = check_object_exists(cmd_data, arg, ext - arg); if (!newarg) { printf("Can not find suitable object file for %s\n", arg); exit(1); } if (cmd_data->mode != mLink) { push_count_chars(cmd_data->arglist, newarg); } else { push_count_chars(cmd_data->obj_files, newarg); } return 1; } if (strcmp(ext, "la") == 0) { switch (cmd_data->mode) { case mLink: /* Try the .libs dir first! */ newarg = check_library_exists(cmd_data, arg, pathlen, 1, &libtype); if (!newarg) { /* Try the normal dir next. */ newarg = check_library_exists(cmd_data, arg, pathlen, 0, &libtype); if (!newarg) { printf("Can not find suitable library for %s\n", arg); exit(1); } } /* It is not ok to just add the file: a library may added with: 1 - -L path library_name. (For *.so in Linux). 2 - library_name. */#ifdef ADD_MINUS_L if (libtype == type_DYNAMIC_LIB) { add_minus_l(cmd_data->shared_opts.dependencies, newarg); } else if (cmd_data->output == otLibrary && libtype == type_STATIC_LIB) { explode_static_lib(cmd_data, newarg); } else { push_count_chars(cmd_data->shared_opts.dependencies, newarg); }#else if (cmd_data->output == otLibrary && libtype == type_STATIC_LIB) { explode_static_lib(cmd_data, newarg); } else { push_count_chars(cmd_data->shared_opts.dependencies, newarg); }#endif if (libtype == type_DYNAMIC_LIB) { if (cmd_data->options.no_install) {#ifdef RPATH add_rpath_noinstall(cmd_data->shared_opts.dependencies, arg, pathlen);#endif#ifdef DYNAMIC_LINK_NO_INSTALL /* * This doesn't work as Darwin's linker has no way to * override at link-time the search paths for a * non-installed library. */ /* add_dylink_noinstall(cmd_data->shared_opts.dependencies, arg, pathlen, ext - arg); */#endif } else {#ifdef RPATH add_rpath_file(cmd_data->shared_opts.dependencies, arg);#endif } } break; case mInstall: /* If we've already recorded a library to install, we're most * likely getting the .la file that we want to install as. * The problem is that we need to add it as the directory, * not the .la file itself. Otherwise, we'll do odd things. */ if (cmd_data->output == otLibrary) { arg[pathlen] = '\0'; push_count_chars(cmd_data->arglist, arg); } else { cmd_data->output = otLibrary; cmd_data->output_name = arg; cmd_data->static_name.install = gen_install_name(arg, 0); cmd_data->shared_name.install = gen_install_name(arg, 1); cmd_data->module_name.install = gen_install_name(arg, 2); } break; default: break; } return 1; } if (strcmp(ext, "c") == 0) { /* If we don't already have an idea what our output name will be. */ if (cmd_data->basename == NULL) { cmd_data->basename = (char *)malloc(strlen(arg) + 4); strcpy(cmd_data->basename, arg); strcpy(strrchr(cmd_data->basename, '.') + 1, "lo"); cmd_data->fake_output_name = strrchr(cmd_data->basename, '/'); if (cmd_data->fake_output_name) { cmd_data->fake_output_name++; } else { cmd_data->fake_output_name = cmd_data->basename; } } } return 0;}int parse_output_file_name(char *arg, command_t *cmd_data){ char *name = strrchr(arg, '/'); char *ext = strrchr(arg, '.'); char *newarg = NULL; int pathlen; cmd_data->fake_output_name = arg; if (name) { name++; } else { name = strrchr(arg, '\\'); if (name == NULL) { name = arg; } else { name++; } }#ifdef EXE_EXT if (!ext || strcmp(ext, EXE_EXT) == 0) {#else if (!ext) {#endif cmd_data->basename = arg; cmd_data->output = otProgram;#if defined(_OSD_POSIX) cmd_data->options.pic_mode = pic_AVOID;#endif newarg = (char *)malloc(strlen(arg) + 5); strcpy(newarg, arg);#ifdef EXE_EXT if (!ext) { strcat(newarg, EXE_EXT); }#endif cmd_data->output_name = newarg; return 1; } ext++; pathlen = name - arg; if (strcmp(ext, "la") == 0) { assert(cmd_data->mode == mLink); cmd_data->basename = arg; cmd_data->static_name.normal = gen_library_name(arg, 0); cmd_data->shared_name.normal = gen_library_name(arg, 1); cmd_data->module_name.normal = gen_library_name(arg, 2); cmd_data->static_name.install = gen_install_name(arg, 0); cmd_data->shared_name.install = gen_install_name(arg, 1); cmd_data->module_name.install = gen_install_name(arg, 2);#ifdef TRUNCATE_DLL_NAME if (shared) { arg = truncate_dll_name(arg); }#endif cmd_data->output_name = arg; return 1; } if (strcmp(ext, "lo") == 0) { cmd_data->basename = arg; cmd_data->output = otObject; newarg = (char *)malloc(strlen(arg) + 2); strcpy(newarg, arg); ext = strrchr(newarg, '.') + 1; strcpy(ext, OBJECT_EXT); cmd_data->output_name = newarg; return 1; } return 0;}void parse_args(int argc, char *argv[], command_t *cmd_data){ int a; char *arg; int argused; for (a = 1; a < argc; a++) { arg = argv[a]; argused = 1; if (arg[0] == '-') { if (arg[1] == '-') { argused = parse_long_opt(arg + 2, cmd_data); } else { argused = parse_short_opt(arg + 1, cmd_data); } /* We haven't done anything with it yet, try some of the * more complicated short opts... */ if (argused == 0 && a + 1 < argc) { if (arg[1] == 'o' && !arg[2]) { arg = argv[++a]; argused = parse_output_file_name(arg, cmd_data); } else if (strcmp(arg+1, "MT") == 0) { if (!cmd_data->options.silent) { printf("Adding: %s\n", arg); } push_count_chars(cmd_data->arglist, arg); arg = argv[++a]; if (!cmd_data->options.silent) { printf(" %s\n", arg); } push_count_chars(cmd_data->arglist, arg); argused = 1; } else if (strcmp(arg+1, "rpath") == 0) { /* Aha, we should try to link both! */ cmd_data->install_path = argv[++a]; argused = 1; } else if (strcmp(arg+1, "version-info") == 0) { /* Store for later deciphering */ cmd_data->version_info = argv[++a]; argused = 1; } else if (strcmp(arg+1, "export-symbols-regex") == 0) { /* Skip the argument. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -