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