[CMake] CMake and idl files... (LONG email - read if you have time)

David Cole david.cole at kitware.com
Thu Jan 26 12:30:31 EST 2006


For an input idl file named "AxVJV.idl" the Visual Studio .NET 2003 
wizard (by Microsoft) produces sections like this in the vcproj files:
            <Tool
                Name="VCMIDLTool"
                PreprocessorDefinitions="_DEBUG"
                MkTypLibCompatible="FALSE"
                TargetEnvironment="1"
                GenerateStublessProxies="TRUE"
                TypeLibraryName="$(IntDir)/AxVJV.tlb"
                HeaderFileName="AxVJV.h"
                DLLDataFileName=""
                InterfaceIdentifierFileName="AxVJV_i.c"
                ProxyFileName="AxVJV_p.c"/>

CMake 2.2.3 (and live CVS CMake) produces sections like this:
            <Tool
                Name="VCMIDLTool"/>

I think they should both produce sections like this (differences from 
wizard generated section highlighted in bold red) so that all the midl 
output files for different configurations are automatically sent to the 
$(IntDir) location. That way, midl output from one config won't clobber 
or accidentally depend on midl output from another config... Also, using 
InputName here allows for multiple idl files to co-exist in a single 
vcproj file semi-peacefully.
            <Tool
                Name="VCMIDLTool"
                PreprocessorDefinitions="_DEBUG"
                MkTypLibCompatible="FALSE"
                TargetEnvironment="1"
                GenerateStublessProxies="TRUE"
                TypeLibraryName="*$(InputName)*.tlb"
*                OutputDirectory="$(IntDir)"
*                HeaderFileName="*$(InputName)*.h"
                DLLDataFileName=""
                InterfaceIdentifierFileName="*$(InputName)*_i.c"
                ProxyFileName="*$(InputName)*_p.c"/>

Could we make CMake produce VCMIDLTool sections like I want them? :-)
The implementation might look like this (in 
cmLocalVisualStudio7Generator.cxx)

      fout << "\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n";
      fout << "\t\t\t\tPreprocessorDefinitions=\"" << pre;
      this->OutputDefineFlags(defineFlags.c_str(), fout);
      fout << "\"\n";
      fout << "\t\t\t\tMkTypLibCompatible=\"FALSE\"\n";
      fout << "\t\t\t\tTargetEnvironment=\"1\"\n";
      fout << "\t\t\t\tGenerateStublessProxies=\"TRUE\"\n";
      fout << "\t\t\t\tTypeLibraryName=\"$(InputName).tlb\"\n";
      fout << "\t\t\t\tOutputDirectory=\"$(IntDir)\"\n";
      fout << "\t\t\t\tHeaderFileName=\"$(InputName).h\"\n";
      fout << "\t\t\t\tDLLDataFileName=\"\"\n";
      fout << "\t\t\t\tInterfaceIdentifierFileName=\"$(InputName)_i.c\"\n";
      fout << "\t\t\t\tProxyFileName=\"$(InputName)_p.c\"/>\n";
      // end of <Tool Name=VCMIDLTool


Once this is implemented, there are two more things that need to be done 
to make idl files work "100%" with Visual Studio: include the generated 
"_i.c" file somehow and modify the include paths for c/c++ and rc files 
to include "$(IntDir)". These things are easy to implement, though: The 
include path is just another INCLUDE_DIRECTORIES statement in 
CMakeLists.txt and the "_i.c" and file can simply be #included by 
another one of your c/c++ source files. Having the extra include path 
happen *automatically *for projects that have an .idl source file would 
be a nice bonus, however.

Secondarily, but along the same lines... Perhaps a bit more work: could 
we add support for idl files to the make file generators? (At least to 
the NMake generator when midl is available as a command line tool on 
Windows...) Currently I get an error like this when I try to use a 
source file with an "idl" extension with the "NMake Makefiles" generator:

    -- Configuring done
    CMake Error: Source file "C:/blahblah/AxVJV.idl" has unknown type.
    -- Generating done
    -- Build files have been written to: C:/blahblah/bin

It generates a makefile, but then it can't build, because the first 
source file compiled depends on a header that should have been generated 
by midl. I can workaround this for now by adding a custom command for 
midl...


It's all just a little bit annoying when you're trying to convert a 
project that includes an idl file to be built via a CMake-centric build 
process.


Thanks,
David



More information about the CMake mailing list