diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ee87a2fd..88bb64162 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ endif() find_package(dispatch QUIET) find_package(Foundation QUIET) find_package(Yams CONFIG REQUIRED) +find_package(ArgumentParser CONFIG REQUIRED) add_subdirectory(Sources) add_subdirectory(cmake/modules) diff --git a/Package.resolved b/Package.resolved index 88359f9c8..809bac1a0 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,6 +1,15 @@ { "object": { "pins": [ + { + "package": "swift-argument-parser", + "repositoryURL": "https://github.com/apple/swift-argument-parser.git", + "state": { + "branch": null, + "revision": "15351c1cd009eba0b6e438bfef55ea9847a8dc4a", + "version": "0.3.0" + } + }, { "package": "llbuild", "repositoryURL": "https://github.com/apple/swift-llbuild.git", diff --git a/Package.swift b/Package.swift index d82a6231e..e896c8a1f 100644 --- a/Package.swift +++ b/Package.swift @@ -46,7 +46,7 @@ let package = Package( /// The help executable. .target( name: "swift-help", - dependencies: ["SwiftOptions"]), + dependencies: ["SwiftOptions", "ArgumentParser"]), /// The `makeOptions` utility (for importing option definitions). .target( @@ -75,10 +75,12 @@ if ProcessInfo.processInfo.environment["SWIFTCI_USE_LOCAL_DEPS"] == nil { package.dependencies += [ .package(url: "https://github.com/apple/swift-tools-support-core.git", .branch("master")), .package(url: "https://github.com/jpsim/Yams.git", .upToNextMinor(from: "4.0.0")), + .package(url: "https://github.com/apple/swift-argument-parser.git", .exact("0.3.0")) ] } else { package.dependencies += [ .package(path: "../swiftpm/swift-tools-support-core"), .package(path: "../yams"), + .package(path: "../swift-argument-parser"), ] } diff --git a/README.md b/README.md index fca4e9971..10e9d0b38 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,12 @@ all with CMake: ``` cmake -B -G Ninja -DLLBUILD_SUPPORT_BINDINGS="Swift" ``` +* [swift-argument-parser](https://github.com/apple/swift-argument-parser) * [Yams](https://github.com/jpsim/Yams) Once those dependencies have built, build `swift-driver` itself: ``` -cmake -B -G Ninja -DTSC_DIR=/cmake/modules -DLLBuild_DIR=/cmake/modules -DYams_DIR=/cmake/modules +cmake -B -G Ninja -DTSC_DIR=/cmake/modules -DLLBuild_DIR=/cmake/modules -DYams_DIR=/cmake/modules -DArgumentParser_DIR= cmake --build ``` diff --git a/Sources/swift-help/CMakeLists.txt b/Sources/swift-help/CMakeLists.txt index 5be830c37..24917fb35 100644 --- a/Sources/swift-help/CMakeLists.txt +++ b/Sources/swift-help/CMakeLists.txt @@ -9,5 +9,6 @@ add_executable(swift-help main.swift) target_link_libraries(swift-help PUBLIC - SwiftOptions) + SwiftOptions + ArgumentParser) diff --git a/Sources/swift-help/main.swift b/Sources/swift-help/main.swift index 6b9449f2d..7f2fe7a9b 100644 --- a/Sources/swift-help/main.swift +++ b/Sources/swift-help/main.swift @@ -10,42 +10,24 @@ // //===----------------------------------------------------------------------===// import SwiftOptions -import TSCBasic -import TSCLibc -import TSCUtility +import ArgumentParser -extension DriverKind: StringEnumArgument { - public static var completion: ShellCompletion { .none } -} - -struct Options { - var driverKind: DriverKind = .interactive - var showHidden: Bool = false -} +extension DriverKind: ExpressibleByArgument {} -let driverOptionTable = OptionTable() -let parser = ArgumentParser(commandName: "swift help", - usage: " ", - overview: "Swift help tool", - seeAlso: nil) -let binder = ArgumentBinder() -binder.bind(option: parser.add(option: "-show-hidden", - usage: "List hidden (unsupported) options"), - to: { $0.showHidden = $1 }) -binder.bind(option: parser.add(option: "-tool", kind: DriverKind.self, - usage: "The tool to list options of"), - to: { $0.driverKind = $1 }) +struct SwiftHelp: ParsableCommand { + @ArgumentParser.Option(name: .customLong("tool", withSingleDash: true), + help: "The tool to list options of") + var tool: DriverKind = .interactive -do { - let parseResult = try parser.parse(Array(CommandLine.arguments.dropFirst())) - var options = Options() - try binder.fill(parseResult: parseResult, into: &options) + @Flag(name: .customLong("show-hidden", withSingleDash: true), + help: "List hidden (unsupported) options") + var showHidden: Bool = false - // Print the option table. - driverOptionTable.printHelp(driverKind: options.driverKind, - includeHidden: options.showHidden) -} catch { - stderrStream <<< "error: " <<< error.localizedDescription - stderrStream.flush() - exit(EXIT_FAILURE) + func run() throws { + let driverOptionTable = OptionTable() + driverOptionTable.printHelp(driverKind: tool, includeHidden: showHidden) + } } + +// SwiftPM executables don't support @main. +SwiftHelp.main()