Swift: rename autobuilder. NFC

This commit is contained in:
Alex Denisov
2023-08-31 08:12:52 +02:00
parent 1159508e4f
commit 803adae9c6
29 changed files with 25 additions and 24 deletions

View File

@@ -0,0 +1,19 @@
load("//swift:rules.bzl", "swift_cc_binary")
swift_cc_binary(
name = "swift-autobuilder",
srcs = glob([
"*.cpp",
"*.h",
]),
linkopts = [
"-lxml2",
"-framework CoreFoundation",
],
target_compatible_with = ["@platforms//os:macos"],
visibility = ["//swift:__subpackages__"],
deps = [
"//swift/logging",
"@absl//absl/strings",
],
)

View File

@@ -0,0 +1,118 @@
#include "swift/swift-autobuilder/BuildRunner.h"
#include <vector>
#include <iostream>
#include <spawn.h>
#include "absl/strings/str_join.h"
#include "swift/logging/SwiftLogging.h"
#include "swift/swift-autobuilder/CustomizingBuildLink.h"
constexpr codeql::SwiftDiagnostic buildCommandFailed{
.id = "build-command-failed",
.name = "Detected build command failed",
.action = "Set up a [manual build command][1] or [check the logs of the autobuild step][2].\n"
"\n[1]: " MANUAL_BUILD_COMMAND_HELP_LINK "\n[2]: " CHECK_LOGS_HELP_LINK};
static codeql::Logger& logger() {
static codeql::Logger ret{"build"};
return ret;
}
static int waitpid_status(pid_t child) {
int status;
while (waitpid(child, &status, 0) == -1) {
if (errno != EINTR) break;
}
return status;
}
extern char** environ;
static bool exec(const std::vector<std::string>& argv) {
const char** c_argv = (const char**)calloc(argv.size() + 1, sizeof(char*));
for (size_t i = 0; i < argv.size(); i++) {
c_argv[i] = argv[i].c_str();
}
c_argv[argv.size()] = nullptr;
pid_t pid = 0;
if (posix_spawn(&pid, argv.front().c_str(), nullptr, nullptr, (char* const*)c_argv, environ) !=
0) {
std::cerr << "[xcode autobuilder] posix_spawn failed: " << strerror(errno) << "\n";
free(c_argv);
return false;
}
free(c_argv);
int status = waitpid_status(pid);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
return false;
}
return true;
}
static bool run_build_command(const std::vector<std::string>& argv, bool dryRun) {
if (dryRun) {
std::cout << absl::StrJoin(argv, " ") << "\n";
} else {
if (!exec(argv)) {
DIAGNOSE_ERROR(buildCommandFailed,
"`autobuild` failed to run the build command:\n\n```\n{}\n```",
absl::StrJoin(argv, " "));
return false;
}
}
return true;
}
bool buildXcodeTarget(const XcodeTarget& target, bool dryRun) {
std::vector<std::string> argv({"/usr/bin/xcodebuild", "build"});
if (!target.workspace.empty()) {
argv.push_back("-workspace");
argv.push_back(target.workspace);
argv.push_back("-scheme");
} else {
argv.push_back("-project");
argv.push_back(target.project);
argv.push_back("-target");
}
argv.push_back(target.name);
argv.push_back("CODE_SIGNING_REQUIRED=NO");
argv.push_back("CODE_SIGNING_ALLOWED=NO");
return run_build_command(argv, dryRun);
}
bool buildSwiftPackage(const std::filesystem::path& packageFile, bool dryRun) {
std::vector<std::string> argv(
{"/usr/bin/swift", "build", "--package-path", packageFile.parent_path()});
return run_build_command(argv, dryRun);
}
static void pod_install(const std::string& pod, const std::filesystem::path& podfile, bool dryRun) {
std::vector<std::string> argv(
{pod, "install", "--project-directory=" + podfile.parent_path().string()});
run_build_command(argv, dryRun);
}
static void carthage_install(const std::string& carthage,
const std::filesystem::path& podfile,
bool dryRun) {
std::vector<std::string> argv(
{carthage, "bootstrap", "--project-directory", podfile.parent_path()});
run_build_command(argv, dryRun);
}
void installDependencies(const ProjectStructure& target, bool dryRun) {
auto pod = std::string(getenv("CODEQL_SWIFT_POD_EXEC") ?: "");
auto carthage = std::string(getenv("CODEQL_SWIFT_CARTHAGE_EXEC") ?: "");
if (!pod.empty() && !target.podfiles.empty()) {
for (auto& podfile : target.podfiles) {
pod_install(pod, podfile, dryRun);
}
}
if (!carthage.empty() && !target.cartfiles.empty()) {
for (auto& cartfile : target.cartfiles) {
carthage_install(carthage, cartfile, dryRun);
}
}
}

View File

@@ -0,0 +1,9 @@
#pragma once
#include "swift/swift-autobuilder/XcodeTarget.h"
#include "swift/swift-autobuilder/ProjectParser.h"
#include <filesystem>
void installDependencies(const ProjectStructure& target, bool dryRun);
bool buildXcodeTarget(const XcodeTarget& target, bool dryRun);
bool buildSwiftPackage(const std::filesystem::path& packageFile, bool dryRun);

View File

@@ -0,0 +1,41 @@
#include "swift/swift-autobuilder/CFHelpers.h"
#include <iostream>
typedef CFTypeID (*cf_get_type_id)();
template <typename CFType, cf_get_type_id get_type_id>
CFType cf_cast(const void* ptr) {
if (!ptr) {
return nullptr;
}
if (CFGetTypeID(ptr) != get_type_id()) {
std::cerr << "Unexpected type: ";
CFShow(ptr);
abort();
}
return static_cast<CFType>(ptr);
}
CFStringRef cf_string_ref(const void* ptr) {
return cf_cast<CFStringRef, CFStringGetTypeID>(ptr);
}
CFArrayRef cf_array_ref(const void* ptr) {
return cf_cast<CFArrayRef, CFArrayGetTypeID>(ptr);
}
CFDictionaryRef cf_dictionary_ref(const void* ptr) {
return cf_cast<CFDictionaryRef, CFDictionaryGetTypeID>(ptr);
}
std::string stringValueForKey(CFDictionaryRef dict, CFStringRef key) {
auto cfValue = cf_string_ref(CFDictionaryGetValue(dict, key));
if (cfValue) {
const int bufferSize = 256;
char buf[bufferSize];
if (CFStringGetCString(cfValue, buf, bufferSize, kCFStringEncodingUTF8)) {
return {buf};
}
}
return {};
}

