@@ -71,44 +71,45 @@ extension ClangModule {
71
71
72
72
let files = walked. filter { $0. isFile && $0. hasSuffix ( " .h " ) }
73
73
let dirs = walked. filter { $0. isDirectory}
74
-
75
- ///There are three possible cases for which we will generate modulemaps :
76
- ///Flat includes dir with only header files, in that case we generate
77
- /// `umbrella "path/to/includes/"`
78
- ///Module name dir is the only dir in includes, in that case we generate
79
- /// `umbrella header "path/to/includes/modulename/modulename.h"` if there is a `modulename.h`
80
- ///inside that directory, otherwise we generate
81
- /// `umbrella "path/to/includes/modulename"`
82
-
83
- if dirs . isEmpty {
84
- guard !files . isEmpty else { throw ModuleMapError . UnsupportedIncludeLayoutForModule ( name) }
85
- try createModuleMap ( inDir: wd, type: . FlatHeaderLayout )
74
+
75
+ ///We generate modulemap for a C module `foo` if :
76
+ ///* `umbrella header " path/to/include/foo/foo.h " ` exis ts and `foo` is the only
77
+ /// directory under include directory
78
+ ///* `umbrella header " path/to/include/foo.h " ` exis ts and include contains no other
79
+ /// directory
80
+ ///* `umbrella " path/to/include " ` in all other cases
81
+
82
+ let umbrellaHeaderFlat = Path . join ( includeDir , " \( c99name ) .h " )
83
+ if umbrellaHeaderFlat . isFile {
84
+ guard dirs . isEmpty else { throw ModuleMapError . UnsupportedIncludeLayoutForModule ( name) }
85
+ try createModuleMap ( inDir: wd, type: . Header ( umbrellaHeaderFlat ) )
86
86
return
87
87
}
88
-
89
- guard let moduleHeaderDir = dirs. first where moduleHeaderDir. basename == c99name && files. isEmpty else {
90
- throw ModuleMapError . UnsupportedIncludeLayoutForModule ( name)
88
+ diagnoseInvalidUmbrellaHeader ( includeDir)
89
+
90
+ let umbrellaHeader = Path . join ( includeDir, c99name, " \( c99name) .h " )
91
+ if umbrellaHeader. isFile {
92
+ guard dirs. count == 1 && files. isEmpty else { throw ModuleMapError . UnsupportedIncludeLayoutForModule ( name) }
93
+ try createModuleMap ( inDir: wd, type: . Header( umbrellaHeader) )
94
+ return
91
95
}
92
-
93
- let umbrellaHeader = Path . join ( moduleHeaderDir, " \( c99name) .h " )
94
-
95
- ///warn user if in case module name and c99name are different and there a `name.h` umbrella header
96
- let invalidUmbrellaHeader = Path . join ( moduleHeaderDir, " \( name) .h " )
96
+ diagnoseInvalidUmbrellaHeader ( Path . join ( includeDir, c99name) )
97
+
98
+ try createModuleMap ( inDir: wd, type: . Directory( includeDir) )
99
+ }
100
+
101
+ ///warn user if in case module name and c99name are different and there a `name.h` umbrella header
102
+ private func diagnoseInvalidUmbrellaHeader( path: String ) {
103
+ let umbrellaHeader = Path . join ( path, " \( c99name) .h " )
104
+ let invalidUmbrellaHeader = Path . join ( path, " \( name) .h " )
97
105
if c99name != name && invalidUmbrellaHeader. isFile {
98
106
print ( " warning: \( invalidUmbrellaHeader) should be renamed to \( umbrellaHeader) to be used as an umbrella header " )
99
107
}
100
-
101
- if umbrellaHeader. isFile {
102
- try createModuleMap ( inDir: wd, type: . HeaderFile)
103
- } else {
104
- try createModuleMap ( inDir: wd, type: . ModuleNameDir)
105
- }
106
108
}
107
-
109
+
108
110
private enum UmbrellaType {
109
- case FlatHeaderLayout
110
- case ModuleNameDir
111
- case HeaderFile
111
+ case Header( String )
112
+ case Directory( String )
112
113
}
113
114
114
115
private func createModuleMap( inDir wd: String , type: UmbrellaType ) throws {
@@ -119,14 +120,10 @@ extension ClangModule {
119
120
120
121
var output = " module \( c99name) { \n "
121
122
switch type {
122
- case . FlatHeaderLayout:
123
- output += " umbrella \" \( path) \" \n "
124
- case . ModuleNameDir:
125
- let path = Path . join ( self . path, c99name)
123
+ case . Header( let header) :
124
+ output += " umbrella header \" \( header) \" \n "
125
+ case . Directory( let path) :
126
126
output += " umbrella \" \( path) \" \n "
127
- case . HeaderFile:
128
- let path = Path . join ( self . path, c99name, " \( c99name) .h " )
129
- output += " umbrella header \" \( path) \" \n "
130
127
}
131
128
output += " link \" \( c99name) \" \n "
132
129
output += " export * \n "
0 commit comments