Index: KDE4Macros.cmake =================================================================== --- KDE4Macros.cmake (revision 680441) +++ KDE4Macros.cmake (working copy) @@ -145,77 +145,122 @@ endforeach (_current_FILE) endmacro (KDE4_ADD_UI3_FILES) +# keep it here until it is removed everywhere +macro(KDE4_AUTOMOC) +endmacro(KDE4_AUTOMOC) -macro (KDE4_AUTOMOC) - qt4_get_moc_inc_dirs(_moc_INCS) - # iterate over all files +macro(KDE4_HANDLE_AUTOMOC _target_NAME ) + + set(_automoc_file_CONTENTS +"# this file is autogenerated, do not edit +set(MOC_FILES +") foreach (_current_FILE ${ARGN}) + get_filename_component(_abs_current_FILE "${_current_FILE}" ABSOLUTE) + get_source_file_property(_skip "${_abs_current_FILE}" SKIP_AUTOMOC) + get_source_file_property(_generated "${_abs_current_FILE}" GENERATED) - get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) - # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. - # here. this is required to make bouic work correctly: - # we need to add generated .cpp files to the sources (to compile them), - # but we cannot let automoc handle them, as the .cpp files don't exist yet when - # cmake is run for the very first time on them -> however the .cpp files might - # exist at a later run. at that time we need to skip them, so that we don't add two - # different rules for the same moc file - get_source_file_property(_skip ${_abs_FILE} SKIP_AUTOMOC) + if(NOT _generated AND NOT _skip) + get_filename_component(_suffix "${_current_FILE}" EXT) + if( ".cpp" STREQUAL "${_suffix}" OR ".cc" STREQUAL "${_suffix}" OR ".cxx" STREQUAL "${_suffix}" OR ".C" STREQUAL "${_suffix}") + get_filename_component(_basename "${_current_FILE}" NAME) + macro_additional_clean_files("${CMAKE_CURRENT_BINARY_DIR}/${_basename}_automoc.mark") + set(_automoc_file_CONTENTS "${_automoc_file_CONTENTS} ${_abs_current_FILE}\n") + else( ".cpp" STREQUAL "${_suffix}" OR ".cc" STREQUAL "${_suffix}" OR ".cxx" STREQUAL "${_suffix}" OR ".C" STREQUAL "${_suffix}") + endif( ".cpp" STREQUAL "${_suffix}" OR ".cc" STREQUAL "${_suffix}" OR ".cxx" STREQUAL "${_suffix}" OR ".C" STREQUAL "${_suffix}") + endif(NOT _generated AND NOT _skip) - # if the file exists and should not be skipped read it completely into memory - # and grep for all include lines - # for each found moc file generate a custom_target and collect - # the generated moc files in a list which will be set as a source files property - # and later be queried in kde4_add_library/executable/plugin() - if (EXISTS ${_abs_FILE} AND NOT _skip) - set(_moc_FILES_PROPERTY) + endforeach (_current_FILE) - file(READ ${_abs_FILE} _contents) - get_filename_component(_abs_PATH ${_abs_FILE} PATH) + qt4_get_moc_inc_dirs(_moc_INCS) + set(_automoc_file_CONTENTS "${_automoc_file_CONTENTS} ) +set(QT_MOC_EXECUTABLE ${QT_MOC_EXECUTABLE}) +set(QT_MOC_INCS ${_moc_INCS}) +") - string(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") - if (_match) - foreach (_current_MOC_INC ${_match}) - string(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") - get_filename_component(_basename ${_current_MOC} NAME_WE) - set(_header ${_abs_PATH}/${_basename}.h) - set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_automoc.files" "${_automoc_file_CONTENTS}") - if (NOT EXISTS ${_abs_PATH}/${_basename}.h) - message(FATAL_ERROR "In the file \"${_abs_FILE}\" the moc file \"${_current_MOC}\" is included, but \"${_abs_PATH}/${_basename}.h\" doesn't exist.") - endif (NOT EXISTS ${_abs_PATH}/${_basename}.h) + add_custom_target(${_target_NAME}_automoc + COMMAND ${CMAKE_COMMAND} + -DKDE4_AUTOMOC_FILE=${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_automoc.files + -DKDE4_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} + -P ${KDE4_MODULE_DIR}/kde4automoc.cmake + ) + add_dependencies(${_target_NAME} ${_target_NAME}_automoc) +endmacro(KDE4_HANDLE_AUTOMOC) - add_custom_command(OUTPUT ${_moc} - COMMAND ${QT_MOC_EXECUTABLE} - ARGS ${_moc_INCS} ${_header} -o ${_moc} - MAIN_DEPENDENCY ${_header} - ) - list(APPEND _moc_FILES_PROPERTY ${_moc}) +# macro (KDE4_AUTOMOC) +# qt4_get_moc_inc_dirs(_moc_INCS) +# +# # iterate over all files +# foreach (_current_FILE ${ARGN}) +# +# get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) +# # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. +# # here. this is required to make bouic work correctly: +# # we need to add generated .cpp files to the sources (to compile them), +# # but we cannot let automoc handle them, as the .cpp files don't exist yet when +# # cmake is run for the very first time on them -> however the .cpp files might +# # exist at a later run. at that time we need to skip them, so that we don't add two +# # different rules for the same moc file +# get_source_file_property(_skip ${_abs_FILE} SKIP_AUTOMOC) +# +# # if the file exists and should not be skipped read it completely into memory +# # and grep for all include lines +# # for each found moc file generate a custom_target and collect +# # the generated moc files in a list which will be set as a source files property +# # and later be queried in kde4_add_library/executable/plugin() +# if (EXISTS ${_abs_FILE} AND NOT _skip) +# set(_moc_FILES_PROPERTY) +# +# file(READ ${_abs_FILE} _contents) +# get_filename_component(_abs_PATH ${_abs_FILE} PATH) +# +# string(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") +# if (_match) +# foreach (_current_MOC_INC ${_match}) +# string(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") +# get_filename_component(_basename ${_current_MOC} NAME_WE) +# set(_header ${_abs_PATH}/${_basename}.h) +# set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) +# +# if (NOT EXISTS ${_abs_PATH}/${_basename}.h) +# message(FATAL_ERROR "In the file \"${_abs_FILE}\" the moc file \"${_current_MOC}\" is included, but \"${_abs_PATH}/${_basename}.h\" doesn't exist.") +# endif (NOT EXISTS ${_abs_PATH}/${_basename}.h) +# +# add_custom_command(OUTPUT ${_moc} +# COMMAND ${QT_MOC_EXECUTABLE} +# ARGS ${_moc_INCS} ${_header} -o ${_moc} +# MAIN_DEPENDENCY ${_header} +# ) +# +# list(APPEND _moc_FILES_PROPERTY ${_moc}) +# +# endforeach (_current_MOC_INC) +# endif (_match) +# +# set_source_files_properties(${_abs_FILE} PROPERTIES AUTOMOC_FILES "${_moc_FILES_PROPERTY}") +# endif (EXISTS ${_abs_FILE} AND NOT _skip) +# endforeach (_current_FILE) +# endmacro (KDE4_AUTOMOC) +# +# +# macro(KDE4_GET_AUTOMOC_FILES _list) +# set(${_list}) +# foreach (_current_FILE ${ARGN}) +# set(_automoc_FILES_PROPERTY) +# get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) +# get_source_file_property(_automoc_FILES_PROPERTY ${_abs_FILE} AUTOMOC_FILES) +# if (_automoc_FILES_PROPERTY) +# foreach (_current_MOC_FILE ${_automoc_FILES_PROPERTY}) +# list(APPEND ${_list} ${_current_MOC_FILE}) +# endforeach (_current_MOC_FILE) +# endif (_automoc_FILES_PROPERTY) +# endforeach (_current_FILE) +# endmacro(KDE4_GET_AUTOMOC_FILES) - endforeach (_current_MOC_INC) - endif (_match) - - set_source_files_properties(${_abs_FILE} PROPERTIES AUTOMOC_FILES "${_moc_FILES_PROPERTY}") - endif (EXISTS ${_abs_FILE} AND NOT _skip) - endforeach (_current_FILE) -endmacro (KDE4_AUTOMOC) - - -macro(KDE4_GET_AUTOMOC_FILES _list) - set(${_list}) - foreach (_current_FILE ${ARGN}) - set(_automoc_FILES_PROPERTY) - get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) - get_source_file_property(_automoc_FILES_PROPERTY ${_abs_FILE} AUTOMOC_FILES) - if (_automoc_FILES_PROPERTY) - foreach (_current_MOC_FILE ${_automoc_FILES_PROPERTY}) - list(APPEND ${_list} ${_current_MOC_FILE}) - endforeach (_current_MOC_FILE) - endif (_automoc_FILES_PROPERTY) - endforeach (_current_FILE) -endmacro(KDE4_GET_AUTOMOC_FILES) - macro(KDE4_CREATE_PO_FILES) set(_list_gmo) file(GLOB _po_files *.po) @@ -631,19 +676,18 @@ set(_first_SRC ${_with_PREFIX}) endif (${_with_PREFIX} STREQUAL "WITH_PREFIX") - kde4_get_automoc_files(_automoc_FILES ${_first_SRC} ${ARGN}) - if (KDE4_ENABLE_FINAL) kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_first_SRC} ${ARGN}) - add_library(${_target_NAME} MODULE ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + add_library(${_target_NAME} MODULE ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files}) else (KDE4_ENABLE_FINAL) - add_library(${_target_NAME} MODULE ${_first_SRC} ${ARGN} ${_automoc_FILES}) + add_library(${_target_NAME} MODULE ${_first_SRC} ${ARGN}) endif (KDE4_ENABLE_FINAL) if (_first_SRC) set_target_properties(${_target_NAME} PROPERTIES PREFIX "") endif (_first_SRC) + kde4_handle_automoc(${_target_NAME} ${_first_SRC} ${ARGN}) kde4_handle_rpath_for_library(${_target_NAME}) if (WIN32) @@ -718,16 +762,16 @@ # KDE4_ADD_EXECUTABLE(${_target_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp ${ARGN} ) # else (WIN32) # under UNIX, create a shared library and a small executable, which links to this library - kde4_get_automoc_files(_automoc_FILES ${_SRCS}) if (KDE4_ENABLE_FINAL) kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/kdeinit_${_target_NAME}_final_cpp.cpp _separate_files ${_SRCS}) - add_library(kdeinit_${_target_NAME} SHARED ${CMAKE_CURRENT_BINARY_DIR}/kdeinit_${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + add_library(kdeinit_${_target_NAME} SHARED ${CMAKE_CURRENT_BINARY_DIR}/kdeinit_${_target_NAME}_final_cpp.cpp ${_separate_files}) else (KDE4_ENABLE_FINAL) - add_library(kdeinit_${_target_NAME} SHARED ${_SRCS} ${_automoc_FILES}) + add_library(kdeinit_${_target_NAME} SHARED ${_SRCS}) endif (KDE4_ENABLE_FINAL) + kde4_handle_automoc(kdeinit_${_target_NAME} ${_SRCS}) kde4_handle_rpath_for_library(kdeinit_${_target_NAME}) set_target_properties(kdeinit_${_target_NAME} PROPERTIES OUTPUT_NAME kdeinit4_${_target_NAME}) @@ -778,15 +822,15 @@ set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} ) - kde4_get_automoc_files(_automoc_FILES ${ARGN}) + add_executable(${_target_NAME} ${_add_executable_param} ${ARGN}) - add_executable(${_target_NAME} ${_add_executable_param} ${ARGN} ${_automoc_FILES}) - set_target_properties(${_target_NAME} PROPERTIES COMPILE_FLAGS -DKDESRCDIR=\\"${CMAKE_CURRENT_SOURCE_DIR}\\" SKIP_BUILD_RPATH FALSE BUILD_WITH_INSTALL_RPATH FALSE) + kde4_handle_automoc(${_target_NAME} ${ARGN}) + if (WIN32) target_link_libraries(${_target_NAME} ${QT_QTMAIN_LIBRARY}) endif (WIN32) @@ -821,15 +865,14 @@ set(_type "RUN_UNINSTALLED") endif (_uninst) - kde4_get_automoc_files(_automoc_FILES ${_SRCS}) - if (KDE4_ENABLE_FINAL) kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_SRCS}) - add_executable(${_target_NAME} ${_add_executable_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + add_executable(${_target_NAME} ${_add_executable_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files}) else (KDE4_ENABLE_FINAL) - add_executable(${_target_NAME} ${_add_executable_param} ${_SRCS} ${_automoc_FILES}) + add_executable(${_target_NAME} ${_add_executable_param} ${_SRCS}) endif (KDE4_ENABLE_FINAL) + kde4_handle_automoc(${_target_NAME} ${_SRCS}) kde4_handle_rpath_for_executable(${_target_NAME} ${_type}) if (WIN32) @@ -858,15 +901,14 @@ set(_add_lib_param MODULE) endif (${_lib_TYPE} STREQUAL "MODULE") - kde4_get_automoc_files(_automoc_FILES ${_first_SRC} ${ARGN}) - if (KDE4_ENABLE_FINAL) kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_first_SRC} ${ARGN}) - add_library(${_target_NAME} ${_add_lib_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + add_library(${_target_NAME} ${_add_lib_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files}) else (KDE4_ENABLE_FINAL) - add_library(${_target_NAME} ${_add_lib_param} ${_first_SRC} ${ARGN} ${_automoc_FILES}) + add_library(${_target_NAME} ${_add_lib_param} ${_first_SRC} ${ARGN}) endif (KDE4_ENABLE_FINAL) + kde4_handle_automoc(${_target_NAME} ${_first_SRC} ${ARGN}) kde4_handle_rpath_for_library(${_target_NAME}) if (WIN32)