View File

@@ -0,0 +1,24 @@
#pragma once
#include <CoreFoundation/CoreFoundation.h>
#include <string>
#include <vector>
CFStringRef cf_string_ref(const void* ptr);
CFArrayRef cf_array_ref(const void* ptr);
CFDictionaryRef cf_dictionary_ref(const void* ptr);
std::string stringValueForKey(CFDictionaryRef dict, CFStringRef key);
struct CFKeyValues {
static CFKeyValues fromDictionary(CFDictionaryRef dict) {
auto size = CFDictionaryGetCount(dict);
CFKeyValues ret(size);
CFDictionaryGetKeysAndValues(dict, ret.keys.data(), ret.values.data());
return ret;
}
explicit CFKeyValues(size_t size) : size(size), keys(size), values(size) {}
size_t size;
std::vector<const void*> keys;
std::vector<const void*> values;
};

View File

@@ -0,0 +1,12 @@
#include <string_view>
#include "swift/logging/SwiftDiagnostics.h"
#define MANUAL_BUILD_COMMAND_HELP_LINK \
"https://docs.github.com/en/enterprise-server/code-security/code-scanning/" \
"automatically-scanning-your-code-for-vulnerabilities-and-errors/" \
"configuring-the-codeql-workflow-for-compiled-languages#adding-build-steps-for-a-compiled-" \
"language"
#define CHECK_LOGS_HELP_LINK \
"https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/" \
"using-workflow-run-logs"

View File

