cmake: Improve folder structure for Xcode and Visual Studio projects

CMake has a built in file extension list for "Source Files", that does
not include qml files. We can't extend that file list with a regex,
so we need to add qml files individually as a finalization action.

We also stuff generated files (both auto-gen as well as other generated
files) into a separate source folder, to focus the project on the user's
files.

Change-Id: Ic9a4d9daad088b1874bcf81e75c776537f3ff531
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 06ea3e3994b38e5fe9ac4f33044b0efa1f1be294)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Tor Arne Vestbø 2024-01-15 12:45:26 +01:00 committed by Qt Cherry-pick Bot
parent e5d1c778ad
commit 267a34e490

View File

@ -750,6 +750,7 @@ function(qt6_finalize_target target)
endif()
_qt_internal_expose_deferred_files_to_ide(${target})
_qt_internal_finalize_source_groups(${target})
get_target_property(target_type ${target} TYPE)
get_target_property(is_android_executable "${target}" _qt_is_android_executable)
@ -774,6 +775,55 @@ function(qt6_finalize_target target)
set_target_properties(${target} PROPERTIES _qt_is_finalized TRUE)
endfunction()
function(_qt_internal_finalize_source_groups target)
if(NOT ("${CMAKE_GENERATOR}" STREQUAL "Xcode"
OR "${CMAKE_GENERATOR}" MATCHES "^Visual Studio"))
return()
endif()
get_target_property(sources ${target} SOURCES)
if(NOT sources)
return()
endif()
get_target_property(source_dir ${target} SOURCE_DIR)
get_target_property(binary_dir ${target} BINARY_DIR)
get_property(generated_source_group GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP)
if(NOT generated_source_group)
set(generated_source_group "Source Files/Generated")
endif()
foreach(source IN LISTS sources)
string(GENEX_STRIP "${source}" source)
if(IS_ABSOLUTE ${source})
set(source_file_path "${source}")
else()
# Resolve absolute path. Can't use LOCATION, as that
# will error out if the file doesn't exist :(
get_filename_component(source_file_path "${source}"
ABSOLUTE BASE_DIR "${source_dir}")
if(NOT EXISTS ${source_file_path})
# Likely generated file, will end up in build dir
get_filename_component(source_file_path "${source}"
ABSOLUTE BASE_DIR "${binary_dir}")
endif()
endif()
# Include qml files in "Source Files". Can not be done via regex,
# due to https://gitlab.kitware.com/cmake/cmake/-/issues/25597
if(${source_file_path} MATCHES "\\.qml$")
source_group("Source Files" FILES ${source_file_path})
endif()
get_source_file_property(is_generated "${source_file_path}" GENERATED)
if(${is_generated})
source_group(${generated_source_group} FILES ${source_file_path})
endif()
endforeach()
endfunction()
function(_qt_internal_darwin_permission_finalizer target)
get_target_property(plist_file "${target}" MACOSX_BUNDLE_INFO_PLIST)
if(NOT plist_file)
@ -3159,6 +3209,18 @@ macro(qt6_standard_project_setup)
endif()
endif()
# Hide generated files in dedicated folder. Unfortunately we can't use a
# top level "Generated Files" folder for this, as CMake will then put the
# folder first in the list of folders, whereas we want to keep Sources and
# Headers front and center. See also _qt_internal_finalize_source_groups
set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Source Files/Generated")
# Treat metatypes JSON files as generated. We propagate these INTERFACE_SOURCES,
# due to CMake's lack of a generic mechanism for property inheritance (see
# https://gitlab.kitware.com/cmake/cmake/-/issues/20416), but we don't want
# them to clutter up the user's project.
source_group("Source Files/Generated" REGULAR_EXPRESSION "(_metatypes\\.json)$")
# I18N support.
if(DEFINED __qt_sps_arg_I18N_LANGUAGES AND NOT DEFINED QT_I18N_LANGUAGES)
set(QT_I18N_LANGUAGES ${__qt_sps_arg_I18N_LANGUAGES})