From 0d10a300580f6548a927cc1a3cf0846916c16a53 Mon Sep 17 00:00:00 2001 From: Stephen Beitzel Date: Sat, 28 Jun 2025 16:02:35 -0700 Subject: [PATCH 1/2] Add setup.sh from NetNewsWire (MIT License) to create well-known developer settings --- ShipShape.xcodeproj/project.pbxproj | 2 ++ setup.sh | 47 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100755 setup.sh diff --git a/ShipShape.xcodeproj/project.pbxproj b/ShipShape.xcodeproj/project.pbxproj index 30b14c0..eb2a710 100644 --- a/ShipShape.xcodeproj/project.pbxproj +++ b/ShipShape.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ /* Begin PBXFileReference section */ 51616E6E2DD8EDE8007B8250 /* ShipShape.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ShipShape.app; sourceTree = BUILT_PRODUCTS_DIR; }; 517283BC2DDCD6D40064D974 /* ShipShapeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ShipShapeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C1EFDA42E10AA6800AAB949 /* setup.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = setup.sh; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -76,6 +77,7 @@ 51616E702DD8EDE8007B8250 /* ShipShape */, 517283BD2DDCD6D40064D974 /* ShipShapeTests */, 51616E6F2DD8EDE8007B8250 /* Products */, + 7C1EFDA42E10AA6800AAB949 /* setup.sh */, ); sourceTree = ""; }; diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..7f0ee78 --- /dev/null +++ b/setup.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# This file is based on the `setup.sh` script in the NetNewsWire project. +# +# It is Copyright (c) 2002-2025 Brent Simmons. +# See https://github.com/Ranchero-Software/NetNewsWire/blob/main/LICENSE + +cat << "EOF" + __ _ _ __ _ +/ _\ |__ (_)_ __ / _\ |__ __ _ _ __ ___ +\ \| '_ \| | '_ \\ \| '_ \ / _` | '_ \ / _ \ +_\ \ | | | | |_) |\ \ | | | (_| | |_) | __/ +\__/_| |_|_| .__/\__/_| |_|\__,_| .__/ \___| + |_| |_| + +EOF + +echo This script will create a SharedXcodeSettings folder and a DeveloperSettings.xcconfig file. +echo +echo We need to ask a few questions first. +echo +read -p "Press enter to get started." + + +# Get the user's Developer Team ID +echo 1. What is your Developer Team ID? You can get this from developer.apple.com. +read devTeamID + +# Get the user's Org Identifier +echo 2. What is your organisation identifier? e.g. com.developername +read devOrgName + +echo Creating SharedXcodeSettings Folder +mkdir -p ../SharedXcodeSettings + +echo Creating DeveloperSettings.xcconfig + +cat <> ../SharedXcodeSettings/DeveloperSettings.xcconfig +CODE_SIGN_IDENTITY = Mac Developer +DEVELOPMENT_TEAM = $devTeamID +CODE_SIGN_STYLE = Automatic +ORGANIZATION_IDENTIFIER = $devOrgName +DEVELOPER_ENTITLEMENTS = -dev +PROVISIONING_PROFILE_SPECIFIER = +file + +echo Done! From d96fbde66d568a5cc7eaeb279506b9dc293bb468 Mon Sep 17 00:00:00 2001 From: Stephen Beitzel Date: Sat, 28 Jun 2025 16:41:47 -0700 Subject: [PATCH 2/2] Add configuration settings files and update README. --- Configuration/Project-Debug.xcconfig | 138 +++++ Configuration/Project-Release.xcconfig | 54 ++ Configuration/Project-Shared.xcconfig | 487 ++++++++++++++++++ Configuration/ShipShape-Debug.xcconfig | 14 + Configuration/ShipShape-Release.xcconfig | 14 + Configuration/ShipShape-Shared.xcconfig | 300 +++++++++++ Configuration/ShipShapeTests-Debug.xcconfig | 14 + Configuration/ShipShapeTests-Release.xcconfig | 16 + Configuration/ShipShapeTests-Shared.xcconfig | 196 +++++++ README.md | 14 +- ShipShape.xcodeproj/project.pbxproj | 247 ++------- ShipShape/Info.plist | 2 +- 12 files changed, 1281 insertions(+), 215 deletions(-) create mode 100644 Configuration/Project-Debug.xcconfig create mode 100644 Configuration/Project-Release.xcconfig create mode 100644 Configuration/Project-Shared.xcconfig create mode 100644 Configuration/ShipShape-Debug.xcconfig create mode 100644 Configuration/ShipShape-Release.xcconfig create mode 100644 Configuration/ShipShape-Shared.xcconfig create mode 100644 Configuration/ShipShapeTests-Debug.xcconfig create mode 100644 Configuration/ShipShapeTests-Release.xcconfig create mode 100644 Configuration/ShipShapeTests-Shared.xcconfig diff --git a/Configuration/Project-Debug.xcconfig b/Configuration/Project-Debug.xcconfig new file mode 100644 index 0000000..f98aa58 --- /dev/null +++ b/Configuration/Project-Debug.xcconfig @@ -0,0 +1,138 @@ +// +// Project-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include "Project-Shared.xcconfig" + +// Debug Information Format +// +// The type of debug information to produce. +// +// * DWARF: Object files and linked products will use DWARF as the debug information +// format. [dwarf] +// * DWARF with dSYM File: Object files and linked products will use DWARF as the debug +// information format, and Xcode will also produce a dSYM file containing the debug +// information from the individual object files (except that a dSYM file is not needed +// and will not be created for static library or object file products). [dwarf-with-dsym] + +DEBUG_INFORMATION_FORMAT = dwarf + + + +// Enable Testability +// +// Enabling this setting will build the target with options appropriate for running +// automated tests against its product. +// +// This setting can be enabled when building targets for debugging if their products will +// be tested. This may result in tests running slower than otherwise. +// +// When this setting is enabled: +// +// * `GCC_SYMBOLS_PRIVATE_EXTERN` is disabled (`-fvisibility=hidden` will not be passed +// to `clang`). +// * `-enable-testing` is passed to the Swift compiler. +// * `-rdynamic` is passed to the linker. +// * `STRIP_INSTALLED_PRODUCT` is disabled (`strip` will not be run on the produced +// binary). + +ENABLE_TESTABILITY = YES + + + +// Generate Position-Dependent Code +// +// Faster function calls for applications. Not appropriate for shared libraries, which +// need to be position-independent. + +GCC_DYNAMIC_NO_PIC = NO + + + +// Optimization Level +// +// Specifies the degree to which the generated code is optimized for speed and binary +// size. +// +// * None: Do not optimize. [-O0] +// With this setting, the compiler's goal is to reduce the cost of compilation and to +// make debugging produce the expected results. Statements are independent—if you stop +// the program with a breakpoint between statements, you can then assign a new value to +// any variable or change the program counter to any other statement in the function and +// get exactly the results you would expect from the source code. +// * Fast: Optimizing compilation takes somewhat more time, and a lot more memory for a +// large function. [-O1] +// With this setting, the compiler tries to reduce code size and execution time, +// without performing any optimizations that take a great deal of compilation time. In +// Apple's compiler, strict aliasing, block reordering, and inter-block scheduling are +// disabled by default when optimizing. +// * Faster: The compiler performs nearly all supported optimizations that do not +// involve a space-speed tradeoff. [-O2] +// With this setting, the compiler does not perform loop unrolling or function +// inlining, or register renaming. As compared to the `Fast` setting, this setting +// increases both compilation time and the performance of the generated code. +// * Fastest: Turns on all optimizations specified by the `Faster` setting and also +// turns on function inlining and register renaming options. This setting may result in a +// larger binary. [-O3] +// * Fastest, Smallest: Optimize for size. This setting enables all `Faster` +// optimizations that do not typically increase code size. It also performs further +// optimizations designed to reduce code size. [-Os] +// * Fastest, Aggressive Optimizations: This setting enables `Fastest` but also enables +// aggressive optimizations that may break strict standards compliance but should work +// well on well-behaved code. [-Ofast] +// * Smallest, Aggressive Size Optimizations: This setting enables additional size +// savings by isolating repetitive code patterns into a compiler generated function. +// [-Oz] + +GCC_OPTIMIZATION_LEVEL = 0 + + + +// Preprocessor Macros +// +// Space-separated list of preprocessor macros of the form `foo` or `foo=bar`. + +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) + + + +// Produce Debugging Information +// +// Debugging information is required for shader debugging and profiling. + +MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE + + + +// Build Active Architecture Only +// +// If enabled, only the active architecture is built. This setting will be ignored when +// building with a run destination which does not define a specific architecture, such as +// a 'Generic Device' run destination, or if the 'Override Architectures' scheme option +// is set to 'Match Run Destination' or 'Universal'. + +ONLY_ACTIVE_ARCH = YES + + + +// Active Compilation Conditions +// +// A list of compilation conditions to enable for conditional compilation expressions. + +SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG $(inherited) + + + +// Swift Optimization Level +// +// * None: Compile without any optimization. [-Onone] +// * Optimize for Speed: [-O] +// * Optimize for Size: [-Osize] +// * Whole Module Optimization: [-O -whole-module-optimization] + +SWIFT_OPTIMIZATION_LEVEL = -Onone + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" diff --git a/Configuration/Project-Release.xcconfig b/Configuration/Project-Release.xcconfig new file mode 100644 index 0000000..8f6aeb7 --- /dev/null +++ b/Configuration/Project-Release.xcconfig @@ -0,0 +1,54 @@ +// +// Project-Release.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include "Project-Shared.xcconfig" + +// Debug Information Format +// +// The type of debug information to produce. +// +// * DWARF: Object files and linked products will use DWARF as the debug information +// format. [dwarf] +// * DWARF with dSYM File: Object files and linked products will use DWARF as the debug +// information format, and Xcode will also produce a dSYM file containing the debug +// information from the individual object files (except that a dSYM file is not needed +// and will not be created for static library or object file products). [dwarf-with-dsym] + +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym + + + +// Enable Foundation Assertions +// +// Controls whether assertion logic provided by `NSAssert` is included in the +// preprocessed source code or is elided during preprocessing. Disabling assertions can +// improve code performance. + +ENABLE_NS_ASSERTIONS = NO + + + +// Produce Debugging Information +// +// Debugging information is required for shader debugging and profiling. + +MTL_ENABLE_DEBUG_INFO = NO + + + +// Swift Compilation Mode +// +// This setting controls the way the Swift files in a module are rebuilt. +// +// * Incremental: Only rebuild the Swift source files in the module that are out of +// date, running multiple compiler processes as needed. +// * Whole Module: Always rebuild all Swift source files in the module, in a single +// compiler process. + +SWIFT_COMPILATION_MODE = wholemodule + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" diff --git a/Configuration/Project-Shared.xcconfig b/Configuration/Project-Shared.xcconfig new file mode 100644 index 0000000..ee614cb --- /dev/null +++ b/Configuration/Project-Shared.xcconfig @@ -0,0 +1,487 @@ +// +// Project-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +// Always Search User Paths (Deprecated) +// +// This setting is deprecated as of Xcode 8.3 and may not be supported in future +// versions. It is recommended that you disable the setting. +// +// If enabled, both `#include `-style and `#include "header.h"`-style +// directives search the paths in `USER_HEADER_SEARCH_PATHS` before +// `HEADER_SEARCH_PATHS`. As a consequence, user headers, such as your own `String.h` +// header, have precedence over system headers when using `#include `. This is +// done using the `-iquote` flag for the paths provided in `USER_HEADER_SEARCH_PATHS`. If +// disabled and your compiler fully supports separate user paths, user headers are only +// accessible with `#include "header.h"`-style preprocessor directives. +// +// For backwards compatibility reasons, this setting is enabled by default. Disabling it +// is strongly recommended. + +ALWAYS_SEARCH_USER_PATHS = NO + + + +// Generate Swift Asset Symbol Extensions +// +// Generate asset symbol extensions on Apple framework color and image types. + +ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES + + + +// Misuse of 'nonnull' +// +// Check for misuses of `nonnull` parameter and return types. + +CLANG_ANALYZER_NONNULL = YES + + + +// Suspicious Conversions of NSNumber and CFNumberRef +// +// Warn when a number object, such as an instance of `NSNumber`, `CFNumberRef`, +// `OSNumber`, or `OSBoolean` is compared or converted to a primitive value instead of +// another object. + +CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE + + + +// C++ Language Dialect +// +// Choose a standard or non-standard C++ language dialect. Options include: +// +// * C++98: Accept ISO C++ 1998 with amendments, but not GNU extensions. [-std=c++98] +// * GNU++98: Accept ISO C++ 1998 with amendments and GNU extensions. [-std=gnu++98] +// * C++11: Accept the ISO C++ 2011 standard with amendments, but not GNU extensions. +// [-std=c++11] +// * GNU++11: Accept the ISO C++ 2011 standard with amendments and GNU extensions. +// [-std=gnu++11] +// * C++14: Accept the ISO C++ 2014 standard with amendments, but not GNU extensions. +// [-std=c++14] +// * GNU++14: Accept the ISO C++ 2014 standard with amendments and GNU extensions. +// [-std=gnu++14] +// * C++17: Accept the ISO C++ 2017 standard with amendments, but not GNU extensions. +// [-std=c++17] +// * GNU++17: Accept the ISO C++ 2017 standard with amendments and GNU extensions. +// [-std=gnu++17] +// * C++20: Accept the ISO C++ 2020 standard with amendments, but not GNU extensions. +// [-std=c++20] +// * GNU++20: Accept the ISO C++ 2020 standard with amendments and GNU extensions. +// [-std=gnu++20] +// * C++23: Accept the ISO C++ 2023 standard with amendments, but not GNU extensions. +// [-std=c++23] +// * GNU++23: Accept the ISO C++ 2023 standard with amendments and GNU extensions. +// [-std=gnu++23] +// * Compiler Default: Tells the compiler to use its default C++ language dialect. This +// is normally the best choice unless you have specific needs. (Currently equivalent to +// GNU++98.) + +CLANG_CXX_LANGUAGE_STANDARD = gnu++20 + + + +// Enable Modules (C and Objective-C) +// +// Enables the use of modules for system APIs. System headers are imported as semantic +// modules instead of raw headers. This can result in faster builds and project indexing. + +CLANG_ENABLE_MODULES = YES + + + +// Objective-C Automatic Reference Counting +// +// Compiles reference-counted Objective-C code to use Automatic Reference Counting. Code +// compiled using automated reference counting is compatible with other code (such as +// frameworks) compiled using either manual reference counting (for example, traditional +// `retain` and `release` messages) or automated reference counting. [-fobjc-arc] + +CLANG_ENABLE_OBJC_ARC = YES + + + +// Weak References in Manual Retain Release +// +// Compiles Objective-C code to enable weak references for code compiled with manual +// retain release (MRR) semantics. + +CLANG_ENABLE_OBJC_WEAK = YES + + + +// Duplicate Method Definitions +// +// Warn about declaring the same method more than once within the same `@interface`. + +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES + + + +// Block Capture of Autoreleasing +// +// Warn about block captures of implicitly autoreleasing parameters. + +CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES + + + +// Implicit Boolean Conversions +// +// Warn about implicit conversions to boolean values that are suspicious. For example, +// writing `if (foo)` where `foo` is the name a function will trigger a warning. + +CLANG_WARN_BOOL_CONVERSION = YES + + + +// Suspicious Commas +// +// Warn about suspicious uses of the comma operator. + +CLANG_WARN_COMMA = YES + + + +// Implicit Constant Conversions +// +// Warn about implicit conversions of constant values that cause the constant value to +// change, either through a loss of precision, or entirely in its meaning. + +CLANG_WARN_CONSTANT_CONVERSION = YES + + + +// Overriding Deprecated Objective-C Methods +// +// Warn if an Objective-C class either subclasses a deprecated class or overrides a +// method that has been marked deprecated or unavailable. + +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES + + + +// Direct usage of 'isa' +// +// Warn about direct accesses to the Objective-C `isa` pointer instead of using a runtime +// API. + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + + +// Documentation Comments +// +// Warns about issues in documentation comments (`doxygen`-style) such as missing or +// incorrect documentation tags. + +CLANG_WARN_DOCUMENTATION_COMMENTS = YES + + + +// Empty Loop Bodies +// +// Warn about loop bodies that are suspiciously empty. + +CLANG_WARN_EMPTY_BODY = YES + + + +// Implicit Enum Conversions +// +// Warn about implicit conversions between different kinds of enum values. For example, +// this can catch issues when using the wrong enum flag as an argument to a function or +// method. + +CLANG_WARN_ENUM_CONVERSION = YES + + + +// Infinite Recursion +// +// Warn if all paths through a function call itself. + +CLANG_WARN_INFINITE_RECURSION = YES + + + +// Implicit Integer to Pointer Conversions +// +// Warn about implicit conversions between pointers and integers. For example, this can +// catch issues when one incorrectly intermixes using `NSNumber*`'s and raw integers. + +CLANG_WARN_INT_CONVERSION = YES + + + +// Implicit Non-Literal Null Conversions +// +// Warn about non-literal expressions that evaluate to zero being treated as a null +// pointer. + +CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES + + + +// Implicit retain of 'self' within blocks +// +// Warn about implicit retains of `self` within blocks, which can create a retain-cycle. + +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES + + + +// Implicit Objective-C Literal Conversions +// +// Warn about implicit conversions from Objective-C literals to values of incompatible +// type. + +CLANG_WARN_OBJC_LITERAL_CONVERSION = YES + + + +// Unintentional Root Class +// +// Warn about classes that unintentionally do not subclass a root class, such as +// `NSObject`. + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + + +// Quoted Include In Framework Header +// +// Warns when a quoted include is used instead of a framework style include in a +// framework header. + +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES + + + +// Range-based For Loops +// +// Warn about ranged-based for loops. + +CLANG_WARN_RANGE_LOOP_ANALYSIS = YES + + + +// Strict Prototypes +// +// Warn about non-prototype declarations. + +CLANG_WARN_STRICT_PROTOTYPES = YES + + + +// Suspicious Moves +// +// Warn about suspicious uses of `std::move`. + +CLANG_WARN_SUSPICIOUS_MOVE = YES + + + +// Unguarded availability +// +// Warn if an API that is newer than the deployment target is used without "if +// (@available(...))" guards. + +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE + + + +// Unreachable Code +// +// Warns about potentially unreachable code. + +CLANG_WARN_UNREACHABLE_CODE = YES + + + +// Strip Debug Symbols During Copy +// +// Specifies whether binary files that are copied during the build, such as in a Copy +// Bundle Resources or Copy Files build phase, should be stripped of debugging symbols. +// It does not cause the linked product of a target to be stripped—use +// `STRIP_INSTALLED_PRODUCT` for that. + +COPY_PHASE_STRIP = NO + + + +// Development Team +// +// The team ID of a development team to use for signing certificates and provisioning +// profiles. + +DEVELOPMENT_TEAM = B5C26XE59E + + + +// Enable Strict Checking of objc_msgSend Calls +// +// Controls whether `objc_msgSend` calls must be cast to the appropriate function pointer +// type before being called. + +ENABLE_STRICT_OBJC_MSGSEND = YES + + + +// User Script Sandboxing +// +// If enabled, the build system will sandbox user scripts to disallow undeclared +// input/output dependencies. + +ENABLE_USER_SCRIPT_SANDBOXING = YES + + + +// C Language Dialect +// +// Choose a standard or non-standard C language dialect. +// +// * ANSI C: Accept ISO C90 and ISO C++, turning off GNU extensions that are +// incompatible. [-ansi] +// Incompatible GNU extensions include the `asm`, `inline`, and `typeof` keywords (but +// not the equivalent `__asm__`, `__inline__`, and `__typeof__` forms), and the `//` +// syntax for comments. +// This setting also enables trigraphs. +// * C89: Accept ISO C90 (1990), but not GNU extensions. [-std=c89] +// * GNU89: Accept ISO C90 and GNU extensions. [-std=gnu89] +// * C99: Accept ISO C99 (1999), but not GNU extensions. [-std=c99] +// * GNU99: Accept ISO C99 and GNU extensions. [-std=gnu99] +// * C11: Accept ISO C11 (2011), but not GNU extensions. [-std=c11] +// * GNU11: Accept ISO C11 and GNU extensions. [-std=gnu11] +// * C17: Accept ISO C17 (2018), but not GNU extensions. [-std=c17] +// * GNU17: Accept ISO C17 and GNU extensions. [-std=gnu17] +// * C23: Accept ISO C23 (2024), but not GNU extensions. [-std=c23] +// * GNU23: Accept ISO C23 and GNU extensions. [-std=gnu23] +// * Compiler Default: Tells the compiler to use its default C language dialect. This +// is normally the best choice unless you have specific needs. (Currently equivalent to +// GNU99.) + +GCC_C_LANGUAGE_STANDARD = gnu17 + + + +// No Common Blocks +// +// In C, allocate even uninitialized global variables in the data section of the object +// file, rather than generating them as common blocks. This has the effect that if the +// same variable is declared (without `extern`) in two different compilations, you will +// get an error when you link them. + +GCC_NO_COMMON_BLOCKS = YES + + + +// Implicit Conversion to 32 Bit Type +// +// Warn if a value is implicitly converted from a 64-bit type to a 32-bit type. This is a +// subset of the warnings provided by -Wconversion. + +GCC_WARN_64_TO_32_BIT_CONVERSION = YES + + + +// Mismatched Return Type +// +// Causes warnings to be emitted when a function with a defined return type (not `void`) +// contains a return statement without a return-value or when it does not contain any +// return statements. Also emits a warning when a function with a void return type tries +// to return a value. + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + + +// Undeclared Selector +// +// Warn if a `@selector(...)` expression referring to an undeclared selector is found. A +// selector is considered undeclared if no method with that name has been declared before +// the `@selector(...)` expression, either explicitly in an `@interface` or `@protocol` +// declaration, or implicitly in an `@implementation` section. This option always +// performs its checks as soon as a `@selector(...)` expression is found, while +// `-Wselector` only performs its checks in the final stage of compilation. This also +// enforces the coding style convention that methods and selectors must be declared +// before being used. + +GCC_WARN_UNDECLARED_SELECTOR = YES + + + +// Uninitialized Variables +// +// Warn if a variable might be clobbered by a `setjmp` call or if an automatic variable +// is used without prior initialization. +// +// The compiler may not detect all cases where an automatic variable is initialized or +// all usage patterns that may lead to use prior to initialization. You can toggle +// between the normal uninitialized value checking or the more aggressive (conservative) +// checking, which finds more issues but the checking is much stricter. + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + + + +// Unused Functions +// +// Warn whenever a static function is declared but not defined or a non-inline static +// function is unused. + +GCC_WARN_UNUSED_FUNCTION = YES + + + +// Unused Variables +// +// Warn whenever a local variable or nonconstant static variable is unused aside from its +// declaration. + +GCC_WARN_UNUSED_VARIABLE = YES + + + +// Localization Prefers String Catalogs +// +// When enabled, string tables generated in a localization export will prefer the String +// Catalog format. + +LOCALIZATION_PREFERS_STRING_CATALOGS = YES + + + +// macOS Deployment Target +// +// Code will load on this and later versions of macOS. Framework APIs that are +// unavailable in earlier versions will be weak-linked; your code should check for `null` +// function pointers or specific system versions before calling newer APIs. + +MACOSX_DEPLOYMENT_TARGET = 15.4 + + + +// Enable Fast Math +// +// Enable optimizations for floating-point arithmetic that may violate the IEEE 754 +// standard and disable the high precision variant of math functions for single and half +// precision floating-point. + +MTL_FAST_MATH = YES + + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the `ADDITIONAL_SDKS` +// setting. + +SDKROOT = macosx diff --git a/Configuration/ShipShape-Debug.xcconfig b/Configuration/ShipShape-Debug.xcconfig new file mode 100644 index 0000000..9bb0d6b --- /dev/null +++ b/Configuration/ShipShape-Debug.xcconfig @@ -0,0 +1,14 @@ +// +// ShipShape-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" + +#include "ShipShape-Shared.xcconfig" + +//********************************************// +//* Currently no build settings in this file *// +//********************************************// diff --git a/Configuration/ShipShape-Release.xcconfig b/Configuration/ShipShape-Release.xcconfig new file mode 100644 index 0000000..ea4c6e7 --- /dev/null +++ b/Configuration/ShipShape-Release.xcconfig @@ -0,0 +1,14 @@ +// +// ShipShape-Release.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" + +#include "ShipShape-Shared.xcconfig" + +//********************************************// +//* Currently no build settings in this file *// +//********************************************// diff --git a/Configuration/ShipShape-Shared.xcconfig b/Configuration/ShipShape-Shared.xcconfig new file mode 100644 index 0000000..ad32d1e --- /dev/null +++ b/Configuration/ShipShape-Shared.xcconfig @@ -0,0 +1,300 @@ +// +// ShipShape-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +// Primary App Icon Set Name +// +// Name of an app icon set for the target's default app icon. The contents will be merged +// into the `Info.plist`. + +ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon + + + +// Global Accent Color Name +// +// The name of a color resource to use as a the target's accent color, used as the +// default tint color on iOS and watchOS, and accent color on macOS. + +ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor + + + +// Code Signing Entitlements +// +// The path to a file specifying code-signing entitlements. + +CODE_SIGN_ENTITLEMENTS = ShipShape/ShipShape.entitlements + + + +// Code Signing Style +// +// This setting specifies the method used to acquire and locate signing assets. Choose +// `Automatic` to let Xcode automatically create and update profiles, app IDs, and +// certificates. Choose `Manual` to create and update these yourself on the developer +// website. + +CODE_SIGN_STYLE = Automatic + + + +// Combine HiDPI Images +// +// Combines image files at different resolutions into one multi-page TIFF file that is +// HiDPI compliant for macOS 10.7 and later. Only image files in the same directory and +// with the same base name and extension are combined. The file names must conform to the +// naming convention used in HiDPI. + +COMBINE_HIDPI_IMAGES = YES + + + +// Current Project Version +// +// This setting defines the current version of the project. The value must be a integer +// or floating point number, such as `57` or `365.8`. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion) +// key in the `Info.plist` file to the value of this build setting. + +CURRENT_PROJECT_VERSION = 1 + + +// Enable Hardened Runtime +// +// Hardened Runtime defends your application by preventing modifications to its code and +// provides fine-grained controls over what can run in your process. Hardening the +// runtime also prevents access to sensitive resources unless your application +// pre-declares its intent to use them, which reduces the attack surface by eliminating +// unnecessary access. These properties help prevent exploitation of your application +// and this capability is required for your app to be notarized. + +ENABLE_HARDENED_RUNTIME = YES + + + +ENABLE_PREVIEWS = YES + + + +// User Script Sandboxing +// +// If enabled, the build system will sandbox user scripts to disallow undeclared +// input/output dependencies. + +ENABLE_USER_SCRIPT_SANDBOXING = NO + + + +// Generate Info.plist File +// +// If enabled, automatically generate an Info.plist file with content from build +// settings, and from content in the file pointed to by `INFOPLIST_FILE`, if defined. + +GENERATE_INFOPLIST_FILE = YES + + + +// Info.plist File +// +// The project-relative path to the property list file that contains the `Info.plist` +// information used by bundles. +// +// The build system merges the values you specify in this file with other values it +// generates during the build process. The product type, target platform, App Privacy +// manifests, input from other build tools, and other built-in logic impact the contents +// of the final `Info.plist` file it produces. When `GENERATE_INFOPLIST_FILE` is enabled, +// the build system also includes content from build settings in the merge process. +// +// For details on information property list files, see [Information Property +// List](https://developer.apple.com/documentation/bundleresources/information_property_list). + +INFOPLIST_FILE = ShipShape/Info.plist + + + +// Application Category +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [LSApplicationCategoryType](https://developer.apple.com/documentation/bundleresources/information_property_list/lsapplicationcategorytype) +// key in the `Info.plist` file to the value of this build setting. + +INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.developer-tools + + + +// Copyright (Human-Readable) +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [NSHumanReadableCopyright](https://developer.apple.com/documentation/bundleresources/information_property_list/nshumanreadablecopyright) +// key in the `Info.plist` file to the value of this build setting. + +INFOPLIST_KEY_NSHumanReadableCopyright = + + + +// Application Scene Manifest (Generation) +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [UIApplicationSceneManifest](https://developer.apple.com/documentation/bundleresources/information_property_list/uiapplicationscenemanifest) +// key in the Info.plist file to an entry suitable for a multi-window application. + +INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES + + + +// Launch Screen (Generation) +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [UILaunchScreen](https://developer.apple.com/documentation/bundleresources/information_property_list/uilaunchscreen) +// key in the Info.plist file to an empty dictionary. + +INFOPLIST_KEY_UILaunchScreen_Generation = YES + + + +// Supported Interface Orientations +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [UISupportedInterfaceOrientations](https://developer.apple.com/documentation/bundleresources/information_property_list/uisupportedinterfaceorientations) +// key in the `Info.plist` file to the value of this build setting. + +INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait + + + +// Supported Interface Orientations (iPad) +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [UISupportedInterfaceOrientations~iPad](https://developer.apple.com/documentation/bundleresources/information_property_list/uisupportedinterfaceorientations) +// key in the `Info.plist` file to the value of this build setting. + +INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown + + + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. + +IPHONEOS_DEPLOYMENT_TARGET = 17.6 + + + +// Runpath Search Paths +// +// This is a list of paths to be added to the `runpath` search path list for the image +// being created. At runtime, `dyld` uses the `runpath` when searching for dylibs whose +// load path begins with `@rpath/`. See [Dynamic Library Programming +// Topics](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html). + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks + + + +// macOS Deployment Target +// +// Code will load on this and later versions of macOS. Framework APIs that are +// unavailable in earlier versions will be weak-linked; your code should check for `null` +// function pointers or specific system versions before calling newer APIs. + +MACOSX_DEPLOYMENT_TARGET = 14.6 + + + +// Marketing Version +// +// This setting defines the user-visible version of the project. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring) +// key in the `Info.plist` file to the value of this build setting. + +MARKETING_VERSION = 1.0 + + + +// Product Bundle Identifier +// +// A string that uniquely identifies the bundle. The string should be in reverse DNS +// format using only alphanumeric characters (`A-Z`, `a-z`, `0-9`), the dot (`.`), and +// the hyphen (`-`). +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleIdentifier](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleidentifier) +// key in the `Info.plist` file to the value of this build setting. + +PRODUCT_BUNDLE_IDENTIFIER = ${ORGANIZATION_IDENTIFIER}.ShipShape + + + +// Product Name +// +// This is the basename of the product generated by the target. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleName](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundlename) +// key in the `Info.plist` file to the value of this build setting. + +PRODUCT_NAME = $(TARGET_NAME) + + + +// Register App Groups +// +// When set, the app groups capability will require a provisioning profile. All app group +// identifiers prefixed with 'group.' will need to be registered on the developer website +// and set in the profile. This is only applicable to platforms supporting unregistered +// app groups. + +REGISTER_APP_GROUPS = YES + + + +// Supported Platforms +// +// The list of supported platforms from which a base SDK can be used. This setting is +// used if the product can be built for multiple platforms using different SDKs. + +SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx + + + +SUPPORTS_MACCATALYST = NO + + + +// Use Compiler to Extract Swift Strings +// +// When enabled, the Swift compiler will be used to extract Swift string literal and +// interpolation `LocalizedStringKey` and `LocalizationKey` types during localization +// export. + +SWIFT_EMIT_LOC_STRINGS = YES + + + +// Require Existential any +// +// Changes existential types to require explicit annotation with the `any` keyword. + +SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES + + + +// Swift Language Version +// +// The language version used to compile the target's Swift code. + +SWIFT_VERSION = 6.0 + + + +TARGETED_DEVICE_FAMILY = 1,2 diff --git a/Configuration/ShipShapeTests-Debug.xcconfig b/Configuration/ShipShapeTests-Debug.xcconfig new file mode 100644 index 0000000..2db5e51 --- /dev/null +++ b/Configuration/ShipShapeTests-Debug.xcconfig @@ -0,0 +1,14 @@ +// +// ShipShapeTests-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" + +#include "ShipShapeTests-Shared.xcconfig" + +//********************************************// +//* Currently no build settings in this file *// +//********************************************// diff --git a/Configuration/ShipShapeTests-Release.xcconfig b/Configuration/ShipShapeTests-Release.xcconfig new file mode 100644 index 0000000..a7f8ab9 --- /dev/null +++ b/Configuration/ShipShapeTests-Release.xcconfig @@ -0,0 +1,16 @@ +// +// ShipShapeTests-Release.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +#include? "../../SharedXcodeSettings/DeveloperSettings.xcconfig" + +#include "ShipShapeTests-Shared.xcconfig" + +// Validate Built Product +// +// If enabled, perform validation checks on the product as part of the build process. + +VALIDATE_PRODUCT = YES diff --git a/Configuration/ShipShapeTests-Shared.xcconfig b/Configuration/ShipShapeTests-Shared.xcconfig new file mode 100644 index 0000000..3ed29f7 --- /dev/null +++ b/Configuration/ShipShapeTests-Shared.xcconfig @@ -0,0 +1,196 @@ +// +// ShipShapeTests-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 6/28/25 +// https://buildsettingextractor.com +// + +// Bundle Loader +// +// Specifies the executable that will load the bundle output file being linked. Undefined +// symbols from the bundle are checked against the specified executable as if it is one +// of the dynamic libraries the bundle was linked with. + +BUNDLE_LOADER = $(TEST_HOST) + + + +// Code Signing Style +// +// This setting specifies the method used to acquire and locate signing assets. Choose +// `Automatic` to let Xcode automatically create and update profiles, app IDs, and +// certificates. Choose `Manual` to create and update these yourself on the developer +// website. + +CODE_SIGN_STYLE = Automatic + + + +// Current Project Version +// +// This setting defines the current version of the project. The value must be a integer +// or floating point number, such as `57` or `365.8`. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion) +// key in the `Info.plist` file to the value of this build setting. + +CURRENT_PROJECT_VERSION = 1 + + + +// Development Team +// +// The team ID of a development team to use for signing certificates and provisioning +// profiles. + +DEVELOPMENT_TEAM = + + + +// User Script Sandboxing +// +// If enabled, the build system will sandbox user scripts to disallow undeclared +// input/output dependencies. + +ENABLE_USER_SCRIPT_SANDBOXING = NO + + + +// Generate Info.plist File +// +// If enabled, automatically generate an Info.plist file with content from build +// settings, and from content in the file pointed to by `INFOPLIST_FILE`, if defined. + +GENERATE_INFOPLIST_FILE = YES + + + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. + +IPHONEOS_DEPLOYMENT_TARGET = 18.4 + + + +// Marketing Version +// +// This setting defines the user-visible version of the project. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring) +// key in the `Info.plist` file to the value of this build setting. + +MARKETING_VERSION = 1.0 + + + +// Product Bundle Identifier +// +// A string that uniquely identifies the bundle. The string should be in reverse DNS +// format using only alphanumeric characters (`A-Z`, `a-z`, `0-9`), the dot (`.`), and +// the hyphen (`-`). +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleIdentifier](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleidentifier) +// key in the `Info.plist` file to the value of this build setting. + +PRODUCT_BUNDLE_IDENTIFIER = ${ORGANIZATION_IDENTIFIER}.ShipShapeTests + + + +// Product Name +// +// This is the basename of the product generated by the target. +// +// When `GENERATE_INFOPLIST_FILE` is enabled, sets the value of the +// [CFBundleName](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundlename) +// key in the `Info.plist` file to the value of this build setting. + +PRODUCT_NAME = $(TARGET_NAME) + + + +// Register App Groups +// +// When set, the app groups capability will require a provisioning profile. All app group +// identifiers prefixed with 'group.' will need to be registered on the developer website +// and set in the profile. This is only applicable to platforms supporting unregistered +// app groups. + +REGISTER_APP_GROUPS = YES + + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the `ADDITIONAL_SDKS` +// setting. + +SDKROOT = iphoneos + + + +// Supported Platforms +// +// The list of supported platforms from which a base SDK can be used. This setting is +// used if the product can be built for multiple platforms using different SDKs. + +SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx + + + +SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO + + + +SUPPORTS_MACCATALYST = NO + + + +SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO + + + +// Use Compiler to Extract Swift Strings +// +// When enabled, the Swift compiler will be used to extract Swift string literal and +// interpolation `LocalizedStringKey` and `LocalizationKey` types during localization +// export. + +SWIFT_EMIT_LOC_STRINGS = NO + + + +// Require Existential any +// +// Changes existential types to require explicit annotation with the `any` keyword. + +SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES + + + +// Swift Language Version +// +// The language version used to compile the target's Swift code. + +SWIFT_VERSION = 6.0 + + + +TARGETED_DEVICE_FAMILY = 1,2 + + + +// Test Host +// +// Path to the executable into which a bundle of tests is injected. Only specify this +// setting if testing an application or other executable. + +TEST_HOST = $(BUILT_PRODUCTS_DIR)/ShipShape.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ShipShape diff --git a/README.md b/README.md index c87f644..54cb72b 100644 --- a/README.md +++ b/README.md @@ -15,17 +15,21 @@ ShipShape was initially created in a [Hacking with Swift+ live stream](https://w Once ShipShape is stable, the plan is to merge it into another project called [Control Room](https://github.com/twostraws/ControlRoom), which gives users control over the iOS Simulator. +## Building the Application -## Running the app +This project uses `.xcconfig` files to configure build settings. It follows the example of [NetNewsWire](https://github.com/Ranchero-Software/NetNewsWire) +in using a file called `DeveloperSettings.xcconfig` to hold developer-specific settings. The script `setup.sh` included +at the root of this project will create this file at the well-known location `../SharedXcodeSettings`. If you've +already got that file, then you don't need to run the script; if you have not got such a file, open a Terminal +at the project root and run `./setup.sh` to create it. This will save your Developer ID and team prefix to the file, +which will be used to make sure the products you build do not collide with anyone else's. -You'll need Xcode 16 or later to build the code, along with an active App Store Connect account in order to connect to the API. +### Running the app -> [!CAUTION] -> You need to set the Team and Bundle Identifier values to something of your choosing. To avoid committing these changes to source control, we highly recommend you run `git update-index --assume-unchanged ShipShape.xcodeproj/project.pbxproj` after you clone the repository, which will stop Git from including this change in any commits you make. +You'll need Xcode 16 or later to build the code, along with an active App Store Connect account in order to connect to the API. When you run ShipShape for the first time, it will guide you through creating a private key to access the App Store Connect API. - ## Contribution guide This is an all-new project, so there are lots of opportunities to get involved: diff --git a/ShipShape.xcodeproj/project.pbxproj b/ShipShape.xcodeproj/project.pbxproj index eb2a710..f482576 100644 --- a/ShipShape.xcodeproj/project.pbxproj +++ b/ShipShape.xcodeproj/project.pbxproj @@ -24,6 +24,16 @@ 51616E6E2DD8EDE8007B8250 /* ShipShape.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ShipShape.app; sourceTree = BUILT_PRODUCTS_DIR; }; 517283BC2DDCD6D40064D974 /* ShipShapeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ShipShapeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 7C1EFDA42E10AA6800AAB949 /* setup.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = setup.sh; sourceTree = ""; }; + 7C1EFDA52E10ACD700AAB949 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 7C1EFDA62E10B33600AAB949 /* Project-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Debug.xcconfig"; sourceTree = ""; }; + 7C1EFDA72E10B33600AAB949 /* Project-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Release.xcconfig"; sourceTree = ""; }; + 7C1EFDA82E10B33600AAB949 /* Project-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Shared.xcconfig"; sourceTree = ""; }; + 7C1EFDA92E10B33600AAB949 /* ShipShape-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShape-Debug.xcconfig"; sourceTree = ""; }; + 7C1EFDAA2E10B33600AAB949 /* ShipShape-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShape-Release.xcconfig"; sourceTree = ""; }; + 7C1EFDAB2E10B33600AAB949 /* ShipShape-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShape-Shared.xcconfig"; sourceTree = ""; }; + 7C1EFDAC2E10B33600AAB949 /* ShipShapeTests-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShapeTests-Debug.xcconfig"; sourceTree = ""; }; + 7C1EFDAD2E10B33600AAB949 /* ShipShapeTests-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShapeTests-Release.xcconfig"; sourceTree = ""; }; + 7C1EFDAE2E10B33600AAB949 /* ShipShapeTests-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ShipShapeTests-Shared.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -74,10 +84,12 @@ 51616E652DD8EDE8007B8250 = { isa = PBXGroup; children = ( + 7C1EFDAF2E10B33600AAB949 /* Configuration */, 51616E702DD8EDE8007B8250 /* ShipShape */, 517283BD2DDCD6D40064D974 /* ShipShapeTests */, 51616E6F2DD8EDE8007B8250 /* Products */, 7C1EFDA42E10AA6800AAB949 /* setup.sh */, + 7C1EFDA52E10ACD700AAB949 /* README.md */, ); sourceTree = ""; }; @@ -90,6 +102,22 @@ name = Products; sourceTree = ""; }; + 7C1EFDAF2E10B33600AAB949 /* Configuration */ = { + isa = PBXGroup; + children = ( + 7C1EFDA62E10B33600AAB949 /* Project-Debug.xcconfig */, + 7C1EFDA72E10B33600AAB949 /* Project-Release.xcconfig */, + 7C1EFDA82E10B33600AAB949 /* Project-Shared.xcconfig */, + 7C1EFDA92E10B33600AAB949 /* ShipShape-Debug.xcconfig */, + 7C1EFDAA2E10B33600AAB949 /* ShipShape-Release.xcconfig */, + 7C1EFDAB2E10B33600AAB949 /* ShipShape-Shared.xcconfig */, + 7C1EFDAC2E10B33600AAB949 /* ShipShapeTests-Debug.xcconfig */, + 7C1EFDAD2E10B33600AAB949 /* ShipShapeTests-Release.xcconfig */, + 7C1EFDAE2E10B33600AAB949 /* ShipShapeTests-Shared.xcconfig */, + ); + path = Configuration; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -269,256 +297,57 @@ /* Begin XCBuildConfiguration section */ 51616E782DD8EDEA007B8250 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDA62E10B33600AAB949 /* Project-Debug.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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; - DEVELOPMENT_TEAM = B5C26XE59E; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - 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; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 15.4; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 51616E792DD8EDEA007B8250 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDA72E10B33600AAB949 /* Project-Release.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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"; - DEVELOPMENT_TEAM = B5C26XE59E; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - 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; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 15.4; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; }; name = Release; }; 51616E7B2DD8EDEA007B8250 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDA92E10B33600AAB949 /* ShipShape-Debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = ShipShape/ShipShape.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ShipShape/Info.plist; + INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSHumanReadableCopyright = "© 2025 Paul Hudson"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.ShipShape; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SUPPORTS_MACCATALYST = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 51616E7C2DD8EDEA007B8250 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDAA2E10B33600AAB949 /* ShipShape-Release.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = ShipShape/ShipShape.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ShipShape/Info.plist; + INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSHumanReadableCopyright = "© 2025 Paul Hudson"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.ShipShape; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SUPPORTS_MACCATALYST = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; 517283C32DDCD6D40064D974 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDAC2E10B33600AAB949 /* ShipShapeTests-Debug.xcconfig */; buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.4; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.ShipShapeTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ShipShape.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ShipShape"; }; name = Debug; }; 517283C42DDCD6D40064D974 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7C1EFDAD2E10B33600AAB949 /* ShipShapeTests-Release.xcconfig */; buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.4; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.ShipShapeTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ShipShape.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ShipShape"; - VALIDATE_PRODUCT = YES; }; name = Release; }; diff --git a/ShipShape/Info.plist b/ShipShape/Info.plist index cf5848e..3a74f19 100644 --- a/ShipShape/Info.plist +++ b/ShipShape/Info.plist @@ -5,6 +5,6 @@ CFBundleHelpBookFolder ShipShape_(main).help CFBundleHelpBookName - com.hackingwithswift.ShipShape.help + ${PRODUCT_BUNDLE_IDENTIFIER}.help