@@ -0,0 +1,293 @@
#include "swift/swift-autobuilder/ProjectParser.h"
#include <array>
#include <iostream>
#include <filesystem>
#include <unordered_map>
#include <unordered_set>
#include <fstream>
#include <CoreFoundation/CoreFoundation.h>
#include "swift/swift-autobuilder/XcodeWorkspaceParser.h"
#include "swift/swift-autobuilder/CFHelpers.h"
namespace fs = std::filesystem;
struct TargetData {
std::string workspace;
std::string project;
std::string type;
};
using TargetMap = std::unordered_map<std::string, CFDictionaryRef>;
using DependencyMap = std::unordered_map<std::string, std::vector<std::string>>;
using FileMap =
std::unordered_map<std::string, std::vector<std::pair<std::string, CFDictionaryRef>>>;
static size_t totalFilesCount(const std::string& target,
const DependencyMap& dependencies,
const FileMap& buildFiles) {
size_t sum = buildFiles.at(target).size();
for (auto& dep : dependencies.at(target)) {
sum += totalFilesCount(dep, dependencies, buildFiles);
}
return sum;
}
static bool objectIsTarget(CFDictionaryRef object) {
auto isa = cf_string_ref(CFDictionaryGetValue(object, CFSTR("isa")));
if (isa) {
for (auto target :
{CFSTR("PBXAggregateTarget"), CFSTR("PBXNativeTarget"), CFSTR("PBXLegacyTarget")}) {
if (CFStringCompare(isa, target, 0) == kCFCompareEqualTo) {
return true;
}
}
}
return false;
}
static void mapTargetsToSourceFiles(CFDictionaryRef objects,
std::unordered_map<std::string, size_t>& fileCounts) {
TargetMap targets;
DependencyMap dependencies;
FileMap buildFiles;
auto kv = CFKeyValues::fromDictionary(objects);
for (size_t i = 0; i < kv.size; i++) {
auto object = cf_dictionary_ref(kv.values[i]);
if (objectIsTarget(object)) {
auto name = stringValueForKey(object, CFSTR("name"));
dependencies[name] = {};
buildFiles[name] = {};
targets.emplace(name, object);
}
}
for (auto& [targetName, targetObject] : targets) {
auto deps = cf_array_ref(CFDictionaryGetValue(targetObject, CFSTR("dependencies")));
auto size = CFArrayGetCount(deps);
for (CFIndex i = 0; i < size; i++) {
auto dependencyID = cf_string_ref(CFArrayGetValueAtIndex(deps, i));
auto dependency = cf_dictionary_ref(CFDictionaryGetValue(objects, dependencyID));
auto targetID = cf_string_ref(CFDictionaryGetValue(dependency, CFSTR("target")));
if (!targetID) {
// Skipping non-targets (e.g., productRef)
continue;
}
auto targetDependency = cf_dictionary_ref(CFDictionaryGetValue(objects, targetID));
auto dependencyName = stringValueForKey(targetDependency, CFSTR("name"));
if (!dependencyName.empty()) {
dependencies[targetName].push_back(dependencyName);
}
}
}
for (auto& [targetName, targetObject] : targets) {
auto buildPhases = cf_array_ref(CFDictionaryGetValue(targetObject, CFSTR("buildPhases")));
auto buildPhaseCount = CFArrayGetCount(buildPhases);
for (CFIndex buildPhaseIndex = 0; buildPhaseIndex < buildPhaseCount; buildPhaseIndex++) {
auto buildPhaseID = cf_string_ref(CFArrayGetValueAtIndex(buildPhases, buildPhaseIndex));
auto buildPhase = cf_dictionary_ref(CFDictionaryGetValue(objects, buildPhaseID));
auto fileRefs = cf_array_ref(CFDictionaryGetValue(buildPhase, CFSTR("files")));
if (!fileRefs) {
continue;
}
auto fileRefsCount = CFArrayGetCount(fileRefs);
for (CFIndex fileRefIndex = 0; fileRefIndex < fileRefsCount; fileRefIndex++) {
auto fileRefID = cf_string_ref(CFArrayGetValueAtIndex(fileRefs, fileRefIndex));
auto fileRef = cf_dictionary_ref(CFDictionaryGetValue(objects, fileRefID));
auto fileID = cf_string_ref(CFDictionaryGetValue(fileRef, CFSTR("fileRef")));
if (!fileID) {
// FileRef is not a reference to a file (e.g., PBXBuildFile)
continue;
}
auto file = cf_dictionary_ref(CFDictionaryGetValue(objects, fileID));
if (!file) {
// Sometimes the references file belongs to another project, which is not present for
// various reasons
continue;
}
auto isa = stringValueForKey(file, CFSTR("isa"));
if (isa != "PBXFileReference") {
// Skipping anything that is not a 'file', e.g. PBXVariantGroup
continue;
}
auto fileType = stringValueForKey(file, CFSTR("lastKnownFileType"));
auto path = stringValueForKey(file, CFSTR("path"));
if (fileType == "sourcecode.swift" && !path.empty()) {
buildFiles[targetName].emplace_back(path, file);
}
}
}
}
for (auto& [targetName, _] : targets) {
fileCounts[targetName] = totalFilesCount(targetName, dependencies, buildFiles);
}
}
static CFDictionaryRef xcodeProjectObjects(const std::string& xcodeProject) {
auto allocator = CFAllocatorGetDefault();
auto pbxproj = fs::path(xcodeProject) / "project.pbxproj";
if (!fs::exists(pbxproj)) {
return CFDictionaryCreate(allocator, nullptr, nullptr, 0, nullptr, nullptr);
}
std::ifstream ifs(pbxproj, std::ios::in);
std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
auto data = CFDataCreate(allocator, reinterpret_cast<UInt8*>(content.data()), content.size());
CFErrorRef error = nullptr;
auto plist = CFPropertyListCreateWithData(allocator, data, 0, nullptr, &error);
if (error) {
std::cerr << "[xcode autobuilder] Cannot read Xcode project: ";
CFShow(error);
std::cerr << ": " << pbxproj << "\n";
return CFDictionaryCreate(allocator, nullptr, nullptr, 0, nullptr, nullptr);
}
return cf_dictionary_ref(CFDictionaryGetValue((CFDictionaryRef)plist, CFSTR("objects")));
}
// Maps each target to the number of Swift source files it contains transitively
static std::unordered_map<std::string, size_t> mapTargetsToSourceFiles(
const std::unordered_map<std::string, std::vector<std::string>>& workspaces) {
std::unordered_map<std::string, size_t> fileCounts;
for (auto& [workspace, projects] : workspaces) {
// All targets/dependencies should be resolved in the context of the same workspace
// As different projects in the same workspace may reference each other for dependencies
auto allocator = CFAllocatorGetDefault();
auto allObjects = CFDictionaryCreateMutable(allocator, 0, nullptr, nullptr);
for (auto& project : projects) {
CFDictionaryRef objects = xcodeProjectObjects(project);
auto kv = CFKeyValues::fromDictionary(objects);
for (size_t i = 0; i < kv.size; i++) {
CFDictionaryAddValue(allObjects, kv.keys[i], kv.values[i]);
}
}
mapTargetsToSourceFiles(allObjects, fileCounts);
}
return fileCounts;
}
static std::vector<std::pair<std::string, std::string>> readTargets(const std::string& project) {
auto objects = xcodeProjectObjects(project);
std::vector<std::pair<std::string, std::string>> targets;
auto kv = CFKeyValues::fromDictionary(objects);
for (size_t i = 0; i < kv.size; i++) {
auto object = (CFDictionaryRef)kv.values[i];
if (objectIsTarget(object)) {
auto name = stringValueForKey(object, CFSTR("name"));
auto type = stringValueForKey(object, CFSTR("productType"));
targets.emplace_back(name, type.empty() ? "<unknown_target_type>" : type);
}
}
return targets;
}
static std::unordered_map<std::string, TargetData> mapTargetsToWorkspace(
const std::unordered_map<std::string, std::vector<std::string>>& workspaces) {
std::unordered_map<std::string, TargetData> targetMapping;
for (auto& [workspace, projects] : workspaces) {
for (auto& project : projects) {
auto targets = readTargets(project);
for (auto& [target, type] : targets) {
targetMapping[target] = TargetData{workspace, project, type};
}
}
}
return targetMapping;
}
struct ProjectFiles {
std::vector<fs::path> xcodeFiles;
std::vector<fs::path> packageFiles;
std::vector<fs::path> podfiles;
std::vector<fs::path> cartfiles;
};
static ProjectFiles scanWorkingDir(const std::string& workingDir) {
ProjectFiles structure;
fs::path workDir(workingDir);
std::vector<fs::path> files;
auto end = fs::recursive_directory_iterator();
for (auto it = fs::recursive_directory_iterator(workDir); it != end; ++it) {
const auto& p = it->path();
if (p.filename() == "Package.swift") {
structure.packageFiles.push_back(p);
continue;
}
if (p.filename() == "Podfile") {
structure.podfiles.push_back(p);
continue;
}
if (p.filename() == "Cartfile" || p.filename() == "Cartfile.private") {
structure.cartfiles.push_back(p);
continue;
}
if (!it->is_directory()) {
continue;
}
if (p.filename() == "DerivedData" || p.filename() == ".git" || p.filename() == "build") {
// Skip these folders
it.disable_recursion_pending();
continue;
}
if (p.extension() == ".xcodeproj" || p.extension() == ".xcworkspace") {
structure.xcodeFiles.push_back(p);
}
}
return structure;
}
static std::unordered_map<std::string, std::vector<std::string>> collectWorkspaces(
const ProjectFiles& projectFiles) {
// Here we are collecting list of all workspaces and Xcode projects corresponding to them
// Projects without workspaces go into the same "empty-workspace" bucket
std::unordered_map<std::string, std::vector<std::string>> workspaces;
std::unordered_set<std::string> projectsBelongingToWorkspace;
for (auto& path : projectFiles.xcodeFiles) {
if (path.extension() == ".xcworkspace") {
auto projects = readProjectsFromWorkspace(path.string());
for (auto& project : projects) {
projectsBelongingToWorkspace.insert(project.string());
workspaces[path.string()].push_back(project.string());
}
}
}
// Collect all projects not belonging to any workspace into a separate empty bucket
for (auto& path : projectFiles.xcodeFiles) {
if (path.extension() == ".xcodeproj") {
if (projectsBelongingToWorkspace.contains(path.string())) {
continue;
}
workspaces[std::string()].push_back(path.string());
}
}
return workspaces;
}
ProjectStructure scanProjectStructure(const std::string& workingDir) {
ProjectStructure ret;
// Getting a list of workspaces and the project that belong to them
auto projectFiles = scanWorkingDir(workingDir);
auto workspaces = collectWorkspaces(projectFiles);
ret.xcodeEncountered = !workspaces.empty();
ret.swiftPackages = std::move(projectFiles.packageFiles);
ret.podfiles = std::move(projectFiles.podfiles);
ret.cartfiles = std::move(projectFiles.cartfiles);
if (!ret.xcodeEncountered) {
return ret;
}
// Mapping each target to the workspace/project it belongs to
auto targetMapping = mapTargetsToWorkspace(workspaces);
// Mapping each target to the number of source files it contains
auto targetFilesMapping = mapTargetsToSourceFiles(workspaces);
for (auto& [targetName, data] : targetMapping) {
ret.xcodeTargets.push_back(XcodeTarget{data.workspace, data.project, targetName, data.type,
targetFilesMapping[targetName]});
}
return ret;
}

