;*** Licensed to the Apache Software Foundation (ASF) under one or more
;*** contributor license agreements. See the NOTICE file distributed with
;*** this work for additional information regarding copyright ownership.
;*** The ASF licenses this file to You under the Apache License, Version 2.0
;*** (the "License"); you may not use this file except in compliance with
;*** the License. You may obtain a copy of the License at
;***
;*** http://www.apache.org/licenses/LICENSE-2.0
;***
;*** Unless required by applicable law or agreed to in writing, software
;*** distributed under the License is distributed on an "AS IS" BASIS,
;*** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;*** See the License for the specific language governing permissions and
;*** limitations under the License.

;*** MakeCab Directive file
.OPTION EXPLICIT ; Generate errors 
.Set CabinetNameTemplate=MetaCarta.SharePoint.MCPermissionsService.wsp     
.Set DiskDirectoryTemplate=CDROM ; All cabinets go in single directory
.Set CompressionType=MSZIP ; All files compressed in cabinet files
.Set UniqueFiles="ON"
.Set Cabinet=on
.Set DiskDirectory1=Package

manifest.xml
bin\MetaCarta.SharePoint.dll

.Set DestinationDir=ISAPI
ISAPI\MCPermissions.asmx
ISAPI\MCPermissionsdisco.aspx
ISAPI\MCPermissionswsdl.aspx

;***End