diff --git a/Source/cmTargetSourcesCommand.cxx b/Source/cmTargetSourcesCommand.cxx index babbaa51cf..cdb9836ba0 100644 --- a/Source/cmTargetSourcesCommand.cxx +++ b/Source/cmTargetSourcesCommand.cxx @@ -265,6 +265,18 @@ bool TargetSourcesImpl::HandleOneFileSet( return false; } + if (cmFileSetVisibilityIsForSelf(visibility) && + this->Target->GetType() == cmStateEnums::INTERFACE_LIBRARY && + !this->Target->IsImported()) { + if (type == "CXX_MODULES"_s) { + this->SetError(R"(File set TYPE "CXX_MODULES" may not have "PUBLIC" )" + R"(or "PRIVATE" visibility on INTERFACE libraries.)"); + return false; + } + } + + // FIXME(https://wg21.link/P3470): This condition can go + // away when interface-only module units are a thing. if (cmFileSetVisibilityIsForInterface(visibility) && !cmFileSetVisibilityIsForSelf(visibility) && !this->Target->IsImported()) { diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterface-result.txt b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface-result.txt similarity index 100% rename from Tests/RunCMake/CXXModules/FileSetModulesInterface-result.txt rename to Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface-result.txt diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface-stderr.txt b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface-stderr.txt new file mode 100644 index 0000000000..d14a221ecf --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface-stderr.txt @@ -0,0 +1,5 @@ +CMake Error at FileSetModulesInterfaceOnInterface.cmake:[0-9]+ \(target_sources\): + target_sources File set TYPE "CXX_MODULES" may not have "INTERFACE" + visibility +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface.cmake b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface.cmake new file mode 100644 index 0000000000..c2c4d63169 --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnInterface.cmake @@ -0,0 +1,8 @@ +add_library(module INTERFACE) +target_sources(module + INTERFACE + FILE_SET fs TYPE CXX_MODULES FILES + sources/module.cxx) +target_compile_features(module + INTERFACE + cxx_std_20) diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-result.txt b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterface-stderr.txt b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-stderr.txt similarity index 66% rename from Tests/RunCMake/CXXModules/FileSetModulesInterface-stderr.txt rename to Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-stderr.txt index 7269c65df9..7d099dedba 100644 --- a/Tests/RunCMake/CXXModules/FileSetModulesInterface-stderr.txt +++ b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at FileSetModulesInterface.cmake:[0-9]+ \(target_sources\): +CMake Error at FileSetModulesInterfaceOnStatic.cmake:[0-9]+ \(target_sources\): target_sources File set TYPE "CXX_MODULES" may not have "INTERFACE" visibility Call Stack \(most recent call first\): diff --git a/Tests/RunCMake/CXXModules/FileSetModulesInterface.cmake b/Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic.cmake similarity index 100% rename from Tests/RunCMake/CXXModules/FileSetModulesInterface.cmake rename to Tests/RunCMake/CXXModules/FileSetModulesInterfaceOnStatic.cmake diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-result.txt b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-stderr.txt b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-stderr.txt new file mode 100644 index 0000000000..f949df9982 --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at FileSetModulesPrivateOnInterface\.cmake:[0-9]+ \(target_sources\): + target_sources File set TYPE "CXX_MODULES" may not have "PUBLIC" or + "PRIVATE" visibility on INTERFACE libraries\. +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface.cmake b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface.cmake new file mode 100644 index 0000000000..9ee402400c --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnInterface.cmake @@ -0,0 +1,11 @@ +enable_language(CXX) +set(CMAKE_CXX_SCANDEP_SOURCE "") + +add_library(module INTERFACE) +target_sources(module + PRIVATE + FILE_SET fs TYPE CXX_MODULES FILES + sources/module.cxx) +target_compile_features(module + INTERFACE + cxx_std_20) diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPrivate.cmake b/Tests/RunCMake/CXXModules/FileSetModulesPrivateOnStatic.cmake similarity index 100% rename from Tests/RunCMake/CXXModules/FileSetModulesPrivate.cmake rename to Tests/RunCMake/CXXModules/FileSetModulesPrivateOnStatic.cmake diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-result.txt b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-stderr.txt b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-stderr.txt new file mode 100644 index 0000000000..7d732eb012 --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at FileSetModulesPublicOnInterface\.cmake:[0-9]+ \(target_sources\): + target_sources File set TYPE "CXX_MODULES" may not have "PUBLIC" or + "PRIVATE" visibility on INTERFACE libraries\. +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface.cmake b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface.cmake new file mode 100644 index 0000000000..0bc41236ac --- /dev/null +++ b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnInterface.cmake @@ -0,0 +1,11 @@ +enable_language(CXX) +set(CMAKE_CXX_SCANDEP_SOURCE "") + +add_library(module INTERFACE) +target_sources(module + PUBLIC + FILE_SET fs TYPE CXX_MODULES FILES + sources/module.cxx) +target_compile_features(module + INTERFACE + cxx_std_20) diff --git a/Tests/RunCMake/CXXModules/FileSetModulesPublic.cmake b/Tests/RunCMake/CXXModules/FileSetModulesPublicOnStatic.cmake similarity index 100% rename from Tests/RunCMake/CXXModules/FileSetModulesPublic.cmake rename to Tests/RunCMake/CXXModules/FileSetModulesPublicOnStatic.cmake diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 8b7bc8628b..8780ff2206 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -71,9 +71,15 @@ set(scopes Interface Private Public) +set(target_types + Interface + Static + ) foreach (fileset_type IN LISTS fileset_types) foreach (scope IN LISTS scopes) - run_cmake("FileSet${fileset_type}${scope}") + foreach (target_type IN LISTS target_types) + run_cmake("FileSet${fileset_type}${scope}On${target_type}") + endforeach () endforeach () run_cmake("FileSet${fileset_type}InterfaceImported")