summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2018-11-15 14:21:17 +0100
committerTobias Hunger <tobias.hunger@qt.io>2018-11-22 15:20:17 +0000
commit24fe9211617ad1f98c69c2702e2b10412c7a55d7 (patch)
treeb01cdf459b4ef88e37495c8c0e40be624f7c1436 /cmake
parent13e1c93e370551a7398d8e819b8ec4710def0151 (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.cmake107
-rw-r--r--cmake/tests/CMakeLists.txt1
-rw-r--r--cmake/tests/moc/CMakeLists.txt34
-rw-r--r--cmake/tests/moc/foo.cpp0
-rw-r--r--cmake/tests/moc/sub/bar.h0
-rw-r--r--cmake/tests/moc/sub2/foobar.h0
-rw-r--r--cmake/tests/test.cmake10
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.