View File

@@ -0,0 +1,19 @@
#pragma once
#include "swift/swift-autobuilder/XcodeTarget.h"
#include <vector>
#include <string>
#include <filesystem>
struct ProjectStructure {
std::vector<XcodeTarget> xcodeTargets;
bool xcodeEncountered;
// Swift Package Manager support
std::vector<std::filesystem::path> swiftPackages;
// CocoaPods support
std::vector<std::filesystem::path> podfiles;
// Carthage support
std::vector<std::filesystem::path> cartfiles;
};
ProjectStructure scanProjectStructure(const std::string& workingDir);

View File

@@ -0,0 +1,14 @@
#pragma once
#include <string>
#include <binlog/adapt_struct.hpp>
struct XcodeTarget {
std::string workspace;
std::string project;
std::string name;
std::string type;
size_t fileCount;
};
BINLOG_ADAPT_STRUCT(XcodeTarget, workspace, project, name, type, fileCount);

View File

@@ -0,0 +1,62 @@
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <iostream>
#include "swift/swift-autobuilder/XcodeWorkspaceParser.h"
/*
Extracts FileRef locations from an XML of the following form:
<?xml version="1.0" encoding="UTF-8"?>
<Workspace version = "1.0">
<FileRef location = "group:PathToProject.xcodeproj">
</FileRef>
</Workspace>
*/
std::vector<fs::path> readProjectsFromWorkspace(const std::string& workspace) {
fs::path workspacePath(workspace);
auto workspaceData = workspacePath / "contents.xcworkspacedata";
if (!fs::exists(workspaceData)) {
std::cerr << "[xcode autobuilder] Cannot read workspace: file does not exist '" << workspaceData
<< "\n";
return {};
}
auto xmlDoc = xmlParseFile(workspaceData.c_str());
if (!xmlDoc) {
std::cerr << "[xcode autobuilder] Cannot parse workspace file '" << workspaceData << "\n";
return {};
}
auto root = xmlDocGetRootElement(xmlDoc);
auto first = xmlFirstElementChild(root);
auto last = xmlLastElementChild(root);
std::vector<xmlNodePtr> children;
for (; first != last; first = xmlNextElementSibling(first)) {
children.push_back(first);
}
children.push_back(first);
std::vector<std::string> locations;
for (auto child : children) {
if (child) {
auto prop = xmlGetProp(child, xmlCharStrdup("location"));
if (prop) {
locations.emplace_back((char*)prop);
}
}
}
xmlFreeDoc(xmlDoc);
std::vector<fs::path> projects;
for (auto& location : locations) {
auto colon = location.find(':');
if (colon != std::string::npos) {
auto project = location.substr(colon + 1);
if (!project.empty()) {
auto fullPath = workspacePath.parent_path() / project;
projects.push_back(fullPath);
}
}
}
return projects;
}

View File

@@ -0,0 +1,9 @@
#pragma once
#include <string>
#include <vector>
#include <filesystem>
namespace fs = std::filesystem;
std::vector<fs::path> readProjectsFromWorkspace(const std::string& workspace);

View File

