I ran into this problem using Visual Studio 2008 and wrote up a macro to 
generate the add_custom_command for each idl file.  The function will rerun the 
build command whenever the idl file is modified.  There is very little 
documentation for working with idl files online, so I hope this helps you.

Variables:
        IDL_H_FILES: Generated header files
        IDL_C_FILES: Generated C files
        IDL_OUTPUT_LOC: The location where you want the build products to be 
placed
        idl_file1.idl ...: A list of idl files that you want to run the macro 
against.

#IDL_COMPILE( IDL_H_FILES_VAR IDL_C_FILES_VAR IDL_OUTPUT_LOC_VAR idl_file1.idl 
idl_file2.idl ... )
MACRO( IDL_COMPILE IDL_H_FILES_VAR IDL_C_FILES_VAR IDL_OUTPUT_LOC )
  IF( WIN32 )
    SET( ${IDL_H_FILES} "" )
    SET( ${IDL_C_FILES} "" )
    FOREACH( INDEX ${ARGN} )
      GET_FILENAME_COMPONENT( INFILE_NAME ${INDEX} NAME_WE )
      GET_FILENAME_COMPONENT( INFILE_PATH ${INDEX} PATH )
      SET( OUT_H_FILE "${INFILE_NAME}.h" )
      SET( OUT_H_FILE_FULL "${IDL_OUTPUT_LOC}/${OUT_H_FILE}" )
      SET( OUT_IC_FILE "${INFILE_NAME}_i.c" )
      SET( OUT_IC_FILE_FULL "${IDL_OUTPUT_LOC}/${OUT_IC_FILE}" )
      SET( OUT_PC_FILE "${INFILE_NAME}_p.c" )
      SET( OUT_PC_FILE_FULL "${IDL_OUTPUT_LOC}/${OUT_PC_FILE}" )
      SET( OUT_TLB_FILE "${INFILE_NAME}.tlb" )
      SET( OUT_TLB_FILE_FULL "${IDL_OUTPUT_LOC}/${OUT_TLB_FILE}" )
      IF( "${ZEBRA_PLATFORM}" STREQUAL "x32" )
        SET( DEST_PLATFORM "win32" )
      ELSE( "${ZEBRA_PLATFORM}" STREQUAL "x32" )
        SET( DEST_PLATFORM "x64" )
      ENDIF( "${ZEBRA_PLATFORM}" STREQUAL "x32" )
      ADD_CUSTOM_COMMAND( OUTPUT ${OUT_H_FILE_FULL} ${OUT_IC_FILE_FULL} 
${OUT_TLB_FILE_FULL}
        COMMAND midl
        ARGS \"${INDEX}\" /I \"${INFILE_PATH}\" /char signed /env 
${DEST_PLATFORM} /Oicf /tlb \"${OUT_TLB_FILE}\" /out \"${IDL_OUTPUT_LOC}\" /h 
\"${OUT_H_FILE}\" /iid \"${OUT_IC_FILE}\" /proxy \"${OUT_PC_FILE}\"
        MAIN_DEPENDENCY ${INDEX}
        )
      LIST( APPEND ${IDL_H_FILES_VAR} "${OUT_H_FILE_FULL}" )
      LIST( APPEND ${IDL_C_FILES_VAR} "${OUT_IC_FILE_FULL}" )
    ENDFOREACH( INDEX )
  ENDIF( WIN32 )
ENDMACRO( ZEBRA_IDL_COMPILE )

-----Original Message-----
From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On Behalf Of 
avner cohen
Sent: Sunday, August 02, 2009 11:33 AM
To: cmake@cmake.org
Subject: [CMake] Auto detect IDL changes


Greetings all,

I've been deploying Cmake into our project for the past 2-3 months and just up 
with a problem I was unable to resovle so far.

As part of the work we do, during Cmake execution, we also compile our C++ IDLs.

I've managed to come up with a clean EXECUTE_PROCESS code that will run this on 
all OSs.
The problem is that IDLs do not change on a frequent basis and the fact that 
these are added to the cmake makes it very generic, but forces a full build 
with every build request.

Is there any way to come up with a way to identify the case where IDLs are 
changed only than execute the compilation code?

Thanks in Advance,
         Avner Cohen.


      
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to