Added Struct-based project config
This commit is contained in:
parent
40b16b4a7c
commit
64500eeb24
125
Cakefile
125
Cakefile
|
@ -1,125 +0,0 @@
|
|||
# https://github.com/jcampbell05/xcake
|
||||
# http://www.rubydoc.info/github/jcampbell05/xcake/master/file/docs/Cakefile.md
|
||||
|
||||
iOSdeploymentTarget = "8.0"
|
||||
currentSwiftVersion = "3.0"
|
||||
companyIdentifier = "khatskevich.maxim"
|
||||
developmentTeamId = "UJA88X59XP"
|
||||
testSuffix = "Tst"
|
||||
|
||||
#===
|
||||
|
||||
project.name = "MKHAPIClient"
|
||||
project.class_prefix = "APC"
|
||||
project.organization = "Maxim Khatskevich"
|
||||
|
||||
#===
|
||||
|
||||
project.all_configurations.each do |configuration|
|
||||
|
||||
configuration.settings["SDKROOT"] = "iphoneos"
|
||||
configuration.settings["DEBUG_INFORMATION_FORMAT"] = "dwarf"
|
||||
configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = ""
|
||||
configuration.settings["TARGETED_DEVICE_FAMILY"] = "1,2"
|
||||
configuration.settings["IPHONEOS_DEPLOYMENT_TARGET"] = iOSdeploymentTarget
|
||||
configuration.settings["VERSIONING_SYSTEM"] = "apple-generic"
|
||||
|
||||
configuration.settings["GCC_NO_COMMON_BLOCKS"] = "YES"
|
||||
configuration.settings["GCC_WARN_ABOUT_RETURN_TYPE"] = "YES_ERROR"
|
||||
configuration.settings["GCC_WARN_UNINITIALIZED_AUTOS"] = "YES_AGGRESSIVE"
|
||||
configuration.settings["CLANG_WARN_DIRECT_OBJC_ISA_USAGE"] = "YES_ERROR"
|
||||
configuration.settings["CLANG_WARN_OBJC_ROOT_CLASS"] = "YES_ERROR"
|
||||
|
||||
configuration.settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
|
||||
|
||||
configuration.settings["CURRENT_PROJECT_VERSION"] = "1" # just default non-empty value
|
||||
|
||||
configuration.settings["CLANG_WARN_INFINITE_RECURSION"] = "YES" # Xcode 8
|
||||
configuration.settings["CLANG_WARN_SUSPICIOUS_MOVE"] = "YES" # Xcode 8
|
||||
configuration.settings["ENABLE_STRICT_OBJC_MSGSEND"] = "YES" # Xcode 8
|
||||
|
||||
#===
|
||||
|
||||
if configuration.name == "Release"
|
||||
|
||||
configuration.settings["DEBUG_INFORMATION_FORMAT"] = "dwarf-with-dsym"
|
||||
configuration.settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Owholemodule" # Xcode 8
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
#=== Targets
|
||||
|
||||
target do |target|
|
||||
|
||||
target.name = project.name
|
||||
target.type = :framework
|
||||
target.language = :swift
|
||||
target.platform = :ios
|
||||
target.deployment_target = iOSdeploymentTarget
|
||||
|
||||
target.all_configurations.each do |configuration|
|
||||
|
||||
#=== Build Settings - Core
|
||||
|
||||
configuration.product_bundle_identifier = companyIdentifier + "." + target.name
|
||||
|
||||
configuration.settings["INFOPLIST_FILE"] = "Info/" + target.name + ".plist"
|
||||
|
||||
configuration.settings["PRODUCT_NAME"] = "$(TARGET_NAME)"
|
||||
|
||||
# This will show "Automatic" in Xcode,
|
||||
# relies on proper/valid "PROVISIONING_PROFILE" value:
|
||||
|
||||
# configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = nil
|
||||
|
||||
# Xcode 8 automatic code signing support
|
||||
configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = ""
|
||||
configuration.settings["DEVELOPMENT_TEAM"] = developmentTeamId
|
||||
|
||||
#===
|
||||
|
||||
configuration.settings["SWIFT_VERSION"] = currentSwiftVersion # Xcode 8
|
||||
|
||||
end
|
||||
|
||||
#=== Source Files
|
||||
|
||||
target.include_files = ["Src/**/*.*"]
|
||||
target.include_files << "Src-Extra/**/*.*"
|
||||
|
||||
#=== Tests
|
||||
|
||||
# unit_tests_for target do |test_target|
|
||||
|
||||
# test_target.name = target.name + testSuffix
|
||||
# test_target.deployment_target = iOSdeploymentTarget
|
||||
|
||||
# test_target.all_configurations.each do |configuration|
|
||||
|
||||
# configuration.product_bundle_identifier = companyIdentifier + "." + test_target.name
|
||||
|
||||
# configuration.settings["INFOPLIST_FILE"] = "Info/" + test_target.name + ".plist"
|
||||
|
||||
# configuration.settings["LD_RUNPATH_SEARCH_PATHS"] = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"
|
||||
|
||||
# configuration.settings["SWIFT_VERSION"] = currentSwiftVersion # Xcode 8
|
||||
|
||||
# # Xcode 8 automatic code signing support
|
||||
# configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = ""
|
||||
# configuration.settings["DEVELOPMENT_TEAM"] = developmentTeamId
|
||||
|
||||
# configuration.settings["FRAMEWORK_SEARCH_PATHS"] = "$BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/**",
|
||||
# "$(inherited)"
|
||||
# end
|
||||
|
||||
# #=== Source Files
|
||||
|
||||
# testTargetSrcPath = testSuffix + "/**/*.*"
|
||||
|
||||
# test_target.include_files = [testTargetSrcPath]
|
||||
|
||||
# end
|
||||
|
||||
end
|
|
@ -0,0 +1 @@
|
|||
github "XCEssentials/ProjectGenerator" "2.1.4"
|
|
@ -0,0 +1,167 @@
|
|||
# Created by https://www.gitignore.io/api/osx
|
||||
|
||||
### OSX ###
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# ================================
|
||||
|
||||
# Created by https://www.gitignore.io/api/objective-c
|
||||
|
||||
### Objective-C ###
|
||||
# Xcode
|
||||
#
|
||||
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
||||
|
||||
## Build generated
|
||||
build/
|
||||
DerivedData
|
||||
|
||||
## Various settings
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
|
||||
## Other
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
*.xcuserstate
|
||||
*.xcscmblueprint
|
||||
|
||||
## Obj-C/Swift specific
|
||||
*.hmap
|
||||
*.ipa
|
||||
|
||||
### Objective-C Patch ###
|
||||
*.xcscmblueprint
|
||||
|
||||
# ================================
|
||||
|
||||
|
||||
# Created by https://www.gitignore.io/api/swift
|
||||
|
||||
# Swift Package Manager
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
|
||||
# Packages/
|
||||
.build/
|
||||
|
||||
# ================================
|
||||
|
||||
|
||||
# Generic iOS development
|
||||
|
||||
# CocoaPods
|
||||
#
|
||||
# We recommend against adding the Pods directory to your .gitignore. However
|
||||
# you should judge for yourself, the pros and cons are mentioned at:
|
||||
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
||||
|
||||
Pods/
|
||||
Podfile.lock
|
||||
|
||||
# Carthage
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from Carthage dependencies.
|
||||
# Carthage/Checkouts
|
||||
|
||||
Carthage/Build
|
||||
|
||||
# fastlane
|
||||
#
|
||||
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
||||
# screenshots whenever they are needed.
|
||||
# For more information about the recommended setup visit:
|
||||
# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md
|
||||
|
||||
fastlane/report.xml
|
||||
# fastlane/screenshots
|
||||
|
||||
# custom fastlane-related addition:
|
||||
#
|
||||
|
||||
Export
|
||||
|
||||
# ================================
|
||||
|
||||
|
||||
# Created by https://www.gitignore.io/api/appcode
|
||||
|
||||
### AppCode ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
|
||||
*.iml
|
||||
|
||||
## Directory-based project format:
|
||||
.idea/
|
||||
# if you remove the above rule, at least ignore the following:
|
||||
|
||||
# User-specific stuff:
|
||||
# .idea/workspace.xml
|
||||
# .idea/tasks.xml
|
||||
# .idea/dictionaries
|
||||
# .idea/shelf
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
# .idea/dataSources.ids
|
||||
# .idea/dataSources.xml
|
||||
# .idea/sqlDataSources.xml
|
||||
# .idea/dynamic.xml
|
||||
# .idea/uiDesigner.xml
|
||||
|
||||
# Gradle:
|
||||
# .idea/gradle.xml
|
||||
# .idea/libraries
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
# .idea/mongoSettings.xml
|
||||
|
||||
## File-based project format:
|
||||
*.ipr
|
||||
*.iws
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# IntelliJ
|
||||
/out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
|
@ -0,0 +1,99 @@
|
|||
import XCEProjectGenerator
|
||||
|
||||
//===
|
||||
|
||||
let params =
|
||||
(
|
||||
repoName: "MyAwesomeFramework",
|
||||
deploymentTarget: "8.0",
|
||||
companyIdentifier: "khatskevich.maxim",
|
||||
developmentTeamId: "UJA88X59XP" // 'Maxim Khatskevich'
|
||||
)
|
||||
|
||||
let bundleId =
|
||||
(
|
||||
fwk: "\(params.companyIdentifier).\(params.repoName)",
|
||||
tst: "\(params.companyIdentifier).\(params.repoName).Tst"
|
||||
)
|
||||
|
||||
//===
|
||||
|
||||
let specFormat = Spec.Format.v2_1_0
|
||||
|
||||
let project = Project(params.repoName) { project in
|
||||
|
||||
project.configurations.all.override(
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"DEVELOPMENT_TEAM" <<< params.developmentTeamId,
|
||||
|
||||
"SWIFT_VERSION" <<< "3.0",
|
||||
"VERSIONING_SYSTEM" <<< "apple-generic"
|
||||
)
|
||||
|
||||
project.configurations.debug.override(
|
||||
|
||||
"SWIFT_OPTIMIZATION_LEVEL" <<< "-Onone"
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
project.target("App", .iOS, .framework) { app in
|
||||
|
||||
app.include("Src")
|
||||
|
||||
//---
|
||||
|
||||
app.configurations.all.override(
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"PRODUCT_BUNDLE_IDENTIFIER" <<< bundleId.fwk,
|
||||
"INFOPLIST_FILE" <<< "Info/Fwk.plist",
|
||||
|
||||
//--- iOS related:
|
||||
|
||||
"SDKROOT" <<< "iphoneos",
|
||||
"TARGETED_DEVICE_FAMILY" <<< DeviceFamily.iOS.universal,
|
||||
|
||||
//--- Framework related:
|
||||
|
||||
"DEFINES_MODULE" <<< "NO",
|
||||
"SKIP_INSTALL" <<< "YES"
|
||||
)
|
||||
|
||||
app.configurations.debug.override(
|
||||
|
||||
"MTL_ENABLE_DEBUG_INFO" <<< true
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
app.unitTests { appTests in
|
||||
|
||||
appTests.include("Tst")
|
||||
|
||||
//---
|
||||
|
||||
appTests.configurations.all.override(
|
||||
|
||||
// very important for unit tests,
|
||||
// prevents the error when unit test do not start at all
|
||||
"LD_RUNPATH_SEARCH_PATHS" <<<
|
||||
"$(inherited) @executable_path/Frameworks @loader_path/Frameworks",
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"PRODUCT_BUNDLE_IDENTIFIER" <<< bundleId.tst,
|
||||
"INFOPLIST_FILE" <<< "Info/Tst.plist",
|
||||
"FRAMEWORK_SEARCH_PATHS" <<< "$(inherited) $(BUILT_PRODUCTS_DIR)"
|
||||
)
|
||||
|
||||
appTests.configurations.debug.override(
|
||||
|
||||
"MTL_ENABLE_DEBUG_INFO" <<< true
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.1.4</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>17</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2017 Maxim Khatskevich. All rights reserved.</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2017 Maxim Khatskevich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,26 @@
|
|||
//
|
||||
// main.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/15/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
import XCEProjectGenerator
|
||||
|
||||
//===
|
||||
|
||||
let specData =
|
||||
Manager.prepareSpec(specFormat, for: project)
|
||||
.data(using: .utf8)
|
||||
|
||||
let targetPath = "\(CommandLine.arguments[1])/project.yml"
|
||||
|
||||
FileManager
|
||||
.default
|
||||
.createFile(
|
||||
atPath: targetPath,
|
||||
contents: specData,
|
||||
attributes: nil)
|
687
Carthage/Checkouts/ProjectGenerator/ProjectGenerator.xcodeproj/project.pbxproj
vendored
Normal file
687
Carthage/Checkouts/ProjectGenerator/ProjectGenerator.xcodeproj/project.pbxproj
vendored
Normal file
|
@ -0,0 +1,687 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
943179991E7D82D500F3796D /* Project.Struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943179981E7D820C00F3796D /* Project.Struct.swift */; };
|
||||
943C0C291E7B14CB00C8DF86 /* MKHProjGen.h in Headers */ = {isa = PBXBuildFile; fileRef = 943C0C141E7B141400C8DF86 /* MKHProjGen.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
943C0C4C1E7B198D00C8DF86 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943C0C4A1E7B198D00C8DF86 /* main.swift */; };
|
||||
9479E3351EDD4AA5006CCC68 /* Spec.2.0.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9479E3341EDD4AA5006CCC68 /* Spec.2.0.0.swift */; };
|
||||
94848C011EF994E300EA3F4C /* Spec.2.1.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94848C001EF994E300EA3F4C /* Spec.2.1.0.swift */; };
|
||||
949521F41E7B2A2C00812390 /* XCEProjectGenerator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 943C0C021E7B134500C8DF86 /* XCEProjectGenerator.framework */; };
|
||||
9495220B1E7BF62A00812390 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943C0C4A1E7B198D00C8DF86 /* main.swift */; };
|
||||
9495220D1E7BF62A00812390 /* XCEProjectGenerator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 943C0C021E7B134500C8DF86 /* XCEProjectGenerator.framework */; };
|
||||
949522131E7BF66C00812390 /* Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943C0C481E7B198D00C8DF86 /* Spec.swift */; };
|
||||
949BB45C1E87E43E008F599B /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4491E87E43E008F599B /* Device.swift */; };
|
||||
949BB45D1E87E43E008F599B /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB44A1E87E43E008F599B /* Manager.swift */; };
|
||||
949BB45E1E87E43E008F599B /* Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB44B1E87E43E008F599B /* Misc.swift */; };
|
||||
949BB45F1E87E43E008F599B /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB44C1E87E43E008F599B /* Platform.swift */; };
|
||||
949BB4601E87E43E008F599B /* Project.BuildConfig.Defaults.General.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB44E1E87E43E008F599B /* Project.BuildConfig.Defaults.General.swift */; };
|
||||
949BB4611E87E43E008F599B /* Project.BuildConfig.Defaults.iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB44F1E87E43E008F599B /* Project.BuildConfig.Defaults.iOS.swift */; };
|
||||
949BB4621E87E43E008F599B /* Project.BuildConfig.Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4501E87E43E008F599B /* Project.BuildConfig.Defaults.swift */; };
|
||||
949BB4631E87E43E008F599B /* Project.BuildConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4511E87E43E008F599B /* Project.BuildConfig.swift */; };
|
||||
949BB4641E87E43E008F599B /* Project.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4521E87E43E008F599B /* Project.swift */; };
|
||||
949BB4651E87E43E008F599B /* Spec.1.2.1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4541E87E43E008F599B /* Spec.1.2.1.swift */; };
|
||||
949BB4661E87E43E008F599B /* Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4551E87E43E008F599B /* Spec.swift */; };
|
||||
949BB4671E87E43E008F599B /* Target.BuildConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4571E87E43E008F599B /* Target.BuildConfig.swift */; };
|
||||
949BB4681E87E43E008F599B /* Target.Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4581E87E43E008F599B /* Target.Dependencies.swift */; };
|
||||
949BB4691E87E43E008F599B /* Target.Script.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB4591E87E43E008F599B /* Target.Script.swift */; };
|
||||
949BB46A1E87E43E008F599B /* Target.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB45A1E87E43E008F599B /* Target.swift */; };
|
||||
949BB46B1E87E43E008F599B /* Target.Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB45B1E87E43E008F599B /* Target.Type.swift */; };
|
||||
949BB46D1E87E96A008F599B /* Spec.1.3.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949BB46C1E87E96A008F599B /* Spec.1.3.0.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
949521F21E7B2A2600812390 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 943C0BF91E7B134500C8DF86 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 943C0C011E7B134500C8DF86;
|
||||
remoteInfo = MKHProjGen;
|
||||
};
|
||||
949522091E7BF62A00812390 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 943C0BF91E7B134500C8DF86 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 943C0C011E7B134500C8DF86;
|
||||
remoteInfo = MKHProjGen;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
943C0C3E1E7B196200C8DF86 /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
9495220E1E7BF62A00812390 /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
943179981E7D820C00F3796D /* Project.Struct.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Project.Struct.swift; path = ../../../../Project.Struct.swift; sourceTree = "<group>"; };
|
||||
943C0C021E7B134500C8DF86 /* XCEProjectGenerator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XCEProjectGenerator.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
943C0C141E7B141400C8DF86 /* MKHProjGen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MKHProjGen.h; sourceTree = "<group>"; };
|
||||
943C0C401E7B196200C8DF86 /* Launcher */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Launcher; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
943C0C481E7B198D00C8DF86 /* Spec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.swift; sourceTree = "<group>"; };
|
||||
943C0C4A1E7B198D00C8DF86 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
|
||||
9479E3341EDD4AA5006CCC68 /* Spec.2.0.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.2.0.0.swift; sourceTree = "<group>"; };
|
||||
94848C001EF994E300EA3F4C /* Spec.2.1.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.2.1.0.swift; sourceTree = "<group>"; };
|
||||
949522121E7BF62A00812390 /* Example */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Example; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
949BB4491E87E43E008F599B /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = "<group>"; };
|
||||
949BB44A1E87E43E008F599B /* Manager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Manager.swift; sourceTree = "<group>"; };
|
||||
949BB44B1E87E43E008F599B /* Misc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Misc.swift; sourceTree = "<group>"; };
|
||||
949BB44C1E87E43E008F599B /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = "<group>"; };
|
||||
949BB44E1E87E43E008F599B /* Project.BuildConfig.Defaults.General.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project.BuildConfig.Defaults.General.swift; sourceTree = "<group>"; };
|
||||
949BB44F1E87E43E008F599B /* Project.BuildConfig.Defaults.iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project.BuildConfig.Defaults.iOS.swift; sourceTree = "<group>"; };
|
||||
949BB4501E87E43E008F599B /* Project.BuildConfig.Defaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project.BuildConfig.Defaults.swift; sourceTree = "<group>"; };
|
||||
949BB4511E87E43E008F599B /* Project.BuildConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project.BuildConfig.swift; sourceTree = "<group>"; };
|
||||
949BB4521E87E43E008F599B /* Project.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project.swift; sourceTree = "<group>"; };
|
||||
949BB4541E87E43E008F599B /* Spec.1.2.1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.1.2.1.swift; sourceTree = "<group>"; };
|
||||
949BB4551E87E43E008F599B /* Spec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.swift; sourceTree = "<group>"; };
|
||||
949BB4571E87E43E008F599B /* Target.BuildConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Target.BuildConfig.swift; sourceTree = "<group>"; };
|
||||
949BB4581E87E43E008F599B /* Target.Dependencies.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Target.Dependencies.swift; sourceTree = "<group>"; };
|
||||
949BB4591E87E43E008F599B /* Target.Script.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Target.Script.swift; sourceTree = "<group>"; };
|
||||
949BB45A1E87E43E008F599B /* Target.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Target.swift; sourceTree = "<group>"; };
|
||||
949BB45B1E87E43E008F599B /* Target.Type.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Target.Type.swift; sourceTree = "<group>"; };
|
||||
949BB46C1E87E96A008F599B /* Spec.1.3.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spec.1.3.0.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
943C0BFE1E7B134500C8DF86 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
943C0C3D1E7B196200C8DF86 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
949521F41E7B2A2C00812390 /* XCEProjectGenerator.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9495220C1E7BF62A00812390 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9495220D1E7BF62A00812390 /* XCEProjectGenerator.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
943C0BF81E7B134500C8DF86 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
943C0C471E7B198D00C8DF86 /* Example */,
|
||||
943C0C491E7B198D00C8DF86 /* Launcher */,
|
||||
949BB4481E87E43E008F599B /* Src */,
|
||||
943C0C131E7B141400C8DF86 /* Src-Extra */,
|
||||
943C0C031E7B134500C8DF86 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
943C0C031E7B134500C8DF86 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
943C0C021E7B134500C8DF86 /* XCEProjectGenerator.framework */,
|
||||
943C0C401E7B196200C8DF86 /* Launcher */,
|
||||
949522121E7BF62A00812390 /* Example */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
943C0C131E7B141400C8DF86 /* Src-Extra */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
943C0C141E7B141400C8DF86 /* MKHProjGen.h */,
|
||||
);
|
||||
path = "Src-Extra";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
943C0C471E7B198D00C8DF86 /* Example */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
943C0C481E7B198D00C8DF86 /* Spec.swift */,
|
||||
);
|
||||
path = Example;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
943C0C491E7B198D00C8DF86 /* Launcher */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
943C0C4A1E7B198D00C8DF86 /* main.swift */,
|
||||
943179981E7D820C00F3796D /* Project.Struct.swift */,
|
||||
);
|
||||
path = Launcher;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
949BB4481E87E43E008F599B /* Src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
949BB4491E87E43E008F599B /* Device.swift */,
|
||||
949BB44A1E87E43E008F599B /* Manager.swift */,
|
||||
949BB44B1E87E43E008F599B /* Misc.swift */,
|
||||
949BB44C1E87E43E008F599B /* Platform.swift */,
|
||||
949BB44D1E87E43E008F599B /* Project */,
|
||||
949BB4531E87E43E008F599B /* Spec */,
|
||||
949BB4561E87E43E008F599B /* Target */,
|
||||
);
|
||||
path = Src;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
949BB44D1E87E43E008F599B /* Project */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
949BB44E1E87E43E008F599B /* Project.BuildConfig.Defaults.General.swift */,
|
||||
949BB44F1E87E43E008F599B /* Project.BuildConfig.Defaults.iOS.swift */,
|
||||
949BB4501E87E43E008F599B /* Project.BuildConfig.Defaults.swift */,
|
||||
949BB4511E87E43E008F599B /* Project.BuildConfig.swift */,
|
||||
949BB4521E87E43E008F599B /* Project.swift */,
|
||||
);
|
||||
path = Project;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
949BB4531E87E43E008F599B /* Spec */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
949BB4551E87E43E008F599B /* Spec.swift */,
|
||||
949BB4541E87E43E008F599B /* Spec.1.2.1.swift */,
|
||||
949BB46C1E87E96A008F599B /* Spec.1.3.0.swift */,
|
||||
9479E3341EDD4AA5006CCC68 /* Spec.2.0.0.swift */,
|
||||
94848C001EF994E300EA3F4C /* Spec.2.1.0.swift */,
|
||||
);
|
||||
path = Spec;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
949BB4561E87E43E008F599B /* Target */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
949BB4571E87E43E008F599B /* Target.BuildConfig.swift */,
|
||||
949BB4581E87E43E008F599B /* Target.Dependencies.swift */,
|
||||
949BB4591E87E43E008F599B /* Target.Script.swift */,
|
||||
949BB45A1E87E43E008F599B /* Target.swift */,
|
||||
949BB45B1E87E43E008F599B /* Target.Type.swift */,
|
||||
);
|
||||
path = Target;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
943C0BFF1E7B134500C8DF86 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
943C0C291E7B14CB00C8DF86 /* MKHProjGen.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
943C0C011E7B134500C8DF86 /* ProjectGenerator */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 943C0C0A1E7B134500C8DF86 /* Build configuration list for PBXNativeTarget "ProjectGenerator" */;
|
||||
buildPhases = (
|
||||
943C0BFD1E7B134500C8DF86 /* Sources */,
|
||||
943C0BFE1E7B134500C8DF86 /* Frameworks */,
|
||||
943C0BFF1E7B134500C8DF86 /* Headers */,
|
||||
943C0C001E7B134500C8DF86 /* Resources */,
|
||||
943C0C791E7B258700C8DF86 /* BuildStatic */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = ProjectGenerator;
|
||||
productName = MKHProjGen;
|
||||
productReference = 943C0C021E7B134500C8DF86 /* XCEProjectGenerator.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
943C0C3F1E7B196200C8DF86 /* Launcher */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 943C0C441E7B196200C8DF86 /* Build configuration list for PBXNativeTarget "Launcher" */;
|
||||
buildPhases = (
|
||||
943C0C3C1E7B196200C8DF86 /* Sources */,
|
||||
943C0C3D1E7B196200C8DF86 /* Frameworks */,
|
||||
943C0C3E1E7B196200C8DF86 /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
949521F31E7B2A2600812390 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Launcher;
|
||||
productName = MKHProjGenLauncher;
|
||||
productReference = 943C0C401E7B196200C8DF86 /* Launcher */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
949522071E7BF62A00812390 /* Example */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 9495220F1E7BF62A00812390 /* Build configuration list for PBXNativeTarget "Example" */;
|
||||
buildPhases = (
|
||||
9495220A1E7BF62A00812390 /* Sources */,
|
||||
9495220C1E7BF62A00812390 /* Frameworks */,
|
||||
9495220E1E7BF62A00812390 /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
949522081E7BF62A00812390 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Example;
|
||||
productName = MKHProjGenLauncher;
|
||||
productReference = 949522121E7BF62A00812390 /* Example */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
943C0BF91E7B134500C8DF86 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0820;
|
||||
LastUpgradeCheck = 0820;
|
||||
ORGANIZATIONNAME = "Maxim Khatskevich";
|
||||
TargetAttributes = {
|
||||
943C0C011E7B134500C8DF86 = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
DevelopmentTeam = UJA88X59XP;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
943C0C3F1E7B196200C8DF86 = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
DevelopmentTeam = UJA88X59XP;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
949522071E7BF62A00812390 = {
|
||||
DevelopmentTeam = UJA88X59XP;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 943C0BFC1E7B134500C8DF86 /* Build configuration list for PBXProject "ProjectGenerator" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 943C0BF81E7B134500C8DF86;
|
||||
productRefGroup = 943C0C031E7B134500C8DF86 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
943C0C011E7B134500C8DF86 /* ProjectGenerator */,
|
||||
943C0C3F1E7B196200C8DF86 /* Launcher */,
|
||||
949522071E7BF62A00812390 /* Example */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
943C0C001E7B134500C8DF86 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
943C0C791E7B258700C8DF86 /* BuildStatic */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"$(LD_DEPENDENCY_INFO_FILE)",
|
||||
);
|
||||
name = BuildStatic;
|
||||
outputPaths = (
|
||||
"$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "#!/bin/sh\n\ncd \"$BUILT_PRODUCTS_DIR\"\n\narchs=( $ARCHS ) lfls=()\nfor v in \"${archs[@]/#/LINK_FILE_LIST_${CURRENT_VARIANT}_}\"; do\nlfls+=( -filelist \"${!v}\" )\ndone\n\nlibtool -static -syslibroot \"$SDKROOT\" -L. \"${lfls[@]}\" -o \"$EXECUTABLE_PATH\"";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
943C0BFD1E7B134500C8DF86 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
949BB45D1E87E43E008F599B /* Manager.swift in Sources */,
|
||||
949BB46D1E87E96A008F599B /* Spec.1.3.0.swift in Sources */,
|
||||
9479E3351EDD4AA5006CCC68 /* Spec.2.0.0.swift in Sources */,
|
||||
949BB45F1E87E43E008F599B /* Platform.swift in Sources */,
|
||||
94848C011EF994E300EA3F4C /* Spec.2.1.0.swift in Sources */,
|
||||
949BB45C1E87E43E008F599B /* Device.swift in Sources */,
|
||||
949BB45E1E87E43E008F599B /* Misc.swift in Sources */,
|
||||
949BB46A1E87E43E008F599B /* Target.swift in Sources */,
|
||||
949BB4671E87E43E008F599B /* Target.BuildConfig.swift in Sources */,
|
||||
949BB4681E87E43E008F599B /* Target.Dependencies.swift in Sources */,
|
||||
949BB4691E87E43E008F599B /* Target.Script.swift in Sources */,
|
||||
949BB46B1E87E43E008F599B /* Target.Type.swift in Sources */,
|
||||
949BB4641E87E43E008F599B /* Project.swift in Sources */,
|
||||
949BB4631E87E43E008F599B /* Project.BuildConfig.swift in Sources */,
|
||||
949BB4621E87E43E008F599B /* Project.BuildConfig.Defaults.swift in Sources */,
|
||||
949BB4611E87E43E008F599B /* Project.BuildConfig.Defaults.iOS.swift in Sources */,
|
||||
949BB4601E87E43E008F599B /* Project.BuildConfig.Defaults.General.swift in Sources */,
|
||||
949BB4661E87E43E008F599B /* Spec.swift in Sources */,
|
||||
949BB4651E87E43E008F599B /* Spec.1.2.1.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
943C0C3C1E7B196200C8DF86 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
943C0C4C1E7B198D00C8DF86 /* main.swift in Sources */,
|
||||
943179991E7D82D500F3796D /* Project.Struct.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9495220A1E7BF62A00812390 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
949522131E7BF66C00812390 /* Spec.swift in Sources */,
|
||||
9495220B1E7BF62A00812390 /* main.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
949521F31E7B2A2600812390 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 943C0C011E7B134500C8DF86 /* ProjectGenerator */;
|
||||
targetProxy = 949521F21E7B2A2600812390 /* PBXContainerItemProxy */;
|
||||
};
|
||||
949522081E7BF62A00812390 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 943C0C011E7B134500C8DF86 /* ProjectGenerator */;
|
||||
targetProxy = 949522091E7BF62A00812390 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
943C0C081E7B134500C8DF86 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 17;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
943C0C091E7B134500C8DF86 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 17;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
943C0C0B1E7B134500C8DF86 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 17;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = Info/Fwk.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.XCEssentials.ProjectGenerator;
|
||||
PRODUCT_NAME = XCEProjectGenerator;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
943C0C0C1E7B134500C8DF86 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 17;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = Info/Fwk.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.XCEssentials.ProjectGenerator;
|
||||
PRODUCT_NAME = XCEProjectGenerator;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
943C0C451E7B196200C8DF86 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(SRCROOT)",
|
||||
);
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-all_load",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
943C0C461E7B196200C8DF86 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(SRCROOT)",
|
||||
);
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-all_load",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
949522101E7BF62A00812390 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(SRCROOT)",
|
||||
);
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-all_load",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
949522111E7BF62A00812390 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
DEVELOPMENT_TEAM = UJA88X59XP;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(SRCROOT)",
|
||||
);
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-all_load",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
943C0BFC1E7B134500C8DF86 /* Build configuration list for PBXProject "ProjectGenerator" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
943C0C081E7B134500C8DF86 /* Debug */,
|
||||
943C0C091E7B134500C8DF86 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
943C0C0A1E7B134500C8DF86 /* Build configuration list for PBXNativeTarget "ProjectGenerator" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
943C0C0B1E7B134500C8DF86 /* Debug */,
|
||||
943C0C0C1E7B134500C8DF86 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
943C0C441E7B196200C8DF86 /* Build configuration list for PBXNativeTarget "Launcher" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
943C0C451E7B196200C8DF86 /* Debug */,
|
||||
943C0C461E7B196200C8DF86 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
9495220F1E7BF62A00812390 /* Build configuration list for PBXNativeTarget "Example" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
949522101E7BF62A00812390 /* Debug */,
|
||||
949522111E7BF62A00812390 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 943C0BF91E7B134500C8DF86 /* Project object */;
|
||||
}
|
7
Carthage/Checkouts/ProjectGenerator/ProjectGenerator.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
vendored
Normal file
7
Carthage/Checkouts/ProjectGenerator/ProjectGenerator.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:/Users/maxim/Dev/XCEssentials/ProjectGenerator/ProjectGenerator.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -0,0 +1,99 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0820"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "943C0C3F1E7B196200C8DF86"
|
||||
BuildableName = "Launcher"
|
||||
BlueprintName = "Launcher"
|
||||
ReferencedContainer = "container:ProjectGenerator.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "943C0C3F1E7B196200C8DF86"
|
||||
BuildableName = "Launcher"
|
||||
BlueprintName = "Launcher"
|
||||
ReferencedContainer = "container:ProjectGenerator.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "943C0C3F1E7B196200C8DF86"
|
||||
BuildableName = "Launcher"
|
||||
BlueprintName = "Launcher"
|
||||
ReferencedContainer = "container:ProjectGenerator.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
<CommandLineArgument
|
||||
argument = ""$(SRCROOT)/../../..""
|
||||
isEnabled = "YES">
|
||||
</CommandLineArgument>
|
||||
</CommandLineArguments>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "943C0C3F1E7B196200C8DF86"
|
||||
BuildableName = "Launcher"
|
||||
BlueprintName = "Launcher"
|
||||
ReferencedContainer = "container:ProjectGenerator.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
|
@ -0,0 +1,92 @@
|
|||
[](https://github.com/XCEssentials/FunctionalState/releases)
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://github.com/Carthage/Carthage)
|
||||
|
||||
# Introduction
|
||||
|
||||
Describe Xcode project declaratively in pure Swift.
|
||||
|
||||
# Problem
|
||||
|
||||
Xcode uses an undocumented proprietary format for describing project structure, settings, etc. in **`*.xcodeproj`** files. That kind of file is hard to read and understand for a human, impossible to merge without merge conflicts if changes were made on two different local copies of the same repo/project, or even on different branches inside the same repo on the same workstation. That makes working together on the same Xcode project file a nightmare, when you need to merge changes "*.xcodeproj" always has conflicts and developers have to resolve them manually, wasting lots of time for routine that might be done by computer. We need a better solution!
|
||||
|
||||
# Existing solution
|
||||
|
||||
There is a command line tool that allows developer to write project specification in a form of plain text configuration file (using Ruby or YAML) and then generate **`*.xcodeproj`** file on the fly from this specification - [Struct](https://github.com/workshop/struct).
|
||||
|
||||
The specification file format features very concise hierarchic notation that's easy and intuitive, and you only need to specify explicitly settings which can not be inferred somehow or you need a value that differs from defaults (provided by the tool itself or, most often, by Xcode).
|
||||
|
||||
For vast majority of iOS developers, this tool should be already a good enough solution, but there are still few inconveniences:
|
||||
|
||||
- you have to learn a new language/syntax (not every iOS developer knows Ruby and feel comfortable to deal with it on daily basis);
|
||||
- you need to leave Xcode and switch to another text editor with proper syntax highlight for Ruby/YAML to edit the specification file, because Xcode does not support YAML and have limited syntax highligh for Ruby;
|
||||
- due to nature of Ruby/YAML, you do not have development time syntax check, you have to try to run the tool in order to disciover a syntax error in your specification.
|
||||
|
||||
# Wishlist
|
||||
|
||||
Based on the downsides of Struct listed above, here is a list of wishes for an "ideal" tool like that:
|
||||
|
||||
- write project specification in pure Swift;
|
||||
- use Xcode to edit specification file;
|
||||
- get full syntax highlight and real time syntax check in specification file.
|
||||
|
||||
# About this tool
|
||||
|
||||
To archive the goals listed above, this project has been made. Think of it as a thin wrapper on top of [Struct](https://github.com/workshop/struct) CLI tool. It brings no extra functionality in comparison with [Struct](https://github.com/workshop/struct), but adds some convenience to writing project file specification.
|
||||
|
||||
# How to install
|
||||
|
||||
Use [Carthage](https://github.com/Carthage/Carthage) to install the tool into your project. Put into your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile):
|
||||
|
||||
```ruby
|
||||
github "XCEssentials/ProjectGenerator" ~> 2.1
|
||||
```
|
||||
|
||||
The project folder will be downloaded by [Carthage](https://github.com/Carthage/Carthage), but nothing will be built, that's expected behavior, ignor warnings from Carthage.
|
||||
|
||||
# How it is organized
|
||||
|
||||
**Remember**, you are not supposed to make any changes in the project, except your project specification file.
|
||||
|
||||
The poject consists of 3 main parts, each of them has its own scheme:
|
||||
|
||||
1. Scheme **"Fwk"** - macOS framework that implements functionality related to parsing your Swift specification file and writing target specification file in YAML for [Struct](https://github.com/workshop/struct).
|
||||
2. Scheme **"Launcher"** - a command line tool that gets the job done. It includes the framework module as dependency and starts the process of parsing your Swift specification file into [Struct](https://github.com/workshop/struct) YAML spec file. This target contains just 2 source files. First one is the **`main.swift`** file, it will be executed when the target will be run in Xcode. Second file is **`Project.Struct.swift`** and it's missing in the project out of the box intentinonally. It's expected location is in your project root directory (given that `ProjectGenerator` is installed with [Carthage](https://github.com/Carthage/Carthage)) and it's your responsibility to put this file there.
|
||||
3. Scheme **"Example"** - very similar to the "Launcher" scheme, with only difference that it contains a sample Swift project specification file with all the necessery statements isnside. Use this sample Swift specification file as starting point for your project specification.
|
||||
|
||||
# How to start using
|
||||
|
||||
If using first time:
|
||||
|
||||
1. copy the [sample file](https://github.com/XCEssentials/ProjectGenerator/blob/master/Example/Spec.swift) from [Example](https://github.com/XCEssentials/ProjectGenerator/tree/master/Example) folder to your project root folder and rename it with **`Project.Struct.swift`**;
|
||||
2. open the project (from your project root folder, go to `./Carthage/Checkouts/ProjectGenerator`, open file `ProjectGenerator.xcodeproj`), make sure that you have the `Launcher` scheme selected (notice, that if you've done everything correctly at the previous step, the `Project.Struct.swift` under `Launcher` group on Project Navigator panel will be in place, not missing);
|
||||
3. make initial editing of the `Project.Struct.swift` file to describe at least basic structure for your project;
|
||||
4. when project specification is ready, just hit "Cmd+R" hotkey in Xcode (Run the scheme), Xcode will build and run the scheme, a new file named `project.yml` will be created at project root folder. That's it!
|
||||
|
||||
To actually generate project file from the created `project.yml` file - use Struct itself from your project root folder.
|
||||
|
||||
# How to use
|
||||
|
||||
When yoiu need to make a change into your project configuration:
|
||||
|
||||
1. open the project (from your project root folder, go to `./Carthage/Checkouts/ProjectGenerator`, open file `ProjectGenerator.xcodeproj`), make sure that you have the `Launcher` scheme selected;
|
||||
2. make the necessary changes in the `Project.Struct.swift` file;
|
||||
3. run the scheme, a new file named `project.yml` will be created at project root folder (will override previous version).
|
||||
|
||||
To actually (re)generate project file from the newly created `project.yml` file - use Struct itself from your project root folder.
|
||||
|
||||
# Notes on versioning
|
||||
|
||||
This project follows [Semantic Versioning](http://semver.org), its MAJOR (and MINOR, when possible) version number is syncronized with corresponding version numbers of the [Struct](https://github.com/workshop/struct) specification format, which is used as blueprint for the output YAML project specification file.
|
||||
|
||||
For example, if this project has version number `2.1.0`, that means the output specification file `project.yml` will be generated using [Spec format: v2.0](https://github.com/workshop/struct/wiki/Spec-format:-v2.0).
|
||||
|
||||
## Future plans
|
||||
|
||||
This project will be kept up to date with latest MAJOR version of [Struct](https://github.com/workshop/struct). Also there is a chance that the execution of [Struct](https://github.com/workshop/struct) CLI tool after (re)generation of `project.yml` file will by automated as well, but so far it seems to be a bit out of scope for the tool.
|
||||
|
||||
## Contribution, feedback, questions...
|
||||
|
||||
If you want to contirbute to the project - feel free to open a pull request.
|
||||
|
||||
If you have any questions, suggestions, feedback or believe you found a bug - feel free to create an issue.
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// MKHProjGen.h
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
//! Project version number for MKHProjGen.
|
||||
FOUNDATION_EXPORT double MKHProjGenVersionNumber;
|
||||
|
||||
//! Project version string for MKHProjGen.
|
||||
FOUNDATION_EXPORT const unsigned char MKHProjGenVersionString[];
|
||||
|
||||
// In this header, you should import all the public headers of your framework using statements like #import <MKHProjGen/PublicHeader.h>
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
//
|
||||
// Device.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/18/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
enum DeviceFamily
|
||||
{
|
||||
public
|
||||
enum iOS
|
||||
{
|
||||
public
|
||||
static
|
||||
let universal = "1,2"
|
||||
|
||||
public
|
||||
static
|
||||
let phone = "1" // iPhone and iPod Touch
|
||||
|
||||
public
|
||||
static
|
||||
let pad = "2" // iPad
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
//
|
||||
// Manager.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
public
|
||||
enum Manager
|
||||
{
|
||||
public
|
||||
static
|
||||
func prepareSpec(
|
||||
_ format: Spec.Format,
|
||||
for project: Project
|
||||
) -> String
|
||||
{
|
||||
let rawSpec: RawSpec
|
||||
|
||||
//===
|
||||
|
||||
switch format
|
||||
{
|
||||
case .v1_2_1:
|
||||
rawSpec = Spec_1_2_1.generate(for: project)
|
||||
|
||||
case .v1_3_0:
|
||||
rawSpec = Spec_1_3_0.generate(for: project)
|
||||
|
||||
case .v2_0_0:
|
||||
rawSpec = Spec_2_0_0.generate(for: project)
|
||||
|
||||
case .v2_1_0:
|
||||
rawSpec = Spec_2_1_0.generate(for: project)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return rawSpec
|
||||
.map { "\(Spec.ident($0))\($1)" }
|
||||
.joined(separator: "\n")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
//
|
||||
// Misc.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/15/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
public
|
||||
typealias KeyValuePair = (key: String, value: Any)
|
||||
|
||||
//===
|
||||
|
||||
infix operator <<<
|
||||
|
||||
public
|
||||
func <<< (keyName: String, value: Any) -> KeyValuePair
|
||||
{
|
||||
return (keyName, value)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
//infix operator </
|
||||
//
|
||||
//public
|
||||
//func </ (keyName: String, value: Any) -> KeyValuePair
|
||||
//{
|
||||
// return (keyName, value)
|
||||
//}
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// Platform.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/15/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
public
|
||||
extension Project
|
||||
{
|
||||
public
|
||||
enum Platform: String
|
||||
{
|
||||
case
|
||||
iOS = "ios" /*,
|
||||
macOS = "mac" */
|
||||
}
|
||||
}
|
31
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.General.swift
vendored
Normal file
31
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.General.swift
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
//
|
||||
// Project.BuildConfig.Defaults.General.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
extension Project.BuildConfiguration.Defaults
|
||||
{
|
||||
enum General
|
||||
{
|
||||
static
|
||||
func debug(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration
|
||||
.Defaults
|
||||
.debug(["general:debug"] + profiles)
|
||||
}
|
||||
|
||||
static
|
||||
func release(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration
|
||||
.Defaults
|
||||
.release(["general:release"] + profiles)
|
||||
}
|
||||
}
|
||||
}
|
39
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.iOS.swift
vendored
Normal file
39
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.iOS.swift
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
//
|
||||
// Project.BuildConfig.Defaults.iOS.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
extension Project.BuildConfiguration.Defaults
|
||||
{
|
||||
enum iOS
|
||||
{
|
||||
static
|
||||
func base(_ profiles: [String] = []) -> Project.BuildConfiguration.Base
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration
|
||||
.Base(["platform:ios"] + profiles)
|
||||
}
|
||||
|
||||
static
|
||||
func debug(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration
|
||||
.Defaults
|
||||
.debug(["ios:debug"] + profiles)
|
||||
}
|
||||
|
||||
static
|
||||
func release(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration
|
||||
.Defaults
|
||||
.release(["ios:release"] + profiles)
|
||||
}
|
||||
}
|
||||
}
|
35
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.swift
vendored
Normal file
35
Carthage/Checkouts/ProjectGenerator/Src/Project/Project.BuildConfig.Defaults.swift
vendored
Normal file
|
@ -0,0 +1,35 @@
|
|||
//
|
||||
// Project.BuildConfig.Defaults.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
extension Project.BuildConfiguration
|
||||
{
|
||||
enum Defaults
|
||||
{
|
||||
static
|
||||
func debug(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration(
|
||||
"Debug",
|
||||
.debug,
|
||||
profiles
|
||||
)
|
||||
}
|
||||
|
||||
static
|
||||
func release(_ profiles: [String] = []) -> Project.BuildConfiguration
|
||||
{
|
||||
return
|
||||
Project.BuildConfiguration(
|
||||
"Release",
|
||||
.release,
|
||||
profiles
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
//
|
||||
// Project.BuildConfig.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/18/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
extension Project
|
||||
{
|
||||
public
|
||||
struct BuildConfiguration
|
||||
{
|
||||
public
|
||||
struct Base
|
||||
{
|
||||
public
|
||||
let profiles: [String]
|
||||
|
||||
//===
|
||||
|
||||
// internal
|
||||
init(_ profiles: [String] = [])
|
||||
{
|
||||
self.profiles = profiles
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public private(set)
|
||||
var overrides: [KeyValuePair] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func override(_ pairs: KeyValuePair...)
|
||||
{
|
||||
overrides.append(contentsOf: pairs)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
enum InternalType: String
|
||||
{
|
||||
case
|
||||
debug,
|
||||
release
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
let name: String
|
||||
|
||||
public
|
||||
let type: InternalType
|
||||
|
||||
public
|
||||
let profiles: [String]
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
var externalConfig: String? = nil // *.xcconfig file
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var overrides: [KeyValuePair] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func override(_ pairs: KeyValuePair...)
|
||||
{
|
||||
overrides.append(contentsOf: pairs)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
// internal
|
||||
init(
|
||||
_ name: String,
|
||||
_ type: InternalType,
|
||||
_ profiles: [String] = []
|
||||
)
|
||||
{
|
||||
self.name = name
|
||||
self.type = type
|
||||
self.profiles = profiles
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
//
|
||||
// Project.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/15/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
public
|
||||
struct Project
|
||||
{
|
||||
public
|
||||
typealias BuildConfigurations =
|
||||
(
|
||||
all: BuildConfiguration.Base,
|
||||
debug: BuildConfiguration,
|
||||
release: BuildConfiguration
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
let name: String
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
var configurations: BuildConfigurations =
|
||||
(
|
||||
BuildConfiguration.Base(
|
||||
// nothing on this level
|
||||
),
|
||||
BuildConfiguration.Defaults.General.debug(
|
||||
//
|
||||
),
|
||||
BuildConfiguration.Defaults.General.release(
|
||||
//
|
||||
)
|
||||
)
|
||||
|
||||
public private(set)
|
||||
var targets: [Target] = []
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
init(
|
||||
_ name: String,
|
||||
_ configureProject: (inout Project) -> Void
|
||||
)
|
||||
{
|
||||
self.name = name
|
||||
|
||||
//---
|
||||
|
||||
configureProject(&self)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
mutating
|
||||
func target(
|
||||
_ name: String,
|
||||
_ platform: Platform,
|
||||
_ type: Target.InternalType,
|
||||
_ configureTarget: (inout Target) -> Void
|
||||
)
|
||||
{
|
||||
targets
|
||||
.append(Target(platform, name, type, configureTarget))
|
||||
}
|
||||
}
|
|
@ -0,0 +1,699 @@
|
|||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
enum Spec_1_2_1
|
||||
{
|
||||
static
|
||||
func generate(for p: Project) -> RawSpec
|
||||
{
|
||||
var result: RawSpec = []
|
||||
var idention: Int = 0
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, "# generated with MKHProjGen")
|
||||
result <<< (idention, "# https://github.com/maximkhatskevich/MKHProjGen")
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#version-number
|
||||
|
||||
result <<< (idention, Spec.key("version") + " \(Spec.Format.v1_2_1.rawValue)")
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.targets)
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("variants"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("$base"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("abstract") + " true")
|
||||
|
||||
idention -= 1
|
||||
|
||||
result <<< (idention, Spec.key(p.name))
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (0, "") // empty line in the EOF
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.BuildConfiguration.Base,
|
||||
_ c: Project.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(c.type))
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
let externalConfig = c.externalConfig
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#xcconfig-references
|
||||
|
||||
// NOTE: when using xcconfig files,
|
||||
// any overrides or profiles will be ignored.
|
||||
|
||||
result <<< (idention, Spec.key("source") + Spec.value(externalConfig) )
|
||||
}
|
||||
else
|
||||
{
|
||||
// NO source/xcconfig provided
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#profiles
|
||||
|
||||
result <<< (idention, Spec.key("profiles"))
|
||||
|
||||
for p in b.profiles + c.profiles
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(p))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
result <<< (idention, Spec.key("overrides"))
|
||||
idention += 1
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ targets: [Project.Target]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("targets"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< process(&idention, t)
|
||||
|
||||
//===
|
||||
|
||||
for tst in t.tests
|
||||
{
|
||||
result <<< process(&idention, tst)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ t: Project.Target
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(t.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#platform
|
||||
|
||||
result <<< (idention, Spec.key("platform") + Spec.value(t.platform.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#type
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(t.type.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.dependencies)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#sources
|
||||
|
||||
if
|
||||
!t.includes.isEmpty
|
||||
{
|
||||
result <<< (idention, "sources:")
|
||||
|
||||
for path in t.includes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#excludes
|
||||
|
||||
if
|
||||
!t.excludes.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("excludes"))
|
||||
idention += 1
|
||||
result <<< (idention, Spec.key("files"))
|
||||
|
||||
for path in t.excludes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#i18n-resources
|
||||
|
||||
if
|
||||
!t.i18nResources.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("i18n-resources"))
|
||||
|
||||
for path in t.i18nResources
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, scripts: t.scripts)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#cocoapods
|
||||
|
||||
if
|
||||
t.includeCocoapods
|
||||
{
|
||||
result <<<
|
||||
(idention,
|
||||
Spec.key("includes_cocoapods") + Spec.value(t.includeCocoapods))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ deps: Project.Target.Dependencies
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!deps.fromSDKs.isEmpty ||
|
||||
!deps.otherTargets.isEmpty ||
|
||||
!deps.binaries.isEmpty ||
|
||||
!deps.projects.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("references"))
|
||||
|
||||
//===
|
||||
|
||||
result <<< processDependencies(&idention, fromSDK: deps.fromSDKs)
|
||||
result <<< processDependencies(&idention, targets: deps.otherTargets)
|
||||
result <<< processDependencies(&idention, binaries: deps.binaries)
|
||||
result <<< processDependencies(&idention, projects: deps.projects)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
fromSDK: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for dep in fromSDK
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value("sdkroot:\(dep)"))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
targets: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(t))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
binaries: [Project.Target.BinaryDependency]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for b in binaries
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(b.location))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(b.codeSignOnCopy))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
projects: [Project.Target.ProjectDependencies]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for p in projects
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(p.location))
|
||||
result <<< (idention, Spec.key(" frameworks"))
|
||||
|
||||
for f in p.frameworks
|
||||
{
|
||||
result <<< (idention, Spec.key(" - name") + Spec.value(f.name))
|
||||
result <<< (idention, Spec.key(" copy") + Spec.value(f.copy))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(f.codeSignOnCopy))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.Target.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.Target.BuildConfiguration.Base,
|
||||
_ c: Project.Target.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
scripts: Project.Target.Scripts
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty ||
|
||||
!scripts.beforeBuilds.isEmpty ||
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("scripts"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, regulars: scripts.regulars)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.beforeBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, beforeBuild: scripts.beforeBuilds)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, afterBuild: scripts.afterBuilds)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
regulars: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for s in regulars
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
beforeBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("prebuild"))
|
||||
|
||||
for s in beforeBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
afterBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("postbuild"))
|
||||
|
||||
for s in afterBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
|
@ -0,0 +1,718 @@
|
|||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
enum Spec_1_3_0
|
||||
{
|
||||
static
|
||||
func generate(for p: Project) -> RawSpec
|
||||
{
|
||||
var result: RawSpec = []
|
||||
var idention: Int = 0
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, "# generated with MKHProjGen")
|
||||
result <<< (idention, "# https://github.com/maximkhatskevich/MKHProjGen")
|
||||
result <<< (idention, "# https://github.com/workshop/struct/wiki/Spec-format:-v1.3")
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v1.3#version-number
|
||||
|
||||
result <<< (idention, Spec.key("version") + " \(Spec.Format.v1_3_0.rawValue)")
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.targets)
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("variants"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("$base"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("abstract") + " true")
|
||||
|
||||
idention -= 1
|
||||
|
||||
result <<< (idention, Spec.key(p.name))
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (0, "") // empty line in the EOF
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.BuildConfiguration.Base,
|
||||
_ c: Project.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(c.type))
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
let externalConfig = c.externalConfig
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#xcconfig-references
|
||||
|
||||
// NOTE: when using xcconfig files,
|
||||
// any overrides or profiles will be ignored.
|
||||
|
||||
result <<< (idention, Spec.key("source") + Spec.value(externalConfig) )
|
||||
}
|
||||
else
|
||||
{
|
||||
// NO source/xcconfig provided
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#profiles
|
||||
|
||||
result <<< (idention, Spec.key("profiles"))
|
||||
|
||||
for p in b.profiles + c.profiles
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(p))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
result <<< (idention, Spec.key("overrides"))
|
||||
idention += 1
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ targets: [Project.Target]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("targets"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< process(&idention, t)
|
||||
|
||||
//===
|
||||
|
||||
for tst in t.tests
|
||||
{
|
||||
result <<< process(&idention, tst)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ t: Project.Target
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(t.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#platform
|
||||
|
||||
result <<< (idention, Spec.key("platform") + Spec.value(t.platform.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#type
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(t.type.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.dependencies)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#sources
|
||||
|
||||
if
|
||||
!t.includes.isEmpty
|
||||
{
|
||||
result <<< (idention, "sources:")
|
||||
|
||||
for path in t.includes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#excludes
|
||||
|
||||
if
|
||||
!t.excludes.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("excludes"))
|
||||
idention += 1
|
||||
result <<< (idention, Spec.key("files"))
|
||||
|
||||
for path in t.excludes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v1.3#options
|
||||
|
||||
if
|
||||
!t.sourceOptions.isEmpty
|
||||
{
|
||||
result <<< (idention, "source_options:")
|
||||
idention += 1
|
||||
|
||||
for (path, opt) in t.sourceOptions
|
||||
{
|
||||
result <<< (idention, Spec.key(path) + Spec.value(opt))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#i18n-resources
|
||||
|
||||
if
|
||||
!t.i18nResources.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("i18n-resources"))
|
||||
|
||||
for path in t.i18nResources
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, scripts: t.scripts)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#cocoapods
|
||||
|
||||
if
|
||||
t.includeCocoapods
|
||||
{
|
||||
result <<<
|
||||
(idention,
|
||||
Spec.key("includes_cocoapods") + Spec.value(t.includeCocoapods))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ deps: Project.Target.Dependencies
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!deps.fromSDKs.isEmpty ||
|
||||
!deps.otherTargets.isEmpty ||
|
||||
!deps.binaries.isEmpty ||
|
||||
!deps.projects.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("references"))
|
||||
|
||||
//===
|
||||
|
||||
result <<< processDependencies(&idention, fromSDK: deps.fromSDKs)
|
||||
result <<< processDependencies(&idention, targets: deps.otherTargets)
|
||||
result <<< processDependencies(&idention, binaries: deps.binaries)
|
||||
result <<< processDependencies(&idention, projects: deps.projects)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
fromSDK: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for dep in fromSDK
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value("sdkroot:\(dep)"))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
targets: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(t))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
binaries: [Project.Target.BinaryDependency]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for b in binaries
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(b.location))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(b.codeSignOnCopy))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
projects: [Project.Target.ProjectDependencies]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for p in projects
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(p.location))
|
||||
result <<< (idention, Spec.key(" frameworks"))
|
||||
|
||||
for f in p.frameworks
|
||||
{
|
||||
result <<< (idention, Spec.key(" - name") + Spec.value(f.name))
|
||||
result <<< (idention, Spec.key(" copy") + Spec.value(f.copy))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(f.codeSignOnCopy))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.Target.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.Target.BuildConfiguration.Base,
|
||||
_ c: Project.Target.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
scripts: Project.Target.Scripts
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty ||
|
||||
!scripts.beforeBuilds.isEmpty ||
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("scripts"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, regulars: scripts.regulars)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.beforeBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, beforeBuild: scripts.beforeBuilds)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, afterBuild: scripts.afterBuilds)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
regulars: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for s in regulars
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
beforeBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("prebuild"))
|
||||
|
||||
for s in beforeBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
afterBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("postbuild"))
|
||||
|
||||
for s in afterBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
|
@ -0,0 +1,712 @@
|
|||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
enum Spec_2_0_0
|
||||
{
|
||||
static
|
||||
func generate(for p: Project) -> RawSpec
|
||||
{
|
||||
var result: RawSpec = []
|
||||
var idention: Int = 0
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, "# generated with XCEProjectGenerator")
|
||||
result <<< (idention, "# https://github.com/XCEssentials/ProjectGenerator")
|
||||
result <<< (idention, "# https://github.com/workshop/struct/wiki/Spec-format:-v2.0")
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v2.0#version-number
|
||||
|
||||
result <<< (idention, Spec.key("version") + " \(Spec.Format.v2_0_0.rawValue)")
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.targets)
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("variants"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("$base"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("abstract") + " true")
|
||||
|
||||
idention -= 1
|
||||
|
||||
result <<< (idention, Spec.key(p.name))
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (0, "") // empty line in the EOF
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.BuildConfiguration.Base,
|
||||
_ c: Project.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(c.type))
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
let externalConfig = c.externalConfig
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#xcconfig-references
|
||||
|
||||
// NOTE: when using xcconfig files,
|
||||
// any overrides or profiles will be ignored.
|
||||
|
||||
result <<< (idention, Spec.key("source") + Spec.value(externalConfig) )
|
||||
}
|
||||
else
|
||||
{
|
||||
// NO source/xcconfig provided
|
||||
|
||||
//===
|
||||
|
||||
// NO profiles anymore
|
||||
// https://github.com/workshop/struct/wiki/Migrating-from-Spec-1.3.1-to-Spec-2.0.0
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#overrides
|
||||
|
||||
result <<< (idention, Spec.key("overrides"))
|
||||
idention += 1
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ targets: [Project.Target]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("targets"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< process(&idention, t)
|
||||
|
||||
//===
|
||||
|
||||
for tst in t.tests
|
||||
{
|
||||
result <<< process(&idention, tst)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ t: Project.Target
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(t.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#platform
|
||||
|
||||
result <<< (idention, Spec.key("platform") + Spec.value(t.platform.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#type
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(t.type.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.dependencies)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#sources
|
||||
|
||||
if
|
||||
!t.includes.isEmpty
|
||||
{
|
||||
result <<< (idention, "sources:")
|
||||
|
||||
for path in t.includes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#excludes
|
||||
|
||||
if
|
||||
!t.excludes.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("excludes"))
|
||||
idention += 1
|
||||
result <<< (idention, Spec.key("files"))
|
||||
|
||||
for path in t.excludes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v2.0#options
|
||||
|
||||
if
|
||||
!t.sourceOptions.isEmpty
|
||||
{
|
||||
result <<< (idention, "source_options:")
|
||||
idention += 1
|
||||
|
||||
for (path, opt) in t.sourceOptions
|
||||
{
|
||||
result <<< (idention, Spec.key(path) + Spec.value(opt))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#i18n-resources
|
||||
|
||||
if
|
||||
!t.i18nResources.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("i18n-resources"))
|
||||
|
||||
for path in t.i18nResources
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, scripts: t.scripts)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#cocoapods
|
||||
|
||||
if
|
||||
t.includeCocoapods
|
||||
{
|
||||
result <<<
|
||||
(idention,
|
||||
Spec.key("includes_cocoapods") + Spec.value(t.includeCocoapods))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ deps: Project.Target.Dependencies
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!deps.fromSDKs.isEmpty ||
|
||||
!deps.otherTargets.isEmpty ||
|
||||
!deps.binaries.isEmpty ||
|
||||
!deps.projects.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("references"))
|
||||
|
||||
//===
|
||||
|
||||
result <<< processDependencies(&idention, fromSDK: deps.fromSDKs)
|
||||
result <<< processDependencies(&idention, targets: deps.otherTargets)
|
||||
result <<< processDependencies(&idention, binaries: deps.binaries)
|
||||
result <<< processDependencies(&idention, projects: deps.projects)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
fromSDK: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for dep in fromSDK
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value("sdkroot:\(dep)"))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
targets: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(t))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
binaries: [Project.Target.BinaryDependency]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for b in binaries
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(b.location))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(b.codeSignOnCopy))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
projects: [Project.Target.ProjectDependencies]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for p in projects
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(p.location))
|
||||
result <<< (idention, Spec.key(" frameworks"))
|
||||
|
||||
for f in p.frameworks
|
||||
{
|
||||
result <<< (idention, Spec.key(" - name") + Spec.value(f.name))
|
||||
result <<< (idention, Spec.key(" copy") + Spec.value(f.copy))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(f.codeSignOnCopy))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.Target.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.Target.BuildConfiguration.Base,
|
||||
_ c: Project.Target.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
scripts: Project.Target.Scripts
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty ||
|
||||
!scripts.beforeBuilds.isEmpty ||
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("scripts"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, regulars: scripts.regulars)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.beforeBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, beforeBuild: scripts.beforeBuilds)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, afterBuild: scripts.afterBuilds)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
regulars: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for s in regulars
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
beforeBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("prebuild"))
|
||||
|
||||
for s in beforeBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
afterBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("postbuild"))
|
||||
|
||||
for s in afterBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
|
@ -0,0 +1,712 @@
|
|||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
enum Spec_2_1_0
|
||||
{
|
||||
static
|
||||
func generate(for p: Project) -> RawSpec
|
||||
{
|
||||
var result: RawSpec = []
|
||||
var idention: Int = 0
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, "# generated with XCEProjectGenerator")
|
||||
result <<< (idention, "# https://github.com/XCEssentials/ProjectGenerator")
|
||||
result <<< (idention, "# https://github.com/workshop/struct/wiki/Spec-format:-v2.0")
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v2.0#version-number
|
||||
|
||||
result <<< (idention, Spec.key("version") + " \(Spec.Format.v2_1_0.rawValue)")
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, p.targets)
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("variants"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("$base"))
|
||||
|
||||
idention += 1
|
||||
|
||||
result <<< (idention, Spec.key("abstract") + " true")
|
||||
|
||||
idention -= 1
|
||||
|
||||
result <<< (idention, Spec.key(p.name))
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (0, "") // empty line in the EOF
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.BuildConfiguration.Base,
|
||||
_ c: Project.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#configurations
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(c.type))
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
let externalConfig = c.externalConfig
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#xcconfig-references
|
||||
|
||||
// NOTE: when using xcconfig files,
|
||||
// any overrides or profiles will be ignored.
|
||||
|
||||
result <<< (idention, Spec.key("source") + Spec.value(externalConfig) )
|
||||
}
|
||||
else
|
||||
{
|
||||
// NO source/xcconfig provided
|
||||
|
||||
//===
|
||||
|
||||
// NO profiles anymore
|
||||
// https://github.com/workshop/struct/wiki/Migrating-from-Spec-1.3.1-to-Spec-2.0.0
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#overrides
|
||||
|
||||
result <<< (idention, Spec.key("overrides"))
|
||||
idention += 1
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ targets: [Project.Target]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("targets"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< process(&idention, t)
|
||||
|
||||
//===
|
||||
|
||||
for tst in t.tests
|
||||
{
|
||||
result <<< process(&idention, tst)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ t: Project.Target
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#targets
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(t.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#platform
|
||||
|
||||
result <<< (idention, Spec.key("platform") + Spec.value(t.platform.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#type
|
||||
|
||||
result <<< (idention, Spec.key("type") + Spec.value(t.type.rawValue))
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.dependencies)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#sources
|
||||
|
||||
if
|
||||
!t.includes.isEmpty
|
||||
{
|
||||
result <<< (idention, "sources:")
|
||||
|
||||
for path in t.includes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#excludes
|
||||
|
||||
if
|
||||
!t.excludes.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("excludes"))
|
||||
idention += 1
|
||||
result <<< (idention, Spec.key("files"))
|
||||
|
||||
for path in t.excludes
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/workshop/struct/wiki/Spec-format:-v2.0#options
|
||||
|
||||
if
|
||||
!t.sourceOptions.isEmpty
|
||||
{
|
||||
result <<< (idention, "source_options:")
|
||||
idention += 1
|
||||
|
||||
for (path, opt) in t.sourceOptions
|
||||
{
|
||||
result <<< (idention, Spec.key(path) + Spec.value(opt))
|
||||
}
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#i18n-resources
|
||||
|
||||
if
|
||||
!t.i18nResources.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("i18n-resources"))
|
||||
|
||||
for path in t.i18nResources
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(path))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, t.configurations)
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, scripts: t.scripts)
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#cocoapods
|
||||
|
||||
if
|
||||
t.includeCocoapods
|
||||
{
|
||||
result <<<
|
||||
(idention,
|
||||
Spec.key("includes_cocoapods") + Spec.value(t.includeCocoapods))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ deps: Project.Target.Dependencies
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!deps.fromSDKs.isEmpty ||
|
||||
!deps.otherTargets.isEmpty ||
|
||||
!deps.binaries.isEmpty ||
|
||||
!deps.projects.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("references"))
|
||||
|
||||
//===
|
||||
|
||||
result <<< processDependencies(&idention, fromSDK: deps.fromSDKs)
|
||||
result <<< processDependencies(&idention, targets: deps.otherTargets)
|
||||
result <<< processDependencies(&idention, binaries: deps.binaries)
|
||||
result <<< processDependencies(&idention, projects: deps.projects)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
fromSDK: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for dep in fromSDK
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value("sdkroot:\(dep)"))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
targets: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for t in targets
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(t))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
binaries: [Project.Target.BinaryDependency]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for b in binaries
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(b.location))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(b.codeSignOnCopy))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processDependencies(
|
||||
_ idention: inout Int,
|
||||
projects: [Project.Target.ProjectDependencies]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#references
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for p in projects
|
||||
{
|
||||
result <<< (idention, Spec.key("- location") + Spec.value(p.location))
|
||||
result <<< (idention, Spec.key(" frameworks"))
|
||||
|
||||
for f in p.frameworks
|
||||
{
|
||||
result <<< (idention, Spec.key(" - name") + Spec.value(f.name))
|
||||
result <<< (idention, Spec.key(" copy") + Spec.value(f.copy))
|
||||
result <<< (idention, Spec.key(" codeSignOnCopy") + Spec.value(f.codeSignOnCopy))
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ set: Project.Target.BuildConfigurations
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("configurations"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
result <<< process(&idention, set.all, set.debug)
|
||||
result <<< process(&idention, set.all, set.release)
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
_ b: Project.Target.BuildConfiguration.Base,
|
||||
_ c: Project.Target.BuildConfiguration
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/issues/77#issuecomment-287573381
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key(c.name))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v1.2#overrides
|
||||
|
||||
for o in b.overrides + c.overrides
|
||||
{
|
||||
result <<< (idention, Spec.key(o.key) + Spec.value(o.value))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func process(
|
||||
_ idention: inout Int,
|
||||
scripts: Project.Target.Scripts
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty ||
|
||||
!scripts.beforeBuilds.isEmpty ||
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< (idention, Spec.key("scripts"))
|
||||
|
||||
//===
|
||||
|
||||
idention += 1
|
||||
|
||||
//===
|
||||
|
||||
if
|
||||
!scripts.regulars.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, regulars: scripts.regulars)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.beforeBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, beforeBuild: scripts.beforeBuilds)
|
||||
}
|
||||
|
||||
if
|
||||
!scripts.afterBuilds.isEmpty
|
||||
{
|
||||
result <<< processScripts(&idention, afterBuild: scripts.afterBuilds)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
idention -= 1
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
regulars: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
for s in regulars
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
beforeBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("prebuild"))
|
||||
|
||||
for s in beforeBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
static
|
||||
func processScripts(
|
||||
_ idention: inout Int,
|
||||
afterBuild: [String]
|
||||
) -> RawSpec
|
||||
{
|
||||
// https://github.com/lyptt/struct/wiki/Spec-format:-v2.0#scripts
|
||||
|
||||
//===
|
||||
|
||||
var result: RawSpec = []
|
||||
|
||||
//===
|
||||
|
||||
result <<< (idention, Spec.key("postbuild"))
|
||||
|
||||
for s in afterBuild
|
||||
{
|
||||
result <<< (idention, "-" + Spec.value(s))
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
typealias SpecLine = (idention: Int, line: String)
|
||||
typealias RawSpec = [SpecLine]
|
||||
|
||||
//===
|
||||
|
||||
func <<< (list: inout RawSpec, element: SpecLine)
|
||||
{
|
||||
list.append(element)
|
||||
}
|
||||
|
||||
func <<< (list: inout RawSpec, elements: RawSpec)
|
||||
{
|
||||
list.append(contentsOf: elements)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
enum Spec
|
||||
{
|
||||
public
|
||||
enum Format: String
|
||||
{
|
||||
case
|
||||
v1_2_1 = "1.2.1",
|
||||
v1_3_0 = "1.3.0",
|
||||
v2_0_0 = "2.0.0",
|
||||
v2_1_0 = "2.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
extension Spec
|
||||
{
|
||||
static
|
||||
func ident(_ idention: Int) -> String
|
||||
{
|
||||
return Array(repeating: " ", count: idention).joined()
|
||||
}
|
||||
|
||||
static
|
||||
func key(_ v: Any) -> String
|
||||
{
|
||||
return "\(v):"
|
||||
}
|
||||
|
||||
static
|
||||
func value(_ v: Any) -> String
|
||||
{
|
||||
return " \"\(v)\""
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
//
|
||||
// Project.BuildConfig.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/18/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
extension Project.Target
|
||||
{
|
||||
public
|
||||
struct BuildConfiguration
|
||||
{
|
||||
public
|
||||
struct Base
|
||||
{
|
||||
// internal
|
||||
init(_ overrides: [KeyValuePair] = [])
|
||||
{
|
||||
self.overrides = overrides
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public private(set)
|
||||
var overrides: [KeyValuePair] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func override(_ pairs: KeyValuePair...)
|
||||
{
|
||||
overrides.append(contentsOf: pairs)
|
||||
}
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
let name: String
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var overrides: [KeyValuePair] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func override(_ pairs: KeyValuePair...)
|
||||
{
|
||||
overrides.append(contentsOf: pairs)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
// internal
|
||||
init(
|
||||
_ name: String
|
||||
)
|
||||
{
|
||||
self.name = name
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
//
|
||||
// Target.Dependencies.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/17/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
extension Project.Target
|
||||
{
|
||||
public
|
||||
typealias BinaryDependency =
|
||||
(
|
||||
location: String,
|
||||
codeSignOnCopy: Bool
|
||||
)
|
||||
|
||||
public
|
||||
typealias ProjectDependencies =
|
||||
(
|
||||
location: String,
|
||||
frameworks: [ProjectDependency]
|
||||
)
|
||||
|
||||
public
|
||||
typealias ProjectDependency =
|
||||
(
|
||||
name: String,
|
||||
copy: Bool,
|
||||
codeSignOnCopy: Bool
|
||||
)
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
struct Dependencies
|
||||
{
|
||||
public private(set)
|
||||
var fromSDKs: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func fromSDK(_ element: String...)
|
||||
{
|
||||
fromSDKs.append(contentsOf: element)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public private(set)
|
||||
var otherTargets: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func otherTarget(_ element: String...)
|
||||
{
|
||||
otherTargets.append(contentsOf: element)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public private(set)
|
||||
var binaries: [BinaryDependency] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func binary(_ element: BinaryDependency...)
|
||||
{
|
||||
binaries.append(contentsOf: element)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
public private(set)
|
||||
var projects: [ProjectDependencies] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func project(_ element: ProjectDependencies...)
|
||||
{
|
||||
projects.append(contentsOf: element)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
// internal
|
||||
init()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
//
|
||||
// Target.Script.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/18/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//===
|
||||
|
||||
public
|
||||
extension Project.Target
|
||||
{
|
||||
public
|
||||
struct Scripts
|
||||
{
|
||||
public private(set)
|
||||
var regulars: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func regular(_ paths: String...)
|
||||
{
|
||||
regulars.append(contentsOf: paths)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var beforeBuilds: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func beforeBuild(_ paths: String...)
|
||||
{
|
||||
beforeBuilds.append(contentsOf: paths)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var afterBuilds: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func afterBuild(_ paths: String...)
|
||||
{
|
||||
afterBuilds.append(contentsOf: paths)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
//
|
||||
// Target.Type.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
extension Project.Target
|
||||
{
|
||||
public
|
||||
enum InternalType: String
|
||||
{
|
||||
case
|
||||
app = ":application",
|
||||
framework = ":framework",
|
||||
dynamicLibrary = ":library.dynamic",
|
||||
staticLibrary = ":library.static",
|
||||
bundle = ":bundle",
|
||||
unitTest = ":bundle.unit-test",
|
||||
uiTest = ":bundle.ui-testing",
|
||||
appExtension = ":app-extension",
|
||||
tool = ":tool",
|
||||
watchApp = ":application.watchapp",
|
||||
watchApp2 = ":application.watchapp2",
|
||||
watchKitExtension = ":watchkit-extension",
|
||||
watchKit2Extension = ":watchkit2-extension",
|
||||
tvAppExtension = ":tv-app-extension",
|
||||
messagesApp = ":application.messages",
|
||||
appExtensionMessages = ":app-extension.messages",
|
||||
appExtensionMessagesStickers = ":app-extension.messages-sticker-pack",
|
||||
xpcService = ":xpc-service"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,169 @@
|
|||
//
|
||||
// Target.swift
|
||||
// MKHProjGen
|
||||
//
|
||||
// Created by Maxim Khatskevich on 3/16/17.
|
||||
// Copyright © 2017 Maxim Khatskevich. All rights reserved.
|
||||
//
|
||||
|
||||
public
|
||||
extension Project
|
||||
{
|
||||
public
|
||||
struct Target
|
||||
{
|
||||
public
|
||||
typealias BuildConfigurations =
|
||||
(
|
||||
all: BuildConfiguration.Base,
|
||||
debug: BuildConfiguration,
|
||||
release: BuildConfiguration
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
let name: String
|
||||
|
||||
public
|
||||
let platform: Platform
|
||||
|
||||
public
|
||||
let type: InternalType
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var includes: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func include(_ paths: String...)
|
||||
{
|
||||
includes.append(contentsOf: paths)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var excludes: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func exclude(_ patterns: String...)
|
||||
{
|
||||
excludes.append(contentsOf: patterns)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
var sourceOptions: [String: String] = [:]
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var i18nResources: [String] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func i18nResource(_ paths: String...)
|
||||
{
|
||||
i18nResources.append(contentsOf: paths)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
public
|
||||
var configurations: BuildConfigurations =
|
||||
(
|
||||
Project.Target.BuildConfiguration.Base(
|
||||
//
|
||||
),
|
||||
Project.Target.BuildConfiguration(
|
||||
Project.BuildConfiguration.Defaults.iOS.debug().name
|
||||
),
|
||||
Project.Target.BuildConfiguration(
|
||||
Project.BuildConfiguration.Defaults.iOS.release().name
|
||||
)
|
||||
)
|
||||
|
||||
public
|
||||
var dependencies = Dependencies()
|
||||
|
||||
public
|
||||
var scripts = Scripts()
|
||||
|
||||
public
|
||||
var includeCocoapods = false
|
||||
|
||||
//---
|
||||
|
||||
public private(set)
|
||||
var tests: [Target] = []
|
||||
|
||||
public
|
||||
mutating
|
||||
func unitTests(
|
||||
_ name: String = "Tests",
|
||||
_ configureTarget: (inout Target) -> Void
|
||||
)
|
||||
{
|
||||
var ut = Target(self.platform, name, .unitTest, configureTarget)
|
||||
|
||||
//===
|
||||
|
||||
ut.dependencies.otherTarget(self.name)
|
||||
|
||||
if
|
||||
type == .app
|
||||
{
|
||||
ut.configurations.all.override(
|
||||
|
||||
// https://github.com/workshop/struct/blob/master/examples/iOS_Application/project.yml#L115
|
||||
"TEST_HOST"
|
||||
<<< "$(BUILT_PRODUCTS_DIR)/\(self.name).app/\(self.name)"
|
||||
)
|
||||
}
|
||||
|
||||
//===
|
||||
|
||||
tests.append(ut)
|
||||
}
|
||||
|
||||
public
|
||||
mutating
|
||||
func uiTests(
|
||||
_ name: String = "UITests",
|
||||
_ configureTarget: (inout Target) -> Void
|
||||
)
|
||||
{
|
||||
var uit = Target(self.platform, name, .uiTest, configureTarget)
|
||||
|
||||
uit.dependencies.otherTarget(self.name)
|
||||
|
||||
//===
|
||||
|
||||
tests.append(uit)
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
// internal
|
||||
init(
|
||||
_ platform: Platform,
|
||||
_ name: String,
|
||||
_ type: InternalType,
|
||||
_ configureTarget: (inout Target) -> Void
|
||||
)
|
||||
{
|
||||
self.name = name
|
||||
self.platform = platform
|
||||
self.type = type
|
||||
|
||||
//---
|
||||
|
||||
configureTarget(&self)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
theme: jekyll-theme-cayman
|
|
@ -0,0 +1,103 @@
|
|||
# Customise this file, documentation can be found here:
|
||||
# https://github.com/KrauseFx/fastlane/tree/master/docs
|
||||
# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md
|
||||
# can also be listed using the `fastlane actions` command
|
||||
|
||||
# Change the syntax highlighting to Ruby
|
||||
# All lines starting with a # are ignored when running `fastlane`
|
||||
|
||||
# By default, fastlane will send which actions are used
|
||||
# No personal data is shared, more information on https://github.com/fastlane/enhancer
|
||||
# Uncomment the following line to opt out
|
||||
# opt_out_usage
|
||||
|
||||
# If you want to automatically update fastlane if a new version is available:
|
||||
# update_fastlane
|
||||
|
||||
# This is the minimum version number required.
|
||||
# Update this, if you use features of a newer version
|
||||
fastlane_version '1.100.0'
|
||||
|
||||
default_platform :ios
|
||||
|
||||
#===
|
||||
|
||||
projName = 'ProjectGenerator'
|
||||
projFileName = projName + '.xcodeproj'
|
||||
|
||||
#===
|
||||
|
||||
platform :ios do
|
||||
|
||||
lane :inc_version_and_commit do
|
||||
|
||||
ensure_git_status_clean
|
||||
|
||||
# ===
|
||||
|
||||
versionNumber = get_version_number(xcodeproj: projFileName)
|
||||
puts 'Current VERSION number: ' + versionNumber
|
||||
|
||||
# === Infer new version number, suppose we are using GitFlow
|
||||
|
||||
currentBranch = git_branch
|
||||
|
||||
if currentBranch.include? 'release/'
|
||||
|
||||
# we are on a release branch
|
||||
|
||||
defaultNewVersion = currentBranch.split('/').last
|
||||
|
||||
else
|
||||
|
||||
# we are NOT on a release branch
|
||||
|
||||
defaultNewVersion = ''
|
||||
|
||||
end
|
||||
|
||||
# === Define new version number
|
||||
|
||||
useInferredNEWVersionNumber = prompt(
|
||||
text: 'Proceed with inferred NEW version number (' + defaultNewVersion + ')?',
|
||||
boolean: true
|
||||
)
|
||||
|
||||
if useInferredNEWVersionNumber
|
||||
|
||||
newVersionNumber = defaultNewVersion
|
||||
|
||||
else
|
||||
|
||||
newVersionNumber = prompt(text: 'New VERSION number:')
|
||||
|
||||
end
|
||||
|
||||
# === Apply NEW version number and increment build number
|
||||
|
||||
increment_version_number(
|
||||
xcodeproj: projFileName,
|
||||
version_number: newVersionNumber
|
||||
)
|
||||
|
||||
increment_build_number(
|
||||
xcodeproj: projFileName
|
||||
)
|
||||
|
||||
# ===
|
||||
|
||||
newBuildNumber = get_build_number(xcodeproj: projFileName)
|
||||
|
||||
commit_version_bump( # it will fail if more than version bump
|
||||
xcodeproj: projFileName,
|
||||
message: 'Version Bump to ' + newVersionNumber + ' (' + newBuildNumber + ')'
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
# More information about multiple platforms in fastlane: https://github.com/KrauseFx/fastlane/blob/master/docs/Platforms.md
|
||||
# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md
|
|
@ -0,0 +1,43 @@
|
|||
fastlane documentation
|
||||
================
|
||||
# Installation
|
||||
|
||||
Make sure you have the latest version of the Xcode command line tools installed:
|
||||
|
||||
```
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
## Choose your installation method:
|
||||
|
||||
<table width="100%" >
|
||||
<tr>
|
||||
<th width="33%"><a href="http://brew.sh">Homebrew</a></td>
|
||||
<th width="33%">Installer Script</td>
|
||||
<th width="33%">Rubygems</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%" align="center">macOS</td>
|
||||
<td width="33%" align="center">macOS</td>
|
||||
<td width="33%" align="center">macOS or Linux with Ruby 2.0.0 or above</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><code>brew cask install fastlane</code></td>
|
||||
<td width="33%"><a href="https://download.fastlane.tools">Download the zip file</a>. Then double click on the <code>install</code> script (or run it in a terminal window).</td>
|
||||
<td width="33%"><code>sudo gem install fastlane -NV</code></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
# Available Actions
|
||||
## iOS
|
||||
### ios inc_version_and_commit
|
||||
```
|
||||
fastlane ios inc_version_and_commit
|
||||
```
|
||||
|
||||
|
||||
----
|
||||
|
||||
This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
|
||||
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
||||
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
|
@ -0,0 +1,101 @@
|
|||
import XCEProjectGenerator
|
||||
|
||||
//===
|
||||
|
||||
let params =
|
||||
(
|
||||
repoName: "APIClient",
|
||||
deploymentTarget: "8.0",
|
||||
companyIdentifier: "io.XCEssentials",
|
||||
companyPrefix: "XCE"
|
||||
)
|
||||
|
||||
let bundleId =
|
||||
(
|
||||
fwk: "\(params.companyIdentifier).\(params.repoName)",
|
||||
tst: "\(params.companyIdentifier).\(params.repoName).Tst"
|
||||
)
|
||||
|
||||
//===
|
||||
|
||||
let specFormat = Spec.Format.v2_1_0
|
||||
|
||||
let project = Project("Main") { project in
|
||||
|
||||
project.configurations.all.override(
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"SWIFT_VERSION" <<< "3.0",
|
||||
"VERSIONING_SYSTEM" <<< "apple-generic",
|
||||
|
||||
"CURRENT_PROJECT_VERSION" <<< "0" // just a default non-empty value
|
||||
)
|
||||
|
||||
project.configurations.debug.override(
|
||||
|
||||
"SWIFT_OPTIMIZATION_LEVEL" <<< "-Onone"
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
project.target("Fwk", .iOS, .framework) { target in
|
||||
|
||||
target.include("Sources")
|
||||
|
||||
//---
|
||||
|
||||
target.configurations.all.override(
|
||||
|
||||
"PRODUCT_NAME" <<< "\(params.companyPrefix)\(params.repoName)",
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"PRODUCT_BUNDLE_IDENTIFIER" <<< bundleId.fwk,
|
||||
"INFOPLIST_FILE" <<< "Info/Fwk.plist",
|
||||
|
||||
//--- iOS related:
|
||||
|
||||
"SDKROOT" <<< "iphoneos",
|
||||
"TARGETED_DEVICE_FAMILY" <<< DeviceFamily.iOS.universal,
|
||||
|
||||
//--- Framework related:
|
||||
|
||||
"DEFINES_MODULE" <<< "NO",
|
||||
"SKIP_INSTALL" <<< "YES"
|
||||
)
|
||||
|
||||
target.configurations.debug.override(
|
||||
|
||||
"MTL_ENABLE_DEBUG_INFO" <<< true
|
||||
)
|
||||
|
||||
//---
|
||||
|
||||
target.unitTests { unitTests in
|
||||
|
||||
unitTests.include("Tests")
|
||||
|
||||
//---
|
||||
|
||||
unitTests.configurations.all.override(
|
||||
|
||||
// very important for unit tests,
|
||||
// prevents the error when unit test do not start at all
|
||||
"LD_RUNPATH_SEARCH_PATHS" <<<
|
||||
"$(inherited) @executable_path/Frameworks @loader_path/Frameworks",
|
||||
|
||||
"IPHONEOS_DEPLOYMENT_TARGET" <<< params.deploymentTarget, // bug wokraround
|
||||
|
||||
"PRODUCT_BUNDLE_IDENTIFIER" <<< bundleId.tst,
|
||||
"INFOPLIST_FILE" <<< "Info/Tst.plist",
|
||||
"FRAMEWORK_SEARCH_PATHS" <<< "$(inherited) $(BUILT_PRODUCTS_DIR)"
|
||||
)
|
||||
|
||||
unitTests.configurations.debug.override(
|
||||
|
||||
"MTL_ENABLE_DEBUG_INFO" <<< true
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
# generated with XCEProjectGenerator
|
||||
# https://github.com/XCEssentials/ProjectGenerator
|
||||
# https://github.com/workshop/struct/wiki/Spec-format:-v2.0
|
||||
version: 2.1.0
|
||||
configurations:
|
||||
Debug:
|
||||
type: "debug"
|
||||
overrides:
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
SWIFT_VERSION: "3.0"
|
||||
VERSIONING_SYSTEM: "apple-generic"
|
||||
CURRENT_PROJECT_VERSION: "0"
|
||||
SWIFT_OPTIMIZATION_LEVEL: "-Onone"
|
||||
Release:
|
||||
type: "release"
|
||||
overrides:
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
SWIFT_VERSION: "3.0"
|
||||
VERSIONING_SYSTEM: "apple-generic"
|
||||
CURRENT_PROJECT_VERSION: "0"
|
||||
targets:
|
||||
Fwk:
|
||||
platform: "ios"
|
||||
type: ":framework"
|
||||
sources:
|
||||
- "Sources"
|
||||
configurations:
|
||||
Debug:
|
||||
PRODUCT_NAME: "XCEAPIClient"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
PRODUCT_BUNDLE_IDENTIFIER: "io.XCEssentials.APIClient"
|
||||
INFOPLIST_FILE: "Info/Fwk.plist"
|
||||
SDKROOT: "iphoneos"
|
||||
TARGETED_DEVICE_FAMILY: "1,2"
|
||||
DEFINES_MODULE: "NO"
|
||||
SKIP_INSTALL: "YES"
|
||||
MTL_ENABLE_DEBUG_INFO: "true"
|
||||
Release:
|
||||
PRODUCT_NAME: "XCEAPIClient"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
PRODUCT_BUNDLE_IDENTIFIER: "io.XCEssentials.APIClient"
|
||||
INFOPLIST_FILE: "Info/Fwk.plist"
|
||||
SDKROOT: "iphoneos"
|
||||
TARGETED_DEVICE_FAMILY: "1,2"
|
||||
DEFINES_MODULE: "NO"
|
||||
SKIP_INSTALL: "YES"
|
||||
Tests:
|
||||
platform: "ios"
|
||||
type: ":bundle.unit-test"
|
||||
references:
|
||||
- "Fwk"
|
||||
sources:
|
||||
- "Tests"
|
||||
configurations:
|
||||
Debug:
|
||||
LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
PRODUCT_BUNDLE_IDENTIFIER: "io.XCEssentials.APIClient.Tst"
|
||||
INFOPLIST_FILE: "Info/Tst.plist"
|
||||
FRAMEWORK_SEARCH_PATHS: "$(inherited) $(BUILT_PRODUCTS_DIR)"
|
||||
MTL_ENABLE_DEBUG_INFO: "true"
|
||||
Release:
|
||||
LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "8.0"
|
||||
PRODUCT_BUNDLE_IDENTIFIER: "io.XCEssentials.APIClient.Tst"
|
||||
INFOPLIST_FILE: "Info/Tst.plist"
|
||||
FRAMEWORK_SEARCH_PATHS: "$(inherited) $(BUILT_PRODUCTS_DIR)"
|
||||
variants:
|
||||
$base:
|
||||
abstract: true
|
||||
Main:
|
Loading…
Reference in New Issue