File: make-single-file-spm

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (228 lines) | stat: -rwxr-xr-x 6,093 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is part of the SwiftNIO open source project
##
## Copyright (c) 2019 Apple Inc. and the SwiftNIO project authors
## Licensed under Apache License v2.0
##
## See LICENSE.txt for license information
## See CONTRIBUTORS.txt for the list of SwiftNIO project authors
##
## SPDX-License-Identifier: Apache-2.0
##
##===----------------------------------------------------------------------===##

set -eu
here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

function setup_swiftpm_package() {
    destination="$1"
    main_module_name="$2"
    shift; shift

    modules=()
    dependencies=()
    dep_mods=()

    for module in "$@"; do
        shift
        if [[ "$module" == "--" ]]; then
            break
        fi
        modules+=( "$module" )
    done

    for dependency in "$@"; do
        shift
        if [[ "$dependency" == "--" ]]; then
            break
        fi
        dependencies+=( "$dependency" )
    done

    for dep_mod in "$@"; do
        shift
        if [[ "$dep_mod" == "--" ]]; then
            break
        fi
        dep_mods+=( "$dep_mod" )
    done

    cd "$destination"
    cat > Package.swift <<"EOF"
// swift-tools-version:5.1
import PackageDescription

var targets: [PackageDescription.Target] = [
EOF

    mods_before=()
    if [[ ${#modules} -gt 0 ]]; then
        for module in "${modules[@]}"; do
            echo "    .target(name: \"$module\", dependencies: [" >> Package.swift
            if [[ ${#mods_before} -gt 0 ]]; then
                for inner_module in "${mods_before[@]}"; do
                    echo "\"$inner_module\", " >> Package.swift
                done
            fi
            echo "])," >> Package.swift
            mods_before+=( "$module" )
        done
    fi

    echo "    .target(name: \"$main_module_name\", dependencies: [" >> Package.swift
    if [[ ${#modules} -gt 0 ]]; then
        for module in "${modules[@]}"; do
            echo "\"$module\", " >> Package.swift
        done
    fi
    if [[ ${#dep_mods} -gt 0 ]]; then
        for module in "${dep_mods[@]}"; do
            echo "\"$module\", " >> Package.swift
        done
    fi
    echo "])]" >> Package.swift
    cat >> Package.swift <<EOF
let package = Package(
    name: "$main_module_name",
    products: [
        .executable(name: "$main_module_name", targets: ["$main_module_name"])
    ],
    dependencies: [
EOF

    if [[ "${#dependencies}" -gt 0 ]]; then
        for dependency in "${dependencies[@]}"; do
            echo "$dependency" >> Package.swift
        done
    fi

    cat >> Package.swift <<EOF
    ],
    targets: targets
)
EOF
}

function usage() {
    echo >&2 "Usage: $0 FILE COMMAND"
    echo >&2
    echo >&2 "COMMANDs:"
    echo >&2 "  xcode # Open this project in Xcode"
    echo >&2 "  mallocs # Show the malloc aggregation for running this project"
    echo >&2 "  build # Build this project"
    echo >&2 "  lldb # Compile and open project in lldb"
    echo >&2 "  run # Run this project"
    echo >&2
    echo >&2 "FILE format example:"
    echo >&2
    echo >&2 "// DEPENDENCY: https://github.com/apple/swift-nio.git 1.0.0 NIO NIOHTTP1"
    echo >&2 "// ^^^ this indicates a dependency"
    echo >&2 "// this is code in the main module"
    echo >&2
    echo >&2 "import NIO"
    echo >&2 "import Foo"
    echo >&2
    echo >&2 "print(Foo.hello)"
    echo >&2
    echo >&2 "// MODULE: Foo"
    echo >&2 "// everything here is now in module Foo"
    echo >&2
    echo >&2 "public let hello = \"Hello World\""
}

if [[ $# -lt 2 ]]; then
    usage
    exit 1
fi

destination=$(mktemp -d /tmp/test_package_XXXXXX)
file="$1"
command="$2"
shift; shift

main_module_name="TestApp"
mkdir -p "$destination/Sources/$main_module_name"
current_module_file="$destination/Sources/$main_module_name/main.swift"
current_module_name="$main_module_name"
all_modules=()
all_dependencies=()
all_dependency_modules=()
number_of_lines=0

while IFS="" read -r line; do
    if [[ "$line" =~ ^//\ MODULE:\ (.*)$ ]]; then
        module=${BASH_REMATCH[1]}

        all_modules+=( "$module" )
        mkdir -p "$destination/Sources/$module"
        current_module_file="$destination/Sources/$module/module.swift"
        for (( i=0; i <= number_of_lines; i++ )); do
            echo >> "$current_module_file"
        done
    elif [[ "$line" =~ ^//\ DEPENDENCY:\ ([^ ]+)\ ([^ ]+)\ (.*)$ ]]; then
        url=${BASH_REMATCH[1]}
        version=${BASH_REMATCH[2]}
        dep_mods=( ${BASH_REMATCH[3]} )
        echo "dependency $url $version, modules: ${dep_mods[*]}"
        all_dependencies+=( ".package(url: \"$url\", from: \"$version\"), " )
        all_dependency_modules+=( ${dep_mods[@]} )
    else
        echo "$line" >> "$current_module_file"
    fi
    number_of_lines=$(( number_of_lines + 1 ))
done < "$file"

echo "all extra modules: ${all_modules[@]+"${all_modules[@]}"}"
setup_swiftpm_package "$destination" \
    "$main_module_name" \
    "${all_modules[@]+"${all_modules[@]}"}" \
    -- \
    "${all_dependencies[@]+"${all_dependencies[@]}"}" \
    -- \
    "${all_dependency_modules[@]+"${all_dependency_modules[@]}"}"

cd "$destination"
swift package dump-package > /dev/null
echo "SwiftPM package in:"
echo "  $destination"
build_mode=release
binary="$destination/.build/$build_mode/$main_module_name"
echo "  $binary"

function compile() {
    swift build -c "$build_mode" "$@"
}

case "$command" in
    xcode)
        xed .
        ;;
    xcodeproj)
        swift package generate-xcodeproj
        xed "$main_module_name.xcodeproj"
        ;;
    run)
        compile "$@"
        swift run -c "$build_mode" "$main_module_name" "$@"
        ;;
    build)
        compile "$@"
        ;;
    hopper)
        compile "$@"
        hopperv4 -l Mach-O -e "$binary"
        ;;
    lldb)
        compile "$@"
        lldb "$binary"
        ;;
    mallocs)
        compile "$@"
        sudo  "$here/malloc-aggregation.d" -c "$binary"
        ;;
    *)
        echo "ERROR: unknown command $command"
        ;;
esac