[1/2]tools/winemaker: add project-file support(try3)

Francois Gouget fgouget at free.fr
Mon Feb 23 10:22:56 CST 2009


Hi,

I had a look at this patch and here are some comments.

The case of the filenames in the dsp and dsw files may not match the 
case of the filenames on the filesystem. So you need to ajsut the names 
before you put them in the makefile. I believe search_from() can be used 
for that.

I see that you're translating the Visual C++ compiler flags to gcc 
compiler flags. That's good. But I'm not sure about the following 
conversion from /GX to -fexceptions.
Exception handling is pretty different between windows and Unix. Do you 
know if /GX is about structured exception handing? I really couldn't 
tell, but maybe some exception expert will know.

I see you're converting the /Zp1 option which is very nice (packing 
being one of the disagreements between Visual C++ and gcc). But you 
don't do it for Zp(2|4|8|16). I believe you could do it by simply 
appending the packing size to the '-fpack-struct=' option. (But maybe I 
missed something)

A bigger issue is that you're putting all the compiler options in 
CXXEXTRA which only applies to C++ code. But in the dsp file it looks 
like this applies to both C and C++ code. So it probably should be put 
in both (except -fexceptions which seems to be on by default in C++, 
but that's minor).

About the commented out call to fix_file_and_directory_names(), I don't 
think winemaker should go and modify files outside of '.'. So I think 
it's safe to remove this call entirely.


Also I have some questions about a couple of heuristics:
  if ($has_headers) {
    push @{@$project_settings[$T_INCLUDE_PATH]},"-I.";
  }

Is this still needed? In source_scan_directory() it was needed because 
we had no idea what the include path was supposed to look like. But the 
project file should define it clearly enough for us. However I have a 
dsp file in a directory with a header file and I don't see a '/I.'. So 
maybe it is implied?

Also this part seems wrong:
  # Finally if we are building both libraries and programs in
  # this project, then the programs should be linked with all
  # the libraries

The project file should be explicit enough on this part for us not to 
have to do any guessing.

Also do we really need to worry much about matching source file with a 
given target? Won't we always have a single target per dsp file? In 
which case the matching can probably be simplified.

The end of source_scan_project_file() looks pretty similar to the end of 
source_scan_directory(). Maybe some code can be shared.


To make the patch smaller you can first submit the dsp parser, then the 
dsw one, the vcproj one, and finally the sln one.

And once that's done, it would be nice to integrate this all with the 
regular source_scan() function, so that if it detects one of these files 
in the subdirectories, it invokes the appropriate project parser for 
that directory and stops recursing. That can be done as a further 
separate patch.


Style issues:

The style issues are at least partly my fault as I used two-space 
indentation and braces on the same line when I first wrote winemaker. 
Nowadays I'd prefer 4-space indentation with braces on their own line 
but that's a bit tricky when maintaining a consistent indentation.

In any case, in places your code is too incoherent. For instance:
      } elsif(/^# TARGTYPE/) {
          if (/[[:space:]]0x0101$/) {
            # Win32 (x86) Application
            $prj_target_type=1;

This snippet has both 2 and 4 space indentation and it's all new code. 
There's also an indentation problem there:

  }
      }
      foreach my $source (@sources_misc) {
  if ($source =~ /^$basename/i) {

Personnally I'd recommend to maintain a consistent indentation scheme at 
least per function (though the policy is more to be consistent per file 
normally :-/ ).

Also, I'd prefer to have a space between 'if' and the prentheseses and 
braces.

You can also simplify a some string concatenations. Replace:

      $prj_target_cflags=$prj_target_cflags."-D".$1." ";
with
      $prj_target_cflags.="-D$1 ";


In any case, thanks for taking this on. I think you're pretty close to 
the end (even if you don't feel that way after reading the above<g>).


-- 
Francois Gouget <fgouget at free.fr>              http://fgouget.free.fr/
               If you think the whole world revolves around you,
                 quit staring at the GPS display while driving.



More information about the wine-devel mailing list