# This file contains the following macros: # macro QT3_ADD_RESOURCE(outfiles inputfile ... ) # macro QT3_AUTOMOC(inputfile ... ) # macro QT3_GENERATE_MOC(inputfile outputfile ) # # Adapted to Qt3 and CGAL from FindQt4.cmake (included in CMake 2.4) INCLUDE(AddFileDependencies) # get include dirs MACRO (QT3_GET_MOC_INC_DIRS _moc_INC_DIRS) SET(${_moc_INC_DIRS}) GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES) FOREACH(_current ${_inc_DIRS}) SET(${_moc_INC_DIRS} "${${_moc_INC_DIRS}} -I ${_current}") ENDFOREACH(_current ${_inc_DIRS}) ENDMACRO(QT3_GET_MOC_INC_DIRS) # add rule to generate ${outfile} .moc file from ${infile} (.cpp or .h) MACRO (QT3_GENERATE_MOC infile outfile) # QT3_GET_MOC_INC_DIRS(moc_includes) GET_FILENAME_COMPONENT(infile ${infile} ABSOLUTE) GET_FILENAME_COMPONENT(outfile ${outfile} ABSOLUTE) ADD_CUSTOM_COMMAND(OUTPUT ${outfile} COMMAND ${QT_MOC_EXECUTABLE} # ARGS ${moc_includes} -o ${outfile} ${infile} ARGS -o ${outfile} ${infile} DEPENDS ${infile}) # ADD_FILE_DEPENDENCIES(${infile} ${outfile}) ENDMACRO (QT3_GENERATE_MOC) # # QT3_WRAP_CPP(outfiles inputfile ... ) # MACRO (QT3_WRAP_CPP outfiles ) # # get include dirs # QT3_GET_MOC_INC_DIRS(moc_includes) # # FOREACH (it ${ARGN}) # GET_FILENAME_COMPONENT(it ${it} ABSOLUTE) # GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) # # SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/moc_${outfile}.cxx) # ADD_CUSTOM_COMMAND(OUTPUT ${outfile} # COMMAND ${QT_MOC_EXECUTABLE} # ARGS ${moc_includes} -o ${outfile} ${it} # DEPENDS ${it}) # SET(${outfiles} ${${outfiles}} ${outfile}) # ENDFOREACH(it) # ENDMACRO (QT3_WRAP_CPP) # # QT3_WRAP_UI(outfiles inputfile ... ) # MACRO (QT3_WRAP_UI outfiles ) # # FOREACH (it ${ARGN}) # GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) # GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) # SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h) # ADD_CUSTOM_COMMAND(OUTPUT ${outfile} # COMMAND ${QT_UIC_EXECUTABLE} # ARGS -o ${outfile} ${infile} # MAIN_DEPENDENCY ${infile}) # SET(${outfiles} ${${outfiles}} ${outfile}) # ENDFOREACH (it) # # ENDMACRO (QT3_WRAP_UI) # QT3_ADD_RESOURCE(outfiles inputfile ... ) MACRO (QT3_ADD_RESOURCES outfiles ) FOREACH (it ${ARGN}) GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) GET_FILENAME_COMPONENT(rc_path ${infile} PATH) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx) # parse file for dependencies FILE(READ "${infile}" _RC_FILE_CONTENTS) STRING(REGEX MATCHALL "[^<]*" _RC_FILES "${_RC_FILE_CONTENTS}") SET(_RC_DEPENDS) FOREACH(_RC_FILE ${_RC_FILES}) STRING(REGEX REPLACE "^" "" _RC_FILE "${_RC_FILE}") SET(_RC_DEPENDS ${_RC_DEPENDS} "${rc_path}/${_RC_FILE}") ENDFOREACH(_RC_FILE) ADD_CUSTOM_COMMAND(OUTPUT ${outfile} COMMAND ${QT_RCC_EXECUTABLE} ARGS -name ${outfilename} -o ${outfile} ${infile} MAIN_DEPENDENCY ${infile} DEPENDS ${_RC_DEPENDS}) SET(${outfiles} ${${outfiles}} ${outfile}) ENDFOREACH (it) ENDMACRO (QT3_ADD_RESOURCES) # QT3_AUTOMOC(file_cpp_1 ... file_cpp_N) # Call this if you want to have automatic moc file handling. # This means if you include "foo.moc" in the source file foo.cpp # a moc file for the header foo.h will be created automatically. # You can set the property SKIP_AUTOMAKE using SET_SOURCE_FILES_PROPERTIES() # to exclude some files in the list from being processed. MACRO(QT3_AUTOMOC) GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES) # For each parameter _current_FILE FOREACH (_current_FILE ${ARGN}) # Get _current_FILE's full path GET_FILENAME_COMPONENT(_current_abs_FILE ${_current_FILE} ABSOLUTE) GET_FILENAME_COMPONENT(_current_abs_PATH ${_current_abs_FILE} PATH) # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. GET_SOURCE_FILE_PROPERTY(_skip ${_current_abs_FILE} SKIP_AUTOMOC) IF ( NOT _skip AND EXISTS ${_current_abs_FILE} ) # Read file FILE(READ ${_current_abs_FILE} _contents) STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") IF(_match) # For each "#include *.moc" FOREACH (_current_MOC_INCLUDE ${_match}) # Get name of .moc to create (full path) STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INCLUDE}") # SET(_moc ${_current_abs_PATH}/${_current_MOC}) SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) # Find .moc's source header (full path). The result is cached # as "${_basename}_h" variable (advanced). # TODO: search among headers included by ${_current_FILE}. # TODO: write a macro find_file_no_cache() which does the same as # find_file() without caching the result (disturbing for user). GET_FILENAME_COMPONENT(_basename ${_current_MOC} NAME_WE) # SET(_header ${_abs_PATH}/${_basename}.h) set(_header "${_basename}_h") find_file(${_header} NAMES ${_basename}.h PATHS ${_current_abs_PATH} ${CMAKE_CURRENT_SOURCE_DIR} ${_inc_DIRS} NO_DEFAULT_PATH) MARK_AS_ADVANCED(${_header}) if (NOT ${_header}) MESSAGE(STATUS "Error: ${_basename}.h not found") else (NOT ${_header}) # Add make rule to create .moc # MESSAGE(STATUS "QT3_AUTOMOC: add rule ${_moc} <- ${${_header}}") # debug include_directories (BEFORE ${CMAKE_CURRENT_BINARY_DIR}) ADD_CUSTOM_COMMAND(OUTPUT ${_moc} COMMAND ${QT_MOC_EXECUTABLE} # ARGS ${_moc_INCS} ${_header} -o ${_moc} ${${_header}} -o ${_moc} DEPENDS ${${_header}} ) ADD_FILE_DEPENDENCIES(${_current_abs_FILE} ${_moc}) endif (NOT ${_header}) ENDFOREACH (_current_MOC_INCLUDE) ENDIF(_match) ENDIF ( NOT _skip AND EXISTS ${_current_abs_FILE} ) ENDFOREACH (_current_FILE) ENDMACRO(QT3_AUTOMOC)