For static libs (.a) we need to pass the actual filename to winebuild,

not a -l switch. Do not remove the file extension to get to the base
name if it's not .exe or .exe.so. Link shell32 by default for GUI
programs. Fix parsing of options with arguments.
This commit is contained in:
Dimitrie O. Paun 2004-02-26 05:28:35 +00:00 committed by Alexandre Julliard
parent 65130e8a5d
commit 006ec80dd5
3 changed files with 47 additions and 41 deletions

View File

@ -157,22 +157,18 @@ void create_file(const char* name, const char* fmt, ...)
fclose(file); fclose(file);
} }
file_type get_file_type(const char* dir, const char* filename) file_type get_file_type(const char* filename)
{ {
/* see tools/winebuild/res32.c: check_header for details */ /* see tools/winebuild/res32.c: check_header for details */
static const char res_sig[] = { 0,0,0,0, 32,0,0,0, 0xff,0xff, 0,0, 0xff,0xff, 0,0, 0,0,0,0, 0,0, 0,0, 0,0,0,0, 0,0,0,0 }; static const char res_sig[] = { 0,0,0,0, 32,0,0,0, 0xff,0xff, 0,0, 0xff,0xff, 0,0, 0,0,0,0, 0,0, 0,0, 0,0,0,0, 0,0,0,0 };
char buf[sizeof(res_sig)]; char buf[sizeof(res_sig)];
char *fullname;
int fd, cnt; int fd, cnt;
fullname = strmake("%s/%s", dir, filename); fd = open( filename, O_RDONLY );
fd = open( fullname, O_RDONLY );
cnt = read(fd, buf, sizeof(buf));
if (cnt == -1) error("Can't read file: %s/%s", dir, filename);
free( fullname );
close( fd );
if (fd == -1) return file_na; if (fd == -1) return file_na;
cnt = read(fd, buf, sizeof(buf));
close( fd );
if (cnt == -1) return file_na;
if (cnt == sizeof(res_sig) && !memcmp(buf, res_sig, sizeof(res_sig))) return file_res; if (cnt == sizeof(res_sig) && !memcmp(buf, res_sig, sizeof(res_sig))) return file_res;
if (strendswith(filename, ".o")) return file_obj; if (strendswith(filename, ".o")) return file_obj;
@ -185,46 +181,48 @@ file_type get_file_type(const char* dir, const char* filename)
return file_other; return file_other;
} }
static file_type try_lib_path(const char* dir, const char* pre, static char* try_lib_path(const char* dir, const char* pre,
const char* library, const char* ext) const char* library, const char* ext,
file_type expected_type)
{ {
char *fullname; char *fullname;
file_type type; file_type type;
fullname = strmake("%s%s%s", pre, library, ext); fullname = strmake("%s/%s%s%s", dir, pre, library, ext);
if (verbose > 1) fprintf(stderr, "Try %s/%s...", dir, fullname); if (verbose > 1) fprintf(stderr, "Try %s...", fullname);
type = get_file_type(dir, fullname); type = get_file_type(fullname);
if (verbose > 1) fprintf(stderr, type == expected_type ? "FOUND!\n" : "no\n");
if (type == expected_type) return fullname;
free( fullname ); free( fullname );
if (verbose > 1) fprintf(stderr, type == file_na ? "no\n" : "FOUND!\n"); return 0;
return type;
} }
static file_type guess_lib_type(const char* dir, const char* library) static file_type guess_lib_type(const char* dir, const char* library, char** file)
{ {
/* Unix shared object */ /* Unix shared object */
if (try_lib_path(dir, "lib", library, ".so") == file_so) if ((*file = try_lib_path(dir, "lib", library, ".so", file_so)))
return file_so; return file_so;
/* Windows DLL */ /* Windows DLL */
if (try_lib_path(dir, "lib", library, ".def") == file_dll) if ((*file = try_lib_path(dir, "lib", library, ".def", file_dll)))
return file_dll; return file_dll;
if (try_lib_path(dir, "", library, ".def") == file_dll) if ((*file = try_lib_path(dir, "", library, ".def", file_dll)))
return file_dll; return file_dll;
/* Unix static archives */ /* Unix static archives */
if (try_lib_path(dir, "lib", library, ".a") == file_arh) if ((*file = try_lib_path(dir, "lib", library, ".a", file_arh)))
return file_arh; return file_arh;
return file_na; return file_na;
} }
file_type get_lib_type(strarray* path, const char* library) file_type get_lib_type(strarray* path, const char* library, char** file)
{ {
int i; int i;
for (i = 0; i < path->size; i++) for (i = 0; i < path->size; i++)
{ {
file_type type = guess_lib_type(path->base[i], library); file_type type = guess_lib_type(path->base[i], library, file);
if (type != file_na) return type; if (type != file_na) return type;
} }
return file_na; return file_na;

View File

@ -46,8 +46,8 @@ typedef enum {
char* get_basename(const char* file); char* get_basename(const char* file);
void create_file(const char* name, const char* fmt, ...); void create_file(const char* name, const char* fmt, ...);
file_type get_file_type(const char* dir, const char* filename); file_type get_file_type(const char* filename);
file_type get_lib_type(strarray* path, const char* library); file_type get_lib_type(strarray* path, const char* library, char** file);
void spawn(const strarray* arr); void spawn(const strarray* arr);
extern int verbose; extern int verbose;

View File

@ -274,7 +274,10 @@ static void compile(struct options* opts)
if (opts->compile_only) if (opts->compile_only)
strarray_add(comp_args, "-c"); strarray_add(comp_args, "-c");
if (opts->output_name) if (opts->output_name)
strarray_add(comp_args, strmake("-o%s", opts->output_name)); {
strarray_add(comp_args, "-o");
strarray_add(comp_args, opts->output_name);
}
/* the rest of the pass-through parameters */ /* the rest of the pass-through parameters */
for ( j = 0 ; j < opts->compiler_args->size ; j++ ) for ( j = 0 ; j < opts->compiler_args->size ; j++ )
@ -324,12 +327,14 @@ static void build(struct options* opts)
res_files = strarray_alloc(); res_files = strarray_alloc();
lib_paths = strarray_alloc(); lib_paths = strarray_alloc();
output_name = opts->output_name ? opts->output_name : "a.out.exe"; output_name = opts->output_name ? opts->output_name : "a.out";
/* get base filename by removing the .exe extension, if present */ /* get base filename by removing the .exe extension, if present */
base_file = strdup(output_name); base_file = strdup(output_name);
if (strendswith(base_file, ".exe")) base_file[strlen(base_file) - 4] = 0; if (strendswith(base_file, ".exe.so")) base_file[strlen(base_file) - 7] = 0;
base_name = get_basename(output_name); else if (strendswith(base_file, ".exe")) base_file[strlen(base_file) - 4] = 0;
if ((base_name = strrchr(base_file, '/'))) base_name++;
else base_name = base_file;
/* prepare the linking path */ /* prepare the linking path */
lib_dirs = strarray_dup(opts->lib_dirs); lib_dirs = strarray_dup(opts->lib_dirs);
@ -343,21 +348,22 @@ static void build(struct options* opts)
for ( j = 0; j < opts->lib_names->size; j++ ) for ( j = 0; j < opts->lib_names->size; j++ )
{ {
const char* name = opts->lib_names->base[j]; const char* name = opts->lib_names->base[j];
const char* lib = strmake("-l%s", name); char* fullname;
switch(get_lib_type(lib_dirs, name)) switch(get_lib_type(lib_dirs, name, &fullname))
{ {
case file_arh: case file_arh:
strarray_add(arh_libs, lib); strarray_add(arh_libs, strdup(fullname));
break; break;
case file_dll: case file_dll:
strarray_add(dll_libs, lib); strarray_add(dll_libs, strmake("-l%s", name));
break; break;
case file_so: case file_so:
strarray_add(so_libs, lib); strarray_add(so_libs, strmake("-l%s", name));
break; break;
default: default:
fprintf(stderr, "Can't find library %s, ignoring\n", name); fprintf(stderr, "Can't find library '%s', ignoring\n", name);
} }
free(fullname);
} }
if (!opts->nostdlib) if (!opts->nostdlib)
@ -369,10 +375,10 @@ static void build(struct options* opts)
{ {
if (opts->gui_app) if (opts->gui_app)
{ {
strarray_add(dll_libs, "-lshell32");
strarray_add(dll_libs, "-lcomdlg32"); strarray_add(dll_libs, "-lcomdlg32");
strarray_add(dll_libs, "-lgdi32"); strarray_add(dll_libs, "-lgdi32");
} }
strarray_add(dll_libs, "-lshell32");
strarray_add(dll_libs, "-ladvapi32"); strarray_add(dll_libs, "-ladvapi32");
strarray_add(dll_libs, "-luser32"); strarray_add(dll_libs, "-luser32");
strarray_add(dll_libs, "-lkernel32"); strarray_add(dll_libs, "-lkernel32");
@ -382,7 +388,7 @@ static void build(struct options* opts)
for ( j = 0; j < opts->files->size; j++ ) for ( j = 0; j < opts->files->size; j++ )
{ {
const char* file = opts->files->base[j]; const char* file = opts->files->base[j];
switch(get_file_type(".", file)) switch(get_file_type(file))
{ {
case file_rc: case file_rc:
/* FIXME: invoke wrc to build it */ /* FIXME: invoke wrc to build it */
@ -452,7 +458,8 @@ static void build(struct options* opts)
strarray_add(link_args, "-Wl,-Bsymbolic,-z,defs"); strarray_add(link_args, "-Wl,-Bsymbolic,-z,defs");
#endif #endif
strarray_add(link_args, strmake("-o%s.exe.so", base_file)); strarray_add(link_args, "-o");
strarray_add(link_args, strmake("%s.exe.so", base_file));
for ( j = 0 ; j < opts->linker_args->size ; j++ ) for ( j = 0 ; j < opts->linker_args->size ; j++ )
strarray_add(link_args, opts->linker_args->base[j]); strarray_add(link_args, opts->linker_args->base[j]);
@ -595,13 +602,14 @@ int main(int argc, char **argv)
if (argv[i][0] == '-') /* option */ if (argv[i][0] == '-') /* option */
{ {
/* determine if tihs switch is followed by a separate argument */ /* determine if tihs switch is followed by a separate argument */
next_is_arg = 0;
option_arg = 0; option_arg = 0;
switch(argv[i][1]) switch(argv[i][1])
{ {
case 'x': case 'o': case 'D': case 'U': case 'x': case 'o': case 'D': case 'U':
case 'I': case 'A': case 'l': case 'u': case 'I': case 'A': case 'l': case 'u':
case 'b': case 'V': case 'G': case 'b': case 'V': case 'G':
if (argv[i][2]) option_arg = argv[i] + 2; if (argv[i][2]) option_arg = &argv[i][2];
else next_is_arg = 1; else next_is_arg = 1;
break; break;
case 'i': case 'i':
@ -619,7 +627,7 @@ int main(int argc, char **argv)
c = argv[i][2]; c = argv[i][2];
if (c == 'F' || c == 'T' || c == 'Q') if (c == 'F' || c == 'T' || c == 'Q')
{ {
if (argv[i][3]) option_arg = argv[i] + 3; if (argv[i][3]) option_arg = &argv[i][3];
else next_is_arg = 1; else next_is_arg = 1;
} }
break; break;
@ -706,7 +714,7 @@ int main(int argc, char **argv)
keep_generated = 1; keep_generated = 1;
break; break;
case 'v': case 'v':
if (argv[i][2] == 0) verbose = 1; if (argv[i][2] == 0) verbose++;
break; break;
case 'W': case 'W':
if (strncmp("-Wl,", argv[i], 4) == 0) if (strncmp("-Wl,", argv[i], 4) == 0)