mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Swift: rename autobuilder. NFC
This commit is contained in:
19
swift/swift-autobuilder/BUILD.bazel
Normal file
19
swift/swift-autobuilder/BUILD.bazel
Normal 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",
|
||||
],
|
||||
)
|
||||
118
swift/swift-autobuilder/BuildRunner.cpp
Normal file
118
swift/swift-autobuilder/BuildRunner.cpp
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
9
swift/swift-autobuilder/BuildRunner.h
Normal file
9
swift/swift-autobuilder/BuildRunner.h
Normal 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);
|
||||
41
swift/swift-autobuilder/CFHelpers.cpp
Normal file
41
swift/swift-autobuilder/CFHelpers.cpp
Normal 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 {};
|
||||
}
|
||||
24
swift/swift-autobuilder/CFHelpers.h
Normal file
24
swift/swift-autobuilder/CFHelpers.h
Normal 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;
|
||||
};
|
||||
12
swift/swift-autobuilder/CustomizingBuildLink.h
Normal file
12
swift/swift-autobuilder/CustomizingBuildLink.h
Normal 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"
|
||||
293
swift/swift-autobuilder/ProjectParser.cpp
Normal file
293
swift/swift-autobuilder/ProjectParser.cpp
Normal 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;
|
||||
}
|
||||
19
swift/swift-autobuilder/ProjectParser.h
Normal file
19
swift/swift-autobuilder/ProjectParser.h
Normal 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);
|
||||
14
swift/swift-autobuilder/XcodeTarget.h
Normal file
14
swift/swift-autobuilder/XcodeTarget.h
Normal 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);
|
||||
62
swift/swift-autobuilder/XcodeWorkspaceParser.cpp
Normal file
62
swift/swift-autobuilder/XcodeWorkspaceParser.cpp
Normal 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;
|
||||
}
|
||||
9
swift/swift-autobuilder/XcodeWorkspaceParser.h
Normal file
9
swift/swift-autobuilder/XcodeWorkspaceParser.h
Normal 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);
|
||||
125
swift/swift-autobuilder/swift-autobuilder.cpp
Normal file
125
swift/swift-autobuilder/swift-autobuilder.cpp
Normal 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;
|
||||
}
|
||||
4
swift/swift-autobuilder/tests/.gitignore
vendored
Normal file
4
swift/swift-autobuilder/tests/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
xcuserdata
|
||||
build
|
||||
*.actual
|
||||
IDEWorkspaceChecks.plist
|
||||
28
swift/swift-autobuilder/tests/BUILD.bazel
Normal file
28
swift/swift-autobuilder/tests/BUILD.bazel
Normal 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",
|
||||
)
|
||||
25
swift/swift-autobuilder/tests/autobuild_tester.py
Executable file
25
swift/swift-autobuilder/tests/autobuild_tester.py
Executable 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!")
|
||||
@@ -0,0 +1 @@
|
||||
/usr/bin/xcodebuild build -project ./hello-autobuilder.xcodeproj -target hello-autobuilder CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
|
||||
@@ -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 */;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -0,0 +1 @@
|
||||
/usr/bin/xcodebuild build -project ./Foo.xcodeproj -target FooDemo CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
|
||||
@@ -0,0 +1 @@
|
||||
/usr/bin/xcodebuild build -project ./hello-tests.xcodeproj -target hello-tests CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
|
||||
@@ -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 */;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
7
swift/swift-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
swift/swift-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:hello-workspace.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -0,0 +1 @@
|
||||
/usr/bin/xcodebuild build -workspace ./Hello.xcworkspace -scheme hello-workspace CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
|
||||
@@ -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 */;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
Reference in New Issue
Block a user