Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -183,6 +183,11 @@ option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF) +# Unfortunatly Clang is too eager to search directories for module maps, which can cause the +# installed version of the maps to be found when building LLVM from source. Therefore we turn off +# the installation by default. See llvm.org/PR31905. +option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF) + option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON) if ( LLVM_USE_FOLDERS ) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -969,6 +974,20 @@ PATTERN ".svn" EXCLUDE ) + if (LLVM_INSTALL_MODULEMAPS) + install(DIRECTORY include/llvm include/llvm-c + DESTINATION include + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "module.modulemap" + ) + install(FILES include/llvm/module.install.modulemap + DESTINATION include/llvm + COMPONENT llvm-headers + RENAME "module.extern.modulemap" + ) + endif(LLVM_INSTALL_MODULEMAPS) + # Installing the headers needs to depend on generating any public # tablegen'd headers. add_custom_target(llvm-headers DEPENDS intrinsics_gen) Index: include/llvm/module.extern.modulemap =================================================================== --- /dev/null +++ include/llvm/module.extern.modulemap @@ -0,0 +1,5 @@ +module LLVM_Extern_Config_Def {} +module LLVM_Extern_IR_Attributes_Gen {} +module LLVM_Extern_IR_Intrinsics_Gen {} +module LLVM_Extern_IR_Intrinsics_Enum {} +module LLVM_Extern_Utils_DataTypes {} Index: include/llvm/module.install.modulemap =================================================================== --- /dev/null +++ include/llvm/module.install.modulemap @@ -0,0 +1,27 @@ + +module LLVM_Extern_Config_Def { + textual header "Config/AsmParsers.def" + textual header "Config/AsmPrinters.def" + textual header "Config/Disassemblers.def" + textual header "Config/Targets.def" + export * +} + +module LLVM_Extern_IR_Attributes_Gen { + textual header "IR/Attributes.gen" + textual header "IR/Attributes.inc" +} + +module LLVM_Extern_IR_Intrinsics_Gen { + textual header "IR/Intrinsics.gen" + textual header "IR/Intrinsics.inc" +} + +module LLVM_Extern_IR_Intrinsics_Enum { + textual header "IR/IntrinsicEnums.inc" +} + +module LLVM_Extern_Utils_DataTypes { + header "Support/DataTypes.h" + export * +} Index: include/llvm/module.modulemap =================================================================== --- include/llvm/module.modulemap +++ include/llvm/module.modulemap @@ -36,6 +36,7 @@ module LLVM_Bitcode { requires cplusplus umbrella "Bitcode" module * { export * } } + module LLVM_BinaryFormat { requires cplusplus umbrella "BinaryFormat" module * { export * } @@ -62,7 +63,12 @@ textual header "BinaryFormat/MsgPack.def" } -module LLVM_Config { requires cplusplus umbrella "Config" module * { export * } } +module LLVM_Config { + requires cplusplus + umbrella "Config" + extern module LLVM_Extern_Config_Def "module.extern.modulemap" + module * { export * } +} module LLVM_DebugInfo { requires cplusplus @@ -178,7 +184,11 @@ // Attributes.h module IR_Argument { header "IR/Argument.h" export * } - module IR_Attributes { header "IR/Attributes.h" export * } + module IR_Attributes { + header "IR/Attributes.h" + extern module LLVM_Extern_IR_Attributes_Gen "module.extern.modulemap" + export * + } module IR_CallSite { header "IR/CallSite.h" export * } module IR_ConstantFolder { header "IR/ConstantFolder.h" export * } module IR_GlobalVariable { header "IR/GlobalVariable.h" export * } @@ -204,7 +214,12 @@ module IR_Verifier { header "IR/Verifier.h" export * } module IR_InstIterator { header "IR/InstIterator.h" export * } module IR_InstVisitor { header "IR/InstVisitor.h" export * } - module IR_Intrinsics { header "IR/Intrinsics.h" export * } + module IR_Intrinsics { + header "IR/Intrinsics.h" + extern module LLVM_Extern_IR_Intricsics_Gen "module.extern.modulemap" + extern module LLVM_Extern_IR_Intrinsics_Enum "module.extern.modulemap" + export * + } module IR_IntrinsicInst { header "IR/IntrinsicInst.h" export * } module IR_PatternMatch { header "IR/PatternMatch.h" export * } module IR_Statepoint { header "IR/Statepoint.h" export * } @@ -281,6 +296,8 @@ module * { export * } } +extern module LLVM_Extern_Utils_DataTypes "module.extern.modulemap" + // A module covering ADT/ and Support/. These are intertwined and // codependent, and notionally form a single module. module LLVM_Utils {