On 5. Jun, 2009, at 22:27, Prasad H. L. wrote:

Consolidating all the things, the working CMakeLists.txt is as follows -

------------------------------------
project(cmake_test)
cmake_minimum_required(VERSION 2.6)

macro(m4tocxx outfilename)
add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${outfilename}.cpp
        COMMAND m4 -P -s ${CMAKE_CURRENT_SOURCE_DIR}/${outfilename}.m4 >
${CMAKE_CURRENT_BINARY_DIR}/${outfilename}.cpp
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${outfilename}.m4
)
set_source_files_properties(${outfilename}.cpp PROPERTIES GENERATED true)
endmacro(m4tocxx)


add_executable(testcmake testcmake.cpp)

m4tocxx(testcmake)
-------------------------------------------------------------

where m4tocxx is the macro to convert from m4 to cpp.
Objective of the above CMakeLists.txt :- The source file
is testcmake.m4 which is to be preprocessed to testcmake.cpp and
linked to form the executable testcmake.

Thanks to Denis and Robert again for all their suggestions.

If anybody knows a way by which this macro could be made
to get called for all m4 files automatically in the dependence order,
please let me know. Again, as pointed out by Tyler, not by FILE(GLOB...)...


Hi

I'd modify the macro as follows:

cmake_minimum_required(VERSION 2.6)
project( test CXX )

# we need the M4 macro processor
find_program( M4_EXECUTABLE m4 DOC "The M4 macro processor" )
if( NOT M4_EXECUTABLE )
  message( SEND_ERROR "Failed to find the M4 macro processor." )
endif( NOT M4_EXECUTABLE )

# - Pass a list of files through the M4 macro processor
#
# ADD_M4_SOURCES( OUTVAR source1 ... sourceN )
#
#  OUTVAR  A list containing all the output file names, suitable
#          to be passed to add_executable or add_library.
#
# If the source files have a .m4 suffix it is stripped from the output
# file name. The output files are placed in the same relative location
# to CMAKE_CURRENT_BINARY_DIR as they are to CMAKE_CURRENT_SOURCE_DIR.
#
# Example:
#  add_m4_sources( SRCS src/test1.cxx.m4 src/test2.cxx.m4 )
#  add_executable( test ${SRCS} )
function( ADD_M4_SOURCES OUTVAR )
  set( outfiles )
  foreach( f ${ARGN} )
    # first we might need to make the input file absolute
    get_filename_component( f "${f}" ABSOLUTE )
    #if( NOT IS_ABSOLUTE "${f}" )
    #  set( f "${CMAKE_CURRENT_SOURCE_DIR}/${f}" )
    #endif( NOT IS_ABSOLUTE "${f}" )
    # get the relative path of the file to the current source dir
    file( RELATIVE_PATH rf "${CMAKE_CURRENT_SOURCE_DIR}" "${f}" )
# strip the .m4 off the end if present and prepend the current binary dir string( REGEX REPLACE "\\.m4$" "" of "$ {CMAKE_CURRENT_BINARY_DIR}/${rf}" )
    # append the output file to the list of outputs
    list( APPEND outfiles "${of}" )
    # create the output directory if it doesn't exist
    get_filename_component( d "${of}" PATH )
    if( NOT IS_DIRECTORY "${d}" )
      file( MAKE_DIRECTORY "${d}" )
    endif( NOT IS_DIRECTORY "${d}" )
    # now add the custom command to generate the output file
    add_custom_command( OUTPUT "${of}"
      COMMAND ${M4_EXECUTABLE} ARGS -P -s "${f}" > "${of}"
      DEPENDS "${f}"
      )
  endforeach( f )
  # set the output list in the calling scope
  set( ${OUTVAR} ${outfiles} PARENT_SCOPE )
endfunction( ADD_M4_SOURCES )

add_m4_sources( SRCS src/test1.cxx.m4 src/test2.cxx.m4 )
add_executable( test ${SRCS} )

# EOF

Of course, you could turn this into a proper FindM4.cmake module...

HTH

Michael




Regards,
Prasad

2009/6/5 Prasad H. L. <hlpr...@gmail.com>:
Can I define a new source type, like .m4 and add rules for it? That
would be ideal, I feel, for my case.

2009/6/5 Tyler Roscoe <ty...@cryptio.net>:
On Fri, Jun 05, 2009 at 10:10:07PM +0530, Prasad H. L. wrote:
2009/6/5 Denis Scherbakov <denis_scherba...@yahoo.com>:

Is it possible to set the preprocessing to all .m4 files
avoiding a
manual specification of list of files to processed?

If your list of files changes all the time, you can use FILE(GLOB...)
to find all *.m4 files to automate process.

I try this out.

FYI this approach is not recommended since CMake then has no way to know if you added a new file and thus cannot regenerate your build system for
you automatically.

tyler

_______________________________________________
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