Integrate the 'VerifyNoBuildSettings' script

This commit is contained in:
Olof Hellman 2019-07-28 15:47:43 -07:00
parent a10a9145fa
commit d7f0c26a82
3 changed files with 109 additions and 9 deletions

View File

@ -1927,10 +1927,11 @@
849C645C1ED37A5D003D8FC0 /* Sources */, 849C645C1ED37A5D003D8FC0 /* Sources */,
849C645D1ED37A5D003D8FC0 /* Frameworks */, 849C645D1ED37A5D003D8FC0 /* Frameworks */,
849C645E1ED37A5D003D8FC0 /* Resources */, 849C645E1ED37A5D003D8FC0 /* Resources */,
84C987A52000AC9E0066B150 /* ShellScript */, 84C987A52000AC9E0066B150 /* Run Script: Automated build numbers */,
84B06F681ED37B9000F0B54B /* Embed Frameworks */, 84B06F681ED37B9000F0B54B /* Embed Frameworks */,
6581C75720CED60100F4AD34 /* Embed App Extensions */, 6581C75720CED60100F4AD34 /* Embed App Extensions */,
8423E3E3220158E700C3795B /* ShellScript */, D519E77022EE5B4100923F27 /* Run Script: Verify No Build Settings */,
8423E3E3220158E700C3795B /* Run Script: codesign release builds */,
); );
buildRules = ( buildRules = (
); );
@ -2292,7 +2293,7 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
8423E3E3220158E700C3795B /* ShellScript */ = { 8423E3E3220158E700C3795B /* Run Script: codesign release builds */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -2301,6 +2302,7 @@
); );
inputPaths = ( inputPaths = (
); );
name = "Run Script: codesign release builds";
outputFileListPaths = ( outputFileListPaths = (
); );
outputPaths = ( outputPaths = (
@ -2309,19 +2311,38 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "# See https://github.com/Watson1978/kotori/commit/ffe320f2e058828f0af294b65ed88dfd7baaabff\n\nif [ \"${CONFIGURATION}\" = \"Release\" ]; then\n codesign --verbose --force --deep -o runtime --sign \"Developer ID Application: Brent Simmons\" \"${CODESIGNING_FOLDER_PATH}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/AutoUpdate.app\"\nfi\n"; shellScript = "# See https://github.com/Watson1978/kotori/commit/ffe320f2e058828f0af294b65ed88dfd7baaabff\n\nif [ \"${CONFIGURATION}\" = \"Release\" ]; then\n codesign --verbose --force --deep -o runtime --sign \"Developer ID Application: Brent Simmons\" \"${CODESIGNING_FOLDER_PATH}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/AutoUpdate.app\"\nfi\n";
}; };
84C987A52000AC9E0066B150 /* ShellScript */ = { 84C987A52000AC9E0066B150 /* Run Script: Automated build numbers */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
); );
name = "Run Script: Automated build numbers";
outputPaths = ( outputPaths = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "# See https://blog.curtisherbert.com/automated-build-numbers/\n\ngit=`sh /etc/profile; which git`\nbranch_name=`$git symbolic-ref HEAD | sed -e 's,.*/\\\\(.*\\\\),\\\\1,'`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\nsimple_branch_name=`$git rev-parse --abbrev-ref HEAD`\n\nbuild_number=\"$git_count\"\nif [ $CONFIGURATION != \"Release\" ]; then\nbuild_number+=\"-$simple_branch_name\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n"; shellScript = "# See https://blog.curtisherbert.com/automated-build-numbers/\n\ngit=`sh /etc/profile; which git`\nbranch_name=`$git symbolic-ref HEAD | sed -e 's,.*/\\\\(.*\\\\),\\\\1,'`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\nsimple_branch_name=`$git rev-parse --abbrev-ref HEAD`\n\nbuild_number=\"$git_count\"\nif [ $CONFIGURATION != \"Release\" ]; then\nbuild_number+=\"-$simple_branch_name\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
}; };
D519E77022EE5B4100923F27 /* Run Script: Verify No Build Settings */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Run Script: Verify No Build Settings";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "xcrun -sdk macosx swiftc -target x86_64-macosx10.11 buildscripts/VerifyNoBuildSettings.swift -o $CONFIGURATION_TEMP_DIR/VerifyNoBS\n$CONFIGURATION_TEMP_DIR/VerifyNoBS ${PROJECT_NAME}.xcodeproj/project.pbxproj\n";
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */

