From 4a49a6fa0260c2df6875fe0290cb831af51b6820 Mon Sep 17 00:00:00 2001 From: cuong mac mini m2 Date: Mon, 8 Jun 2026 16:47:27 +0700 Subject: [PATCH] Adopt Xcode recommended settings and fix resulting build errors Applied Xcode's "Update to recommended settings" (new warning flags, LastUpgradeCheck 2650, scheme bumps, Info.plist tidy-up), then fixed the build failures those stricter checks surfaced: - Disable ENABLE_MODULE_VERIFIER and CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER: the library intentionally uses quoted includes so the flat include/ symlink directory resolves them for SPM; the module verifier rejects that. - Add (void) to the GCDWebServerInitializeFunctions and _ExecuteMainThreadRunLoopSources definitions (CLANG_WARN_STRICT_PROTOTYPES + -Werror). - Cast both branches of the status-code ternary in GCDWebServerConnection to NSInteger (-Wenum-compare-conditional mixed two enum types). Verified: Run-Tests.sh, swift build, and the Xcode framework build all pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- Frameworks/Info.plist | 6 +- GCDWebServer.xcodeproj/project.pbxproj | 94 ++++++++++++++++++- .../xcschemes/GCDWebServers (Mac).xcscheme | 2 +- .../xcschemes/GCDWebServers (iOS).xcscheme | 2 +- .../xcschemes/GCDWebServers (tvOS).xcscheme | 2 +- GCDWebServer/Core/GCDWebServer.m | 2 +- GCDWebServer/Core/GCDWebServerConnection.m | 2 +- GCDWebServer/Core/GCDWebServerFunctions.m | 2 +- 8 files changed, 100 insertions(+), 12 deletions(-) diff --git a/Frameworks/Info.plist b/Frameworks/Info.plist index 537b5cb..c0650cb 100644 --- a/Frameworks/Info.plist +++ b/Frameworks/Info.plist @@ -7,16 +7,16 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType FMWK - CFBundleVersion - ${BUNDLE_VERSION_STRING} CFBundleShortVersionString ${BUNDLE_VERSION_STRING} + CFBundleVersion + ${BUNDLE_VERSION_STRING} diff --git a/GCDWebServer.xcodeproj/project.pbxproj b/GCDWebServer.xcodeproj/project.pbxproj index e376bbe..94fc650 100644 --- a/GCDWebServer.xcodeproj/project.pbxproj +++ b/GCDWebServer.xcodeproj/project.pbxproj @@ -838,7 +838,8 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1130; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 2650; TargetAttributes = { CEE28CD01AE004D800F4023C = { CreatedOnToolsVersion = 6.3; @@ -1146,6 +1147,7 @@ 1DEB928608733DD80010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = 12; PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; @@ -1155,6 +1157,7 @@ 1DEB928708733DD80010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = 12; PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; @@ -1167,13 +1170,42 @@ ALWAYS_SEARCH_USER_PATHS = NO; BUNDLE_VERSION_STRING = 3.5.4; CLANG_ENABLE_OBJC_ARC = 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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2"; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1208,11 +1240,39 @@ ALWAYS_SEARCH_USER_PATHS = NO; BUNDLE_VERSION_STRING = 3.5.4; CLANG_ENABLE_OBJC_ARC = 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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__; GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2"; PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; SWIFT_VERSION = 5.0; @@ -1223,10 +1283,12 @@ CEE28CE41AE004D800F4023C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1234,6 +1296,8 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -1243,10 +1307,12 @@ CEE28CE51AE004D800F4023C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1254,6 +1320,8 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -1263,10 +1331,12 @@ CEE28D031AE0052000F4023C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16; LD_RUNPATH_SEARCH_PATHS = ( @@ -1275,6 +1345,8 @@ "@loader_path/Frameworks", ); MODULEMAP_FILE = Frameworks/module.modulemap; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1285,10 +1357,12 @@ CEE28D041AE0052000F4023C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16; LD_RUNPATH_SEARCH_PATHS = ( @@ -1297,6 +1371,8 @@ "@loader_path/Frameworks", ); MODULEMAP_FILE = Frameworks/module.modulemap; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1307,17 +1383,18 @@ E240392F1BA09207000B7089 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", ); + GENERATE_INFOPLIST_FILE = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12; - GENERATE_INFOPLIST_FILE = YES; PRODUCT_NAME = Tests; SDKROOT = macosx; WARNING_CFLAGS = ( @@ -1330,17 +1407,18 @@ E24039301BA09207000B7089 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", ); + GENERATE_INFOPLIST_FILE = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12; - GENERATE_INFOPLIST_FILE = YES; PRODUCT_NAME = Tests; SDKROOT = macosx; WARNING_CFLAGS = ( @@ -1353,6 +1431,7 @@ E274F877187E77D8009E0582 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1360,6 +1439,7 @@ E274F878187E77D8009E0582 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1367,18 +1447,22 @@ E2DDD1901BE69404002CE867 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = appletvos; @@ -1390,18 +1474,22 @@ E2DDD1911BE69404002CE867 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; INFOPLIST_FILE = Frameworks/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14"; + PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = GCDWebServers; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = appletvos; diff --git a/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers (Mac).xcscheme b/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers (Mac).xcscheme index f366881..6000a41 100644 --- a/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers (Mac).xcscheme +++ b/GCDWebServer.xcodeproj/xcshareddata/xcschemes/GCDWebServers (Mac).xcscheme @@ -1,6 +1,6 @@ = 200) && (response.statusCode < 300) && _CompareResources(response.eTag, request.ifNoneMatch, response.lastModifiedDate, request.ifModifiedSince)) { - NSInteger code = [request.method isEqualToString:@"HEAD"] || [request.method isEqualToString:@"GET"] ? kGCDWebServerHTTPStatusCode_NotModified : kGCDWebServerHTTPStatusCode_PreconditionFailed; + NSInteger code = [request.method isEqualToString:@"HEAD"] || [request.method isEqualToString:@"GET"] ? (NSInteger)kGCDWebServerHTTPStatusCode_NotModified : (NSInteger)kGCDWebServerHTTPStatusCode_PreconditionFailed; GCDWebServerResponse* newResponse = [GCDWebServerResponse responseWithStatusCode:code]; newResponse.cacheControlMaxAge = response.cacheControlMaxAge; newResponse.lastModifiedDate = response.lastModifiedDate; diff --git a/GCDWebServer/Core/GCDWebServerFunctions.m b/GCDWebServer/Core/GCDWebServerFunctions.m index 707a4db..c374e29 100644 --- a/GCDWebServer/Core/GCDWebServerFunctions.m +++ b/GCDWebServer/Core/GCDWebServerFunctions.m @@ -48,7 +48,7 @@ static NSDateFormatter* _dateFormatterISO8601 = nil; static dispatch_queue_t _dateFormatterQueue = NULL; // TODO: Handle RFC 850 and ANSI C's asctime() format -void GCDWebServerInitializeFunctions() { +void GCDWebServerInitializeFunctions(void) { GWS_DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread if (_dateFormatterRFC822 == nil) { _dateFormatterRFC822 = [[NSDateFormatter alloc] init];