@@ -0,0 +1,125 @@
#include <iostream>
#include <vector>
#include <filesystem>
#include "swift/swift-autobuilder/XcodeTarget.h"
#include "swift/swift-autobuilder/BuildRunner.h"
#include "swift/swift-autobuilder/ProjectParser.h"
#include "swift/logging/SwiftLogging.h"
#include "swift/swift-autobuilder/CustomizingBuildLink.h"
static constexpr std::string_view uiTest = "com.apple.product-type.bundle.ui-testing";
static constexpr std::string_view unitTest = "com.apple.product-type.bundle.unit-test";
static constexpr std::string_view unknownType = "<unknown_target_type>";
const std::string_view codeql::programName = "autobuilder";
constexpr codeql::SwiftDiagnostic noProjectFound{
.id = "no-project-found",
.name = "No Xcode project or workspace found",
.action = "Set up a [manual build command][1].\n\n[1]: " MANUAL_BUILD_COMMAND_HELP_LINK};
constexpr codeql::SwiftDiagnostic noSwiftTarget{
.id = "no-swift-target",
.name = "No Swift compilation target found",
.action = "To analyze a custom set of source files, set up a [manual build "
"command][1].\n\n[1]: " MANUAL_BUILD_COMMAND_HELP_LINK};
static codeql::Logger& logger() {
static codeql::Logger ret{"main"};
return ret;
}
struct CLIArgs {
std::string workingDir;
bool dryRun;
};
static bool endsWith(std::string_view s, std::string_view suffix) {
return s.size() >= suffix.size() && s.substr(s.size() - suffix.size()) == suffix;
}
static bool isNonSwiftOrTestTarget(const XcodeTarget& t) {
return t.fileCount == 0 || t.type == uiTest || t.type == unitTest ||
// unknown target types can be legitimate, let's do a name-based heuristic then
(t.type == unknownType && (endsWith(t.name, "Tests") || endsWith(t.name, "Test")));
}
static void buildSwiftPackages(const std::vector<std::filesystem::path>& swiftPackages,
bool dryRun) {
auto any_successful =
std::any_of(std::begin(swiftPackages), std::end(swiftPackages), [&](auto& packageFile) {
LOG_INFO("Building Swift package: {}", packageFile);
return buildSwiftPackage(packageFile, dryRun);
});
if (!any_successful) {
codeql::Log::flush();
exit(1);
}
}
static bool autobuild(const CLIArgs& args) {
auto structure = scanProjectStructure(args.workingDir);
auto& xcodeTargets = structure.xcodeTargets;
auto& swiftPackages = structure.swiftPackages;
for (const auto& t : xcodeTargets) {
LOG_INFO("{}", t);
}
// Filter out targets that are tests or have no swift source files
xcodeTargets.erase(
std::remove_if(std::begin(xcodeTargets), std::end(xcodeTargets), isNonSwiftOrTestTarget),
std::end(xcodeTargets));
// Sort targets by the amount of files in each
std::sort(std::begin(xcodeTargets), std::end(xcodeTargets),
[](XcodeTarget& lhs, XcodeTarget& rhs) { return lhs.fileCount > rhs.fileCount; });
if (structure.xcodeEncountered && xcodeTargets.empty() && swiftPackages.empty()) {
// Report error only when there are no Xcode targets and no Swift packages
DIAGNOSE_ERROR(noSwiftTarget, "All targets found within Xcode projects or workspaces either "
"contain no Swift source files, or are tests.");
return false;
} else if (!structure.xcodeEncountered && swiftPackages.empty()) {
DIAGNOSE_ERROR(
noProjectFound,
"`autobuild` detected neither an Xcode project or workspace, nor a Swift package");
return false;
} else if (!xcodeTargets.empty()) {
LOG_INFO("Building Xcode target: {}", xcodeTargets.front());
installDependencies(structure, args.dryRun);
auto buildSucceeded = buildXcodeTarget(xcodeTargets.front(), args.dryRun);
// If build failed, try to build Swift packages
if (!buildSucceeded && !swiftPackages.empty()) {
buildSwiftPackages(swiftPackages, args.dryRun);
}
return buildSucceeded;
} else if (!swiftPackages.empty()) {
buildSwiftPackages(swiftPackages, args.dryRun);
}
return true;
}
static CLIArgs parseCLIArgs(int argc, char** argv) {
bool dryRun = false;
std::string path;
if (argc == 3) {
path = argv[2];
if (std::string(argv[1]) == "-dry-run") {
dryRun = true;
}
} else if (argc == 2) {
path = argv[1];
} else {
path = std::filesystem::current_path();
}
return CLIArgs{path, dryRun};
}
int main(int argc, char** argv) {
auto args = parseCLIArgs(argc, argv);
auto success = autobuild(args);
codeql::Log::flush();
if (!success) {
return 1;
}
return 0;
}

View File

@@ -0,0 +1,4 @@
xcuserdata
build
*.actual
IDEWorkspaceChecks.plist

View File

@@ -0,0 +1,28 @@
[
py_test(
name = test_dir + "-test",
size = "small",
srcs = ["autobuild_tester.py"],
args = [
"$(location //swift/swift-autobuilder)",
"$(location %s)" % test_dir,
],
data = [
"//swift/swift-autobuilder",
test_dir,
] + glob([test_dir + "/**/*"]),
main = "autobuild_tester.py",
)
for test_dir in glob(
["*"],
exclude = [
"*.*",
".*",
],
exclude_directories = 0,
)
]
test_suite(
name = "tests",
)

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env python3
import sys
import subprocess
import pathlib
import os
autobuilder = pathlib.Path(sys.argv[1]).absolute()
test_dir = pathlib.Path(sys.argv[2])
expected = test_dir / 'commands.expected'
actual = pathlib.Path('commands.actual')
os.environ["CODEQL_EXTRACTOR_SWIFT_LOG_LEVELS"] = "text:no_logs,diagnostics:no_logs,console:info"
with open(actual, 'w') as out:
ret = subprocess.run([str(autobuilder), '-dry-run', '.'], stdout=subprocess.PIPE,
check=True, cwd=test_dir, text=True)
for line in ret.stdout.splitlines():
out.write(line.rstrip())
out.write('\n')
subprocess.run(['diff', '-u', expected, actual], check=True)
print("SUCCESS!")

View File

@@ -0,0 +1 @@
/usr/bin/xcodebuild build -project ./hello-autobuilder.xcodeproj -target hello-autobuilder CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO

View File

@@ -0,0 +1,361 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
461725B129002F56000C6B39 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461725B029002F56000C6B39 /* AppDelegate.swift */; };
461725B329002F56000C6B39 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461725B229002F56000C6B39 /* SceneDelegate.swift */; };
461725B529002F56000C6B39 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461725B429002F56000C6B39 /* ViewController.swift */; };
461725B829002F56000C6B39 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 461725B629002F56000C6B39 /* Main.storyboard */; };
461725BA29002F59000C6B39 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 461725B929002F59000C6B39 /* Assets.xcassets */; };
461725BD29002F59000C6B39 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 461725BB29002F59000C6B39 /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
461725AD29002F56000C6B39 /* hello-autobuilder.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-autobuilder.app"; sourceTree = BUILT_PRODUCTS_DIR; };
461725B029002F56000C6B39 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
461725B229002F56000C6B39 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
461725B429002F56000C6B39 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
461725B729002F56000C6B39 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
461725B929002F59000C6B39 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
461725BC29002F59000C6B39 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
461725BE29002F59000C6B39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
461725AA29002F56000C6B39 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
461725A429002F56000C6B39 = {
isa = PBXGroup;
children = (
461725AF29002F56000C6B39 /* hello-autobuilder */,
461725AE29002F56000C6B39 /* Products */,
);
sourceTree = "<group>";
};
461725AE29002F56000C6B39 /* Products */ = {
isa = PBXGroup;
children = (
461725AD29002F56000C6B39 /* hello-autobuilder.app */,
);
name = Products;
sourceTree = "<group>";
};
461725AF29002F56000C6B39 /* hello-autobuilder */ = {
isa = PBXGroup;
children = (
461725B029002F56000C6B39 /* AppDelegate.swift */,
461725B229002F56000C6B39 /* SceneDelegate.swift */,
461725B429002F56000C6B39 /* ViewController.swift */,
461725B629002F56000C6B39 /* Main.storyboard */,
461725B929002F59000C6B39 /* Assets.xcassets */,
461725BB29002F59000C6B39 /* LaunchScreen.storyboard */,
461725BE29002F59000C6B39 /* Info.plist */,
);
path = "hello-autobuilder";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
461725AC29002F56000C6B39 /* hello-autobuilder */ = {
isa = PBXNativeTarget;
buildConfigurationList = 461725C129002F59000C6B39 /* Build configuration list for PBXNativeTarget "hello-autobuilder" */;
buildPhases = (
461725A929002F56000C6B39 /* Sources */,
461725AA29002F56000C6B39 /* Frameworks */,
461725AB29002F56000C6B39 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "hello-autobuilder";
productName = "hello-autobuilder";
productReference = 461725AD29002F56000C6B39 /* hello-autobuilder.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
461725A529002F56000C6B39 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1400;
LastUpgradeCheck = 1400;
TargetAttributes = {
461725AC29002F56000C6B39 = {
CreatedOnToolsVersion = 14.0;
};
};
};
buildConfigurationList = 461725A829002F56000C6B39 /* Build configuration list for PBXProject "hello-autobuilder" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 461725A429002F56000C6B39;
productRefGroup = 461725AE29002F56000C6B39 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
461725AC29002F56000C6B39 /* hello-autobuilder */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
461725AB29002F56000C6B39 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
461725BD29002F59000C6B39 /* LaunchScreen.storyboard in Resources */,
461725BA29002F59000C6B39 /* Assets.xcassets in Resources */,
461725B829002F56000C6B39 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
461725A929002F56000C6B39 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
461725B529002F56000C6B39 /* ViewController.swift in Sources */,
461725B129002F56000C6B39 /* AppDelegate.swift in Sources */,
461725B329002F56000C6B39 /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
461725B629002F56000C6B39 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
461725B729002F56000C6B39 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
461725BB29002F59000C6B39 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
461725BC29002F59000C6B39 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
461725BF29002F59000C6B39 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
461725C029002F59000C6B39 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
461725C229002F59000C6B39 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "hello-autobuilder/Info.plist";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.github.hello-autobuilder";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
461725C329002F59000C6B39 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "hello-autobuilder/Info.plist";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.github.hello-autobuilder";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
461725A829002F56000C6B39 /* Build configuration list for PBXProject "hello-autobuilder" */ = {
isa = XCConfigurationList;
buildConfigurations = (
461725BF29002F59000C6B39 /* Debug */,
461725C029002F59000C6B39 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
461725C129002F59000C6B39 /* Build configuration list for PBXNativeTarget "hello-autobuilder" */ = {
isa = XCConfigurationList;
buildConfigurations = (
461725C229002F59000C6B39 /* Debug */,
461725C329002F59000C6B39 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 461725A529002F56000C6B39 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1 @@
/usr/bin/xcodebuild build -project ./Foo.xcodeproj -target FooDemo CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO

View File

@@ -0,0 +1 @@
/usr/bin/xcodebuild build -project ./hello-tests.xcodeproj -target hello-tests CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO

View File

@@ -0,0 +1,573 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
57B14B642A0A8819002820C5 /* hello_testsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B14B632A0A8819002820C5 /* hello_testsApp.swift */; };
57B14B662A0A8819002820C5 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B14B652A0A8819002820C5 /* ContentView.swift */; };
57B14B682A0A881B002820C5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 57B14B672A0A881B002820C5 /* Assets.xcassets */; };
57B14B6B2A0A881B002820C5 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 57B14B6A2A0A881B002820C5 /* Preview Assets.xcassets */; };
57B14B762A0A881B002820C5 /* hello_testsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B14B752A0A881B002820C5 /* hello_testsTests.swift */; };
57B14B802A0A881B002820C5 /* hello_testsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B14B7F2A0A881B002820C5 /* hello_testsUITests.swift */; };
57B14B822A0A881B002820C5 /* hello_testsUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B14B812A0A881B002820C5 /* hello_testsUITestsLaunchTests.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
57B14B722A0A881B002820C5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 57B14B582A0A8819002820C5 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 57B14B5F2A0A8819002820C5;
remoteInfo = "hello-tests";
};
57B14B7C2A0A881B002820C5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 57B14B582A0A8819002820C5 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 57B14B5F2A0A8819002820C5;
remoteInfo = "hello-tests";
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
57B14B602A0A8819002820C5 /* hello-tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-tests.app"; sourceTree = BUILT_PRODUCTS_DIR; };
57B14B632A0A8819002820C5 /* hello_testsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = hello_testsApp.swift; sourceTree = "<group>"; };
57B14B652A0A8819002820C5 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
57B14B672A0A881B002820C5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
57B14B6A2A0A881B002820C5 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
57B14B6C2A0A881B002820C5 /* hello_tests.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = hello_tests.entitlements; sourceTree = "<group>"; };
57B14B712A0A881B002820C5 /* hello-testsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "hello-testsTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
57B14B752A0A881B002820C5 /* hello_testsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = hello_testsTests.swift; sourceTree = "<group>"; };
57B14B7B2A0A881B002820C5 /* hello-testsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "hello-testsUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
57B14B7F2A0A881B002820C5 /* hello_testsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = hello_testsUITests.swift; sourceTree = "<group>"; };
57B14B812A0A881B002820C5 /* hello_testsUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = hello_testsUITestsLaunchTests.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
57B14B5D2A0A8819002820C5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B6E2A0A881B002820C5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B782A0A881B002820C5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
57B14B572A0A8819002820C5 = {
isa = PBXGroup;
children = (
57B14B622A0A8819002820C5 /* hello-tests */,
57B14B742A0A881B002820C5 /* hello-testsTests */,
57B14B7E2A0A881B002820C5 /* hello-testsUITests */,
57B14B612A0A8819002820C5 /* Products */,
);
sourceTree = "<group>";
};
57B14B612A0A8819002820C5 /* Products */ = {
isa = PBXGroup;
children = (
57B14B602A0A8819002820C5 /* hello-tests.app */,
57B14B712A0A881B002820C5 /* hello-testsTests.xctest */,
57B14B7B2A0A881B002820C5 /* hello-testsUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
57B14B622A0A8819002820C5 /* hello-tests */ = {
isa = PBXGroup;
children = (
57B14B632A0A8819002820C5 /* hello_testsApp.swift */,
57B14B652A0A8819002820C5 /* ContentView.swift */,
57B14B672A0A881B002820C5 /* Assets.xcassets */,
57B14B6C2A0A881B002820C5 /* hello_tests.entitlements */,
57B14B692A0A881B002820C5 /* Preview Content */,
);
path = "hello-tests";
sourceTree = "<group>";
};
57B14B692A0A881B002820C5 /* Preview Content */ = {
isa = PBXGroup;
children = (
57B14B6A2A0A881B002820C5 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
57B14B742A0A881B002820C5 /* hello-testsTests */ = {
isa = PBXGroup;
children = (
57B14B752A0A881B002820C5 /* hello_testsTests.swift */,
);
path = "hello-testsTests";
sourceTree = "<group>";
};
57B14B7E2A0A881B002820C5 /* hello-testsUITests */ = {
isa = PBXGroup;
children = (
57B14B7F2A0A881B002820C5 /* hello_testsUITests.swift */,
57B14B812A0A881B002820C5 /* hello_testsUITestsLaunchTests.swift */,
);
path = "hello-testsUITests";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
57B14B5F2A0A8819002820C5 /* hello-tests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 57B14B852A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-tests" */;
buildPhases = (
57B14B5C2A0A8819002820C5 /* Sources */,
57B14B5D2A0A8819002820C5 /* Frameworks */,
57B14B5E2A0A8819002820C5 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "hello-tests";
productName = "hello-tests";
productReference = 57B14B602A0A8819002820C5 /* hello-tests.app */;
productType = "com.apple.product-type.application";
};
57B14B702A0A881B002820C5 /* hello-testsTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 57B14B882A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-testsTests" */;
buildPhases = (
57B14B6D2A0A881B002820C5 /* Sources */,
57B14B6E2A0A881B002820C5 /* Frameworks */,
57B14B6F2A0A881B002820C5 /* Resources */,
);
buildRules = (
);
dependencies = (
57B14B732A0A881B002820C5 /* PBXTargetDependency */,
);
name = "hello-testsTests";
productName = "hello-testsTests";
productReference = 57B14B712A0A881B002820C5 /* hello-testsTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
57B14B7A2A0A881B002820C5 /* hello-testsUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 57B14B8B2A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-testsUITests" */;
buildPhases = (
57B14B772A0A881B002820C5 /* Sources */,
57B14B782A0A881B002820C5 /* Frameworks */,
57B14B792A0A881B002820C5 /* Resources */,
);
buildRules = (
);
dependencies = (
57B14B7D2A0A881B002820C5 /* PBXTargetDependency */,
);
name = "hello-testsUITests";
productName = "hello-testsUITests";
productReference = 57B14B7B2A0A881B002820C5 /* hello-testsUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
57B14B582A0A8819002820C5 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1430;
LastUpgradeCheck = 1430;
TargetAttributes = {
57B14B5F2A0A8819002820C5 = {
CreatedOnToolsVersion = 14.3;
};
57B14B702A0A881B002820C5 = {
CreatedOnToolsVersion = 14.3;
TestTargetID = 57B14B5F2A0A8819002820C5;
};
57B14B7A2A0A881B002820C5 = {
CreatedOnToolsVersion = 14.3;
TestTargetID = 57B14B5F2A0A8819002820C5;
};
};
};
buildConfigurationList = 57B14B5B2A0A8819002820C5 /* Build configuration list for PBXProject "hello-tests" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 57B14B572A0A8819002820C5;
productRefGroup = 57B14B612A0A8819002820C5 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
57B14B5F2A0A8819002820C5 /* hello-tests */,
57B14B702A0A881B002820C5 /* hello-testsTests */,
57B14B7A2A0A881B002820C5 /* hello-testsUITests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
57B14B5E2A0A8819002820C5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
57B14B6B2A0A881B002820C5 /* Preview Assets.xcassets in Resources */,
57B14B682A0A881B002820C5 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B6F2A0A881B002820C5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B792A0A881B002820C5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
57B14B5C2A0A8819002820C5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
57B14B662A0A8819002820C5 /* ContentView.swift in Sources */,
57B14B642A0A8819002820C5 /* hello_testsApp.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B6D2A0A881B002820C5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
57B14B762A0A881B002820C5 /* hello_testsTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
57B14B772A0A881B002820C5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
57B14B802A0A881B002820C5 /* hello_testsUITests.swift in Sources */,
57B14B822A0A881B002820C5 /* hello_testsUITestsLaunchTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
57B14B732A0A881B002820C5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 57B14B5F2A0A8819002820C5 /* hello-tests */;
targetProxy = 57B14B722A0A881B002820C5 /* PBXContainerItemProxy */;
};
57B14B7D2A0A881B002820C5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 57B14B5F2A0A8819002820C5 /* hello-tests */;
targetProxy = 57B14B7C2A0A881B002820C5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
57B14B832A0A881B002820C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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 = 13.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
57B14B842A0A881B002820C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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 = 13.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
57B14B862A0A881B002820C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "hello-tests/hello_tests.entitlements";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"hello-tests/Preview Content\"";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-tests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
57B14B872A0A881B002820C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "hello-tests/hello_tests.entitlements";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"hello-tests/Preview Content\"";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-tests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
57B14B892A0A881B002820C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 13.2;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-testsTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hello-tests.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hello-tests";
};
name = Debug;
};
57B14B8A2A0A881B002820C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 13.2;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-testsTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hello-tests.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hello-tests";
};
name = Release;
};
57B14B8C2A0A881B002820C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-testsUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TEST_TARGET_NAME = "hello-tests";
};
name = Debug;
};
57B14B8D2A0A881B002820C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.example.hello-testsUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TEST_TARGET_NAME = "hello-tests";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
57B14B5B2A0A8819002820C5 /* Build configuration list for PBXProject "hello-tests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
57B14B832A0A881B002820C5 /* Debug */,
57B14B842A0A881B002820C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
57B14B852A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-tests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
57B14B862A0A881B002820C5 /* Debug */,
57B14B872A0A881B002820C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
57B14B882A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-testsTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
57B14B892A0A881B002820C5 /* Debug */,
57B14B8A2A0A881B002820C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
57B14B8B2A0A881B002820C5 /* Build configuration list for PBXNativeTarget "hello-testsUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
57B14B8C2A0A881B002820C5 /* Debug */,
57B14B8D2A0A881B002820C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 57B14B582A0A8819002820C5 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:hello-workspace.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1 @@
/usr/bin/xcodebuild build -workspace ./Hello.xcworkspace -scheme hello-workspace CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO

View File

@@ -0,0 +1,361 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
4612C555290039E500FD51FB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4612C554290039E500FD51FB /* AppDelegate.swift */; };
4612C557290039E600FD51FB /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4612C556290039E600FD51FB /* SceneDelegate.swift */; };
4612C559290039E600FD51FB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4612C558290039E600FD51FB /* ViewController.swift */; };
4612C55C290039E600FD51FB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4612C55A290039E600FD51FB /* Main.storyboard */; };
4612C55E290039E700FD51FB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4612C55D290039E700FD51FB /* Assets.xcassets */; };
4612C561290039E700FD51FB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4612C55F290039E700FD51FB /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
4612C551290039E500FD51FB /* hello-workspace.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-workspace.app"; sourceTree = BUILT_PRODUCTS_DIR; };
4612C554290039E500FD51FB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
4612C556290039E600FD51FB /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
4612C558290039E600FD51FB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
4612C55B290039E600FD51FB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4612C55D290039E700FD51FB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4612C560290039E700FD51FB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
4612C562290039E700FD51FB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4612C54E290039E500FD51FB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4612C548290039E500FD51FB = {
isa = PBXGroup;
children = (
4612C553290039E500FD51FB /* hello-workspace */,
4612C552290039E500FD51FB /* Products */,
);
sourceTree = "<group>";
};
4612C552290039E500FD51FB /* Products */ = {
isa = PBXGroup;
children = (
4612C551290039E500FD51FB /* hello-workspace.app */,
);
name = Products;
sourceTree = "<group>";
};
4612C553290039E500FD51FB /* hello-workspace */ = {
isa = PBXGroup;
children = (
4612C554290039E500FD51FB /* AppDelegate.swift */,
4612C556290039E600FD51FB /* SceneDelegate.swift */,
4612C558290039E600FD51FB /* ViewController.swift */,
4612C55A290039E600FD51FB /* Main.storyboard */,
4612C55D290039E700FD51FB /* Assets.xcassets */,
4612C55F290039E700FD51FB /* LaunchScreen.storyboard */,
4612C562290039E700FD51FB /* Info.plist */,
);
path = "hello-workspace";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
4612C550290039E500FD51FB /* hello-workspace */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4612C565290039E700FD51FB /* Build configuration list for PBXNativeTarget "hello-workspace" */;
buildPhases = (
4612C54D290039E500FD51FB /* Sources */,
4612C54E290039E500FD51FB /* Frameworks */,
4612C54F290039E500FD51FB /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "hello-workspace";
productName = "hello-workspace";
productReference = 4612C551290039E500FD51FB /* hello-workspace.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
4612C549290039E500FD51FB /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1400;
LastUpgradeCheck = 1400;
TargetAttributes = {
4612C550290039E500FD51FB = {
CreatedOnToolsVersion = 14.0;
};
};
};
buildConfigurationList = 4612C54C290039E500FD51FB /* Build configuration list for PBXProject "hello-workspace" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 4612C548290039E500FD51FB;
productRefGroup = 4612C552290039E500FD51FB /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
4612C550290039E500FD51FB /* hello-workspace */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
4612C54F290039E500FD51FB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4612C561290039E700FD51FB /* LaunchScreen.storyboard in Resources */,
4612C55E290039E700FD51FB /* Assets.xcassets in Resources */,
4612C55C290039E600FD51FB /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
4612C54D290039E500FD51FB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4612C559290039E600FD51FB /* ViewController.swift in Sources */,
4612C555290039E500FD51FB /* AppDelegate.swift in Sources */,
4612C557290039E600FD51FB /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
4612C55A290039E600FD51FB /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
4612C55B290039E600FD51FB /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
4612C55F290039E700FD51FB /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
4612C560290039E700FD51FB /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
4612C563290039E700FD51FB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
4612C564290039E700FD51FB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
4612C566290039E700FD51FB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "hello-workspace/Info.plist";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.github.hello-workspace";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
4612C567290039E700FD51FB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "hello-workspace/Info.plist";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.github.hello-workspace";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4612C54C290039E500FD51FB /* Build configuration list for PBXProject "hello-workspace" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4612C563290039E700FD51FB /* Debug */,
4612C564290039E700FD51FB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4612C565290039E700FD51FB /* Build configuration list for PBXNativeTarget "hello-workspace" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4612C566290039E700FD51FB /* Debug */,
4612C567290039E700FD51FB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 4612C549290039E500FD51FB /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>