View File

@ -0,0 +1,82 @@
#!/usr/bin/swift
// This script is originally from github.com/olofhellman/VerifyNoBS
// The idea is that all build settings should be kept in .xcconfig files,
// rather than in the xcode pbxproj file inside an Xcode project bundle
// Having the script run as part of a regular build ensures that the project file
// doesn't accidentally accumulate build settings
import Darwin
import Foundation
func reportError(message: String) {
print("error message was \(message)")
let stderr = FileHandle.standardError
if let data = message.data(using: String.Encoding.utf8, allowLossyConversion: false) {
stderr.write(data)
} else {
print("there was an error. script \"VerifyNoBuildSettings\" could not convert error message to printable string")
}
}
public enum ProcessXcodeprojResult {
case FoundBuildSettings([String])
case Error(String)
case OK(String)
}
public func processXcodeprojAt(url: URL) -> ProcessXcodeprojResult {
let startTime = Date()
guard let xcodeproj = try? String(contentsOf: url, encoding: String.Encoding.utf8) else {
return .Error("script \"VerifyNoBuildSettings\" failed making xcodeproj from url")
}
let lines = xcodeproj.components(separatedBy: CharacterSet.newlines)
print ("found \(lines.count) lines")
var badLines: [String] = []
var inBuildSettingsBlock = false
for nthLine in lines {
if inBuildSettingsBlock {
if let _ = nthLine.range(of:"\\u007d[:space:]*;", options: .regularExpression) {
inBuildSettingsBlock = false
} else if let _ = nthLine.range(of:"CODE_SIGN_IDENTITY") {
} else {
badLines.append(nthLine)
}
} else {
if let _ = nthLine.range(of:"buildSettings[:space:]*=", options: .regularExpression) {
inBuildSettingsBlock = true
}
}
}
let timeInterval = Date().timeIntervalSince(startTime)
print ("process took \(timeInterval) seconds")
if (badLines.count > 0) {
return .FoundBuildSettings(badLines)
}
return .OK(":-)")
}
print("Verifying no buildSettings...")
let commandLineArgs = CommandLine.arguments
print("processArgs were \(commandLineArgs)")
let xcodeprojfilepath = commandLineArgs[1]
let myUrl = URL(fileURLWithPath:xcodeprojfilepath)
let result = processXcodeprojAt(url: myUrl)
switch result {
case .Error(let str):
reportError (message: "error script \"VerifyNoBuildSettings\" encountered an error: \(str)")
exit(EXIT_FAILURE)
case .FoundBuildSettings(let badLines):
reportError (message: "script \"VerifyNoBuildSettings\" found build settings in the project file:")
for badLine in badLines {
reportError (message: " \(badLine)\n")
}
exit(EXIT_FAILURE)
case .OK:
print ("script \"VerifyNoBuildSettings\" verified the project contained no buildSettings")
exit(EXIT_SUCCESS)
}

View File

@ -1,9 +1,6 @@
// If a warning is commented out in this list, it is a candidate for uncommenting
// that we just aven't gotten to yet
ALWAYS_SEARCH_USER_PATHS = NO ALWAYS_SEARCH_USER_PATHS = NO
CLANG_ANALYZER_NONNULL = YES CLANG_ANALYZER_NONNULL = YES
// CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = gnu++0x CLANG_CXX_LANGUAGE_STANDARD = gnu++0x
CLANG_CXX_LIBRARY = libc++ CLANG_CXX_LIBRARY = libc++
CLANG_ENABLE_MODULES = YES CLANG_ENABLE_MODULES = YES
@ -28,7 +25,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES CLANG_WARN_RANGE_LOOP_ANALYSIS = YES
CLANG_WARN_STRICT_PROTOTYPES = YES CLANG_WARN_STRICT_PROTOTYPES = YES
CLANG_WARN_SUSPICIOUS_MOVE = YES CLANG_WARN_SUSPICIOUS_MOVE = YES
// CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES CLANG_WARN_UNREACHABLE_CODE = YES
COPY_PHASE_STRIP = NO COPY_PHASE_STRIP = NO
ENABLE_STRICT_OBJC_MSGSEND = YES ENABLE_STRICT_OBJC_MSGSEND = YES