From 155ac280ff9cd8082e0f8196b9c8cf470e89ffa7 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 21 Nov 2018 20:46:50 +0000 Subject: [PATCH] [LLVM] Allow modulemap installation Summary: Currently we can't install the modulemaps provided by LLVM, since they are not structured to support headers generated as part of the build (ex. `llvm/IR/Attributes.gen`). This patch restructures the module maps in order to support installation. Modules containing generated headers are defined in the new `module.extern.modulemap` file, and are referenced from the main `module.modulemap` using `extern module`. There are two versions of the `module.extern.modulemap` file; one used when building and another, `module.install.modulemap`, which is re-named during installation. Users can opt-into module map installation using `-DLLVM_INSTALL_MODULEMAPS=ON`. The default value is `OFF` due to llvm.org/PR31905. Reviewers: rsmith, mehdi_amini, bruno, EricWF Reviewed By: EricWF Subscribers: tschuett, chapuni, mgorny, llvm-commits Differential Revision: https://reviews.llvm.org/D53510 llvm-svn: 347420 --- CMakeLists.txt | 19 +++++++++++++++++++ include/llvm/module.extern.modulemap | 5 +++++ include/llvm/module.install.modulemap | 27 +++++++++++++++++++++++++++ include/llvm/module.modulemap | 23 ++++++++++++++++++++--- 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 include/llvm/module.extern.modulemap create mode 100644 include/llvm/module.install.modulemap diff --git a/CMakeLists.txt b/CMakeLists.txt index cd1e1966b08..e2e35dcebdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,6 +187,11 @@ option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OF 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) @@ -973,6 +978,20 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 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) diff --git a/include/llvm/module.extern.modulemap b/include/llvm/module.extern.modulemap new file mode 100644 index 00000000000..8acda137e04 --- /dev/null +++ b/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 {} diff --git a/include/llvm/module.install.modulemap b/include/llvm/module.install.modulemap new file mode 100644 index 00000000000..ac73a861232 --- /dev/null +++ b/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 * +} diff --git a/include/llvm/module.modulemap b/include/llvm/module.modulemap index c918eff2b97..3b6e2a8a0ba 100644 --- a/include/llvm/module.modulemap +++ b/include/llvm/module.modulemap @@ -36,6 +36,7 @@ module LLVM_Backend { module LLVM_Bitcode { requires cplusplus umbrella "Bitcode" module * { export * } } + module LLVM_BinaryFormat { requires cplusplus umbrella "BinaryFormat" module * { export * } @@ -63,7 +64,12 @@ module LLVM_BinaryFormat { 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 @@ -181,7 +187,11 @@ module LLVM_intrinsic_gen { // 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 * } @@ -207,7 +217,12 @@ module LLVM_intrinsic_gen { 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 * } @@ -284,6 +299,8 @@ module LLVM_Transforms { 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 {