diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2018-11-15 14:21:17 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2018-11-22 15:20:17 +0000 |
commit | 24fe9211617ad1f98c69c2702e2b10412c7a55d7 (patch) | |
tree | b01cdf459b4ef88e37495c8c0e40be624f7c1436 /cmake | |
parent | 13e1c93e370551a7398d8e819b8ec4710def0151 (diff) |
CMake: Add simple test for moc handling and fix the implementation
Add a simple test for moc-file handling and fix the implementation
to make the test pass.
Change-Id: I34e8d65a5e01a6f557d3a3d8cb262fd147ad78e4
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/QtBuild.cmake | 107 | ||||
-rw-r--r-- | cmake/tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | cmake/tests/moc/CMakeLists.txt | 34 | ||||
-rw-r--r-- | cmake/tests/moc/foo.cpp | 0 | ||||
-rw-r--r-- | cmake/tests/moc/sub/bar.h | 0 | ||||
-rw-r--r-- | cmake/tests/moc/sub2/foobar.h | 0 | ||||
-rw-r--r-- | cmake/tests/test.cmake | 10 |
7 files changed, 88 insertions, 64 deletions
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index c453e41334..ee910155dd 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -215,38 +215,43 @@ function(qt_internal_add_linker_version_script target) endfunction() # Generates the necessary rules to run moc on the sources specified after the MOC parameter. -# The resulting moc files are returned in the variable specified by the result parameter. -function(qt_internal_wrap_cpp result) +# The resulting moc files are added to the target. +function(qt_internal_wrap_cpp target) # get include dirs qt_get_moc_flags(moc_flags) - qt_parse_all_arguments(_arg "qt_internal_wrap_cpp" "" "TARGET;HEADER_FILE_ONLY" "OPTIONS;DEPENDS;MOC" ${ARGN}) + qt_parse_all_arguments(arg "qt_internal_wrap_cpp" "" "HEADER_FILE_ONLY" "OPTIONS;DEPENDS;MOC" ${ARGN}) - set(moc_files ${_arg_MOC}) - set(moc_options ${_arg_OPTIONS}) - set(moc_target ${_arg_TARGET}) - set(moc_depends ${_arg_DEPENDS}) - set(wrapped_files "") + set(outfiles) - foreach(it ${moc_files}) - get_filename_component(it ${it} ABSOLUTE) + get_target_property(binary_dir "${target}" BINARY_DIR) + get_target_property(source_dir "${target}" SOURCE_DIR) + + foreach(it ${arg_MOC}) get_filename_component(moc_file_extension ${it} EXT) - if(${moc_file_extension} STREQUAL ".h") + if("x${moc_file_extension}" STREQUAL "x.h") set(file_prefix "moc_") - set(file_extension "cpp") + set(file_extension ".cpp") else() set(file_prefix "") - set(file_extension "moc") + set(file_extension ".moc") + endif() + + qt_make_output_file("${it}" "${file_prefix}" "${file_extension}" "${source_dir}" "${binary_dir}" outfile) + + qt_create_moc_command("${target}" "${source_dir}" "${it}" "${outfile}" "${moc_flags}" "${arg_OPTIONS}" "${arg_DEPENDS}") + set_source_files_properties("${outfile}" PROPERTIES HEADER_FILE_ONLY ${arg_HEADER_FILE_ONLY}) + if (arg_HEADER_FILE_ONLY) + get_filename_component(directory "${outfile}" DIRECTORY) + target_include_directories("${target}" PRIVATE "${directory}") endif() - qt_make_output_file("${it}" "${file_prefix}" ".${file_extension}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" outfile) - qt_create_moc_command("${it}" "${outfile}" "${moc_flags}" "${moc_options}" "${moc_target}" "${moc_depends}") - set_source_files_properties(${outfile} PROPERTIES HEADER_FILE_ONLY ${_arg_HEADER_FILE_ONLY}) - list(APPEND wrapped_files "${outfile}") + list(APPEND outfiles "${outfile}") endforeach() - set("${result}" ${wrapped_files} PARENT_SCOPE) + target_sources("${target}" PRIVATE "${outfiles}") endfunction() + function(_qt_module_name name result) set("${result}" "Qt${name}" PARENT_SCOPE) endfunction() @@ -284,15 +289,8 @@ function(qt_internal_automoc target) file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_included.txt") file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_to_build.txt") - qt_internal_wrap_cpp(included_mocs TARGET "${target}" MOC ${moc_files_included} HEADER_FILE_ONLY ON) - qt_internal_wrap_cpp(moc_and_build_sources TARGET "${target}" MOC ${moc_files_to_build} HEADER_FILE_ONLY OFF) - - target_sources("${target}" PRIVATE ${moc_and_build_sources} ${included_mocs}) - - foreach(generated_source ${included_mocs}) - get_filename_component(directory "${generated_source}" DIRECTORY) - target_include_directories("${target}" PRIVATE "${directory}") - endforeach() + qt_internal_wrap_cpp("${target}" MOC ${moc_files_included} HEADER_FILE_ONLY ON) + qt_internal_wrap_cpp("${target}" MOC ${moc_files_to_build} HEADER_FILE_ONLY OFF) endfunction() @@ -980,7 +978,8 @@ function(qt_make_output_file infile prefix suffix source_dir binary_dir result) get_filename_component(outpath "${abs_mapped_infile}" PATH) file(MAKE_DIRECTORY "${outpath}") - set("${result}" "${outpath}/${prefix}${outfilename}${suffix}" PARENT_SCOPE) + set(_result "${outpath}/${prefix}${outfilename}${suffix}") + set("${result}" "${_result}" PARENT_SCOPE) endfunction() @@ -1016,46 +1015,32 @@ endmacro() # helper to set up a moc rule -function(qt_create_moc_command infile outfile moc_flags moc_options moc_target moc_depends) +function(qt_create_moc_command target source_dir infile outfile moc_flags moc_options moc_depends) # Pass the parameters in a file. Set the working directory to # be that containing the parameters file and reference it by # just the file name. This is necessary because the moc tool on # MinGW builds does not seem to handle spaces in the path to the # file given with the @ syntax. - get_filename_component(_moc_outfile_name "${outfile}" NAME) - get_filename_component(_moc_outfile_dir "${outfile}" PATH) - if(_moc_outfile_dir) - set(_moc_working_dir WORKING_DIRECTORY "${_moc_outfile_dir}") - endif() - set (_moc_parameters_file "${outfile}_parameters") - set (_moc_parameters ${moc_flags} ${moc_options} -o "${outfile}" "${infile}") - string (REPLACE ";" "\n" _moc_parameters "${_moc_parameters}") - - if(moc_target) - set(_moc_parameters_file "${_moc_parameters_file}$<$<BOOL:$<CONFIGURATION>>:_$<CONFIGURATION>>") - set(targetincludes "$<TARGET_PROPERTY:${moc_target},INCLUDE_DIRECTORIES>") - set(targetdefines "$<TARGET_PROPERTY:${moc_target},COMPILE_DEFINITIONS>") - - set(targetincludes "$<$<BOOL:${targetincludes}>:-I$<JOIN:${targetincludes},\n-I>\n>") - set(targetdefines "$<$<BOOL:${targetdefines}>:-D$<JOIN:${targetdefines},\n-D>\n>") - - file (GENERATE - OUTPUT "${_moc_parameters_file}" - CONTENT "${targetdefines}${targetincludes}${_moc_parameters}\n" - ) - - set(targetincludes) - set(targetdefines) - else() - file(WRITE ${_moc_parameters_file} "${_moc_parameters}\n") - endif() + set (moc_parameters_file "${outfile}_parameters") + set (moc_parameters ${moc_flags} ${moc_options} -o "${outfile}" "${infile}") + string (REPLACE ";" "\n" moc_parameters "${moc_parameters}") + + set(moc_parameters_file "${moc_parameters_file}$<$<BOOL:$<CONFIGURATION>>:_$<CONFIGURATION>>") + set(targetincludes "$<TARGET_PROPERTY:${target},INCLUDE_DIRECTORIES>") + set(targetdefines "$<TARGET_PROPERTY:${target},COMPILE_DEFINITIONS>") + set(targetincludes "$<$<BOOL:${targetincludes}>:-I$<JOIN:${targetincludes},\n-I>\n>") + set(targetdefines "$<$<BOOL:${targetdefines}>:-D$<JOIN:${targetdefines},\n-D>\n>") + + file (GENERATE + OUTPUT "${moc_parameters_file}" + CONTENT "${targetdefines}${targetincludes}${moc_parameters}\n" + ) - set(_moc_extra_parameters_file @${_moc_parameters_file}) + set(moc_extra_parameters_file @${moc_parameters_file}) add_custom_command(OUTPUT "${outfile}" - COMMAND "Qt::moc" "${_moc_extra_parameters_file}" + COMMAND "Qt::moc" "${moc_extra_parameters_file}" DEPENDS "${infile}" ${moc_depends} - ${_moc_working_dir} - VERBATIM) + WORKING_DIRECTORY "${source_dir}" VERBATIM) endfunction() @@ -1097,7 +1082,7 @@ function(qt_create_qdbusxml2cpp_command target infile) VERBATIM) # Moc the header: - qt_internal_wrap_cpp(moc_sources TARGET "${target}" MOC "${header_file}" HEADER_FILE_ONLY OFF) + qt_internal_wrap_cpp("${target}" MOC "${header_file}" HEADER_FILE_ONLY OFF) target_sources("${target}" PRIVATE "${header_file}" "${source_file}" "${moc_sources}") endfunction() diff --git a/cmake/tests/CMakeLists.txt b/cmake/tests/CMakeLists.txt index 3f51c24025..44aacb7b07 100644 --- a/cmake/tests/CMakeLists.txt +++ b/cmake/tests/CMakeLists.txt @@ -45,6 +45,7 @@ macro(add_cmake_test_generate name) endmacro() add_cmake_test_generate(features) +add_cmake_test_generate(moc) add_cmake_test_generate(qrc) add_cmake_test_generate(qt_make_output_file) add_cmake_test_generate(uic) diff --git a/cmake/tests/moc/CMakeLists.txt b/cmake/tests/moc/CMakeLists.txt new file mode 100644 index 0000000000..297b1ac17d --- /dev/null +++ b/cmake/tests/moc/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.12.0) + +project(MocTest + VERSION 1.0.0 + DESCRIPTION "Moc test" + HOMEPAGE_URL "https://qt.io/" + LANGUAGES CXX +) + +## Add some paths to check for cmake modules: +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../;${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/extra-cmake-modules/find-modules;${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/kwin") + +## Qt specific setup common for all modules: +include(QtSetup) + +include(../test.cmake) + +fake_moc_results(MOC foo.cpp sub2/foobar.h MOC_AND_BUILD main.cpp sub/bar.h) +add_qt_executable(test_executable + SOURCES + ../main.cpp + sub/bar.h + sub2/foobar.h + foo.cpp +) + +test_source_file(test_executable "${CMAKE_CURRENT_BINARY_DIR}/main.moc" BUILD) +test_source_file(test_executable "${CMAKE_CURRENT_BINARY_DIR}/sub/moc_bar.cpp" BUILD) +test_source_file(test_executable "${CMAKE_CURRENT_BINARY_DIR}/sub2/moc_foobar.cpp") +test_source_file(test_executable "${CMAKE_CURRENT_BINARY_DIR}/foo.moc") + +test_include_directory(test_executable "${CMAKE_CURRENT_BINARY_DIR}/sub" UNKNOWN) +test_include_directory(test_executable "${CMAKE_CURRENT_BINARY_DIR}/sub2") + diff --git a/cmake/tests/moc/foo.cpp b/cmake/tests/moc/foo.cpp new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/cmake/tests/moc/foo.cpp diff --git a/cmake/tests/moc/sub/bar.h b/cmake/tests/moc/sub/bar.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/cmake/tests/moc/sub/bar.h diff --git a/cmake/tests/moc/sub2/foobar.h b/cmake/tests/moc/sub2/foobar.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/cmake/tests/moc/sub2/foobar.h diff --git a/cmake/tests/test.cmake b/cmake/tests/test.cmake index 8c11b3a42e..099f490c94 100644 --- a/cmake/tests/test.cmake +++ b/cmake/tests/test.cmake @@ -7,9 +7,13 @@ set(QT_MOCSCANNER /usr/bin/true) # The files passed in after MOC_AND_BUILD will be reported to be in need # of moc-ing and should also be built by the target. function(fake_moc_results) - cmake_parse_arguments(arg "" "" "INCLUDED;BUILT") - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_included.txt" "${arg_INCLUDED}") - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_to_build.txt" "${arg_BUILT}") + cmake_parse_arguments(arg "" "" "MOC;MOC_AND_BUILD" ${ARGN}) + + string(REPLACE ";" "\n" arg_MOC "${arg_MOC}") + string(REPLACE ";" "\n" arg_MOC_AND_BUILD "${arg_MOC_AND_BUILD}") + + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_included.txt" "${arg_MOC}") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/moc_files_to_build.txt" "${arg_MOC_AND_BUILD}") endfunction() # Test whether a target has a file listed in its sources. |