quicksilver / Quicksilver

Quicksilver Project Source
http://qsapp.com
Apache License 2.0
2.73k stars 285 forks source link

Update plugins for Apple Silicon #2634

Open pjrobertson opened 2 years ago

pjrobertson commented 2 years ago

Here's a list of all plugins in the Quicksilver Organisation on Github. Let's tick them off one by one as they get updated for Apple Silicon. I think all those with a last commit of 5th Feb have already been done by @skurfer

Outstanding for 2.0:

2.1.0 and up:

Code used to compile the list:

import requests
import json
r1 = requests.get('https://api.github.com/orgs/quicksilver/repos?per_page=100')
r2 = requests.get('https://api.github.com/orgs/quicksilver/repos?per_page=100&page=2')

js = r1.json()
js.extend(r2.json())

for repo in sorted(js, key=lambda x: x['pushed_at'], reverse=True):
    print("- [ ] {} (last commit: {})".format(repo['name'], repo['pushed_at'][:10]))
n8henrie commented 2 years ago

A script I whipped up to download and compile in parallel is here: < https://github.com/quicksilver/Quicksilver/issues/2543#issuecomment-830399140

Many of them build without issue on M1.

I'm still unclear on what to do after that -- even if no code changes are necessary, I assume pushing a universal-binary compiled version somewhere is still necessary.

Should be able to do some work on this tomorrow.

PS Updating the Plug-in Development Reference link from < https://qsapp.com/wiki/Developer_Information> from < http://projects.skurfer.com/QuicksilverPlug-inReference.mdown> (-> 301 to https:// -> 502) to https://github.com/quicksilver/PluginDevelopmentReference/blob/master/QuicksilverPlug-inReference.mdown

pjrobertson commented 2 years ago

A script I whipped up to download and compile in parallel is here: <

Nice, this is similar to my script below. The extra steps you're missing are:

  1. Pull the latest updates from Github (some plugins have been updated recently)
  2. Bump the version number using bltrversion (or some other way)
  3. Commit, and push the commit back to the GH repo
  4. Build the plugin (your script)
  5. qs-push-plugin to actually push the updated plugin to the QS update server. For that @skurfer has the password (I lost track). If you're willing to update the plugins, then I'm sure Rob could share the password.

I suggest we refine your/my script and add it to Tools in Quicksilver

for folder in QSPlugins/*/; do
  cd $folder

  // bump version number
  INFOPLIST_FILE=$(find . -name Info.plist -maxdepth 1)
  /tmp/QS/Tools/bltrversion
  git commit -a -m "Update version number for M1 build"
  git push origin master

  // build (taken from the default Xcode Github action: https://github.com/quicksilver/Quicksilver/new/master?filename=.github/workflows/objective-c-xcode.yml&workflow_template=objective-c-xcode)
  scheme_list=$(xcodebuild -list -json | tr -d "\n")
  scheme=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['targets'][0]")
  echo Using default scheme: $scheme
  filetype_parameter="project"
  file_to_build="`ls -A | grep -i \\.xcodeproj\$`"
  file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
  SETTINGS=$(xcodebuild -configuration Release -scheme "$scheme" -project "$file_to_build" -showBuildSettings | sort -u)
  xcodebuild clean build -quiet -configuration Release -scheme "$scheme" -"$filetype_parameter" "$file_to_build"
  FULL_PRODUCT_NAME=$(echo ${SETTINGS} | grep "FULL_PRODUCT_NAME" | sed 's/[ ]*FULL_PRODUCT_NAME = //')
  // do codesigning stuff
  /path/to/qs-push-plugin -c “<ul><li>Updated for Apple M1 Silicon</li></ul>" "/tmp/QS/build/Release/$FULL_PRODUCT_NAME"
  echo “Built and uploaded $FULL_PRODUCT_NAME successfully"
done
n8henrie commented 2 years ago

Out of curiosity -- those aren't valid comments. Is this just an example of what your script looks like? What shell do you use?

n8henrie commented 2 years ago

It looks like all of the 2022-02-05 commits were @skurker updating -- those can be checked off, right?

EDIT: :g/2022-02-05/s/- \[ \]/- [x]/, assuming that's the case

skurfer commented 2 years ago

For a couple of them, the issue is that the YAJL.framework is Intel only. I can’t find the original source for that. Any pointers?

n8henrie commented 2 years ago

Figuring out what some of these do is kind of rough.

Based on the last updated date, it looks like the latter is the one providing the "Calendar Plugin," but I don't see much in the info pane to clue me in. It might be helpful at some point to have a link to the source in the info pane.

Screen Shot 2022-02-15 at 13 17 26

Seems like some should probably just be deprecated / archived?

n8henrie commented 2 years ago

I can’t find the original source for that.

This may be it: https://github.com/lloyd/yajl

skurfer commented 2 years ago

Yeah, maybe when we’re done building and releasing what can still be built, I’ll go through the database and just disable those with an update date before this year.

n8henrie commented 2 years ago

I'm not getting anywhere fast, again running into this issue, which I never really figured out why it went away last time.

Working on https://github.com/quicksilver/QSOmniFocusPlugIn-qsplugin -- can't get it to build,

'QSCore/QSObject.h' file not found
$ fd 'qsobject\.h' /tmp/QS
/tmp/QS/build/Debug/QSCore.framework/Versions/A/Headers/QSObject.h
/tmp/QS/build/Debug/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h
/tmp/QS/build/Release/QSCore.framework/Versions/A/Headers/QSObject.h
/tmp/QS/build/Release/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h
/tmp/QS/build/Release/dmg/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h

I think I have QSFrameworks (/Applications/Quicksilver.app/Contents/Frameworks) and QS_SOURCE_ROOT set correctly.

Checkpoint on a couple scripts -- to download the plugin repos in parallel:

#!/usr/bin/env python3
import asyncio
import json
from pathlib import Path
from urllib.request import urlopen

def scrape(outfile):
    page = 1
    repos = []
    while True:
        with urlopen(
            "https://api.github.com/orgs/quicksilver/repos?per_page=100"
            f"&page={page}"
        ) as req:
            data = json.loads(req.read().decode())
            repos.extend(data)

            if (link := req.headers.get("link")) and "next" in link:
                page += 1
            else:
                break

    outfile.write_text(json.dumps(repos, indent=4))
    return repos

async def clone(sem, repo):
    async with sem:
        await asyncio.subprocess.create_subprocess_exec(
            "git",
            *[
                "clone",
                "--recurse-submodules",
                repo["ssh_url"],
                Path("QSPlugins") / repo["name"],
            ],
        )

async def clone_many(repos):
    sem = asyncio.Semaphore(10)
    coros = [
        clone(sem, repo)
        for repo in repos
        if (url := repo.get("ssh_url")) and "qsplugin" in url.lower()
    ]
    await asyncio.gather(*coros)

def main():
    outfile = Path("repos.json")
    if outfile.is_file():
        repos = json.loads(outfile.read_text())
    else:
        repos = scrape(outfile)

    asyncio.run(clone_many(repos))

if __name__ == "__main__":
    main()

and to build the plugin:

#!/bin/bash

set -Eeuf -o pipefail

log() {
  echo "$*" > /dev/stderr
}

err() {
  log "error: $*"
  exit 1
}

json() {
  input=$1
  target=$2
  tr -d '\n' <<< "${input}" | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)${target}"
}

main() {

  local plugin_name
  plugin_name=$1

  # Workaround for no mapfile in bash 3, preserving compatibility with /bin/bash
  target_plugin=()
  while read -r -d '' target; do
    target_plugin+=("${target}")
  done < <(
    find QSPlugins \
      -maxdepth 1 \
      -mindepth 1 \
      -type d \
      -iname "*${plugin_name}*" \
      -print0
  )

  if [[ "${#target_plugin[@]}" -ne 1 ]]; then
    err "possible matches for plugin ${plugin_name} ${target_plugin[*]}"
  fi

  plugindir="${target_plugin[0]}"
  pushd "${plugindir}"
  git stash
  git pull origin master
  git submodule update --init --recursive

  INFOPLIST_FILE=$(find . ./Resources -maxdepth 1 -name Info.plist -print -quit)
  if [[ -z "${INFOPLIST_FILE}" ]]; then
    err "no plist"
  fi

  PYTHONPATH=/tmp/QS/Tools/python-support \
    INFOPLIST_FILE=${INFOPLIST_FILE} \
    QS_BACKWARDS_COMPATIBILITY_BREAK=4001 \
    QS_BUNDLE_VERSION=4026 \
    /tmp/QS/Tools/bltrversion

  project=$(find . -maxdepth 1 -name '*.xcodeproj' -not -iname "*test.xcodeproj" -print -quit)

  if [[ -z "${project}" ]]; then
    scheme_list=$(xcodebuild -list -json || true)
  else
    scheme_list=$(xcodebuild -list -json -project "${project}")
  fi

  if [[ -z "${scheme_list}" ]]; then
    err "unable to determine scheme list"
  fi

  # build (taken from the default Xcode Github action: https://github.com/quicksilver/Quicksilver/new/master?filename=.github/workflows/objective-c-xcode.yml&workflow_template=objective-c-xcode)
  scheme=$(json "${scheme_list}" "['project']['targets'][0]")

  log "Using default scheme: ${scheme}"
  filetype_parameter="project"

  # Absence of a project can still build, but will error if `-project` is specified
  if [[ -z "${project}" ]]; then
    SETTINGS=$(xcodebuild -configuration Release -scheme "${scheme}" -showBuildSettings -json)
    xcodebuild build -quiet -configuration Release -scheme "${scheme}"
  else
    SETTINGS=$(xcodebuild -configuration Release -scheme "${scheme}" -project "${project}" -showBuildSettings -json)
    xcodebuild build -quiet -configuration Release -scheme "${scheme}" -"${filetype_parameter}" "${project:-}"
  fi

  FULL_PRODUCT_NAME=$(json "${SETTINGS}" '[0]["buildSettings"]["FULL_PRODUCT_NAME"]')

  log "Built ${FULL_PRODUCT_NAME} successfully"

  while :; do
    read -r -p "push changes? [y/n]: " response
    case "${response}" in
      Y | y) break ;;
      *)
        echo "bye"
        exit 0
        ;;
    esac
  done

  git commit --all --message="Update version number for M1 build"
  git push origin master
  log "Pushed ${FULL_PRODUCT_NAME} to master"
  "${QS_REPO}/Quicksilver/Tools/qs-push-plugin" \
    --changes "<ul><li>Updated for Apple M1 Silicon</li></ul>" \
    --password "${QS_PLUGIN_PASS}" \
    "/tmp/QS/build/Release/${FULL_PRODUCT_NAME}"
  log "Pushed ${FULL_PRODUCT_NAME} to main QS repo"
}
main "$@"
pjrobertson commented 2 years ago

I vaguely remembered Rob writing about updating archaic plugins - here’s what he said: https://github.com/quicksilver/PluginDevelopmentReference/blob/master/QuicksilverPlug-inReference.mdown#plug-in-clean-up-and-modernization

What you’ve talked about seems similar to what we’ve seen in the past.

On 16 Feb 2022, at 07:34, Nathan Henrie @.***> wrote:

I'm not getting anywhere fast, again running into this issue https://github.com/quicksilver/Quicksilver/issues/2543#issuecomment-819086407, which I never really figured out why it went away last time.

Working on https://github.com/quicksilver/QSOmniFocusPlugIn-qsplugin https://github.com/quicksilver/QSOmniFocusPlugIn-qsplugin -- can't get it to build,

'QSCore/QSObject.h' file not found $ fd 'qsobject.h' /tmp/QS /tmp/QS/build/Debug/QSCore.framework/Versions/A/Headers/QSObject.h /tmp/QS/build/Debug/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h /tmp/QS/build/Release/QSCore.framework/Versions/A/Headers/QSObject.h /tmp/QS/build/Release/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h /tmp/QS/build/Release/dmg/Quicksilver.app/Contents/Frameworks/QSCore.framework/Versions/A/Headers/QSObject.h I think I have QSFrameworks (/Applications/Quicksilver.app/Contents/Frameworks) and QS_SOURCE_ROOT set correctly.

Checkpoint on a couple scripts -- to download the plugin repos in parallel:

!/usr/bin/env python3

import asyncio import json from pathlib import Path from urllib.request import urlopen

def scrape(outfile): page = 1 repos = [] while True: with urlopen( "https://api.github.com/orgs/quicksilver/repos?per_page=100" f"&page={page}" ) as req: data = json.loads(req.read().decode()) repos.extend(data)

        if (link := req.headers.get("link")) and "next" in link:
            page += 1
        else:
            break

outfile.write_text(json.dumps(repos, indent=4))
return repos

async def clone(sem, repo): async with sem: await asyncio.subprocess.create_subprocess_exec( "git", *[ "clone", "--recurse-submodules", repo["ssh_url"], Path("QSPlugins") / repo["name"], ], )

async def clone_many(repos): sem = asyncio.Semaphore(10) coros = [ clone(sem, repo) for repo in repos if (url := repo.get("ssh_url")) and "qsplugin" in url.lower() ] await asyncio.gather(*coros)

def main(): outfile = Path("repos.json") if outfile.is_file(): repos = json.loads(outfile.read_text()) else: repos = scrape(outfile)

asyncio.run(clone_many(repos))

if name == "main": main() and to build the plugin (WIP):

!/usr/bin/env bash

set -Eeuf -o pipefail set -x

json() { input=$1 target=$2 tr -d '\n' <<< "${input}" | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)${target}" }

main() {

while read -r plugindir; do pushd "${plugindir}"

# bump version number
INFOPLIST_FILE=$(find . -maxdepth 1 -name Info.plist)
PYTHONPATH=/tmp/QS/Tools/python-support \
  INFOPLIST_FILE=${INFOPLIST_FILE} \
  QS_BACKWARDS_COMPATIBILITY_BREAK=4001 \
  QS_BUNDLE_VERSION=4026 \
  /tmp/QS/Tools/bltrversion

# git commit --all --message="Update version number for M1 build"
# git push origin master

# build (taken from the default Xcode Github action: https://github.com/quicksilver/Quicksilver/new/master?filename=.github/workflows/objective-c-xcode.yml&workflow_template=objective-c-xcode)
scheme_list=$(xcodebuild -list -json)
scheme=$(json "${scheme_list}" "['project']['targets'][0]")

echo "Using default scheme: ${scheme}"
filetype_parameter="project"
file_to_build=$(find . -maxdepth 1 -name '*.xcodeproj')

SETTINGS=$(xcodebuild -configuration Release -scheme "${scheme}" -project "${file_to_build}" -showBuildSettings -json)
xcodebuild clean build -quiet -configuration Release -scheme "${scheme}" -"${filetype_parameter}" "${file_to_build}" || {
  popd
  echo "${plugindir}" >> fail.log
  continue
}
FULL_PRODUCT_NAME=$(json "${SETTINGS}" '.[0]["buildSettings"]["FULL_PRODUCT_NAME"]')

# do codesigning stuff
/path/to/qs-push-plugin -c "<ul><li>Updated for Apple M1 Silicon</li></ul>" "/tmp/QS/build/Release/${FULL_PRODUCT_NAME}"
echo "Built and uploaded ${FULL_PRODUCT_NAME} successfully"

popd
echo "${plugindir}" >> success.log

done < <(find QSPlugins -maxdepth 1 -mindepth 1 -type d) } main "$@" — Reply to this email directly, view it on GitHub https://github.com/quicksilver/Quicksilver/issues/2634#issuecomment-1040906154, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABEXH7DDS5H4L4UUK4HLHLU3LPJJANCNFSM5OILQHFQ. Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub. You are receiving this because you authored the thread.

n8henrie commented 2 years ago

Very helpful, thanks for the reminder. I know I've read through it before, but reviewing it helped resolve the first few errors.

(Hopefully some of these keywords will be easy issue search terms for other contributors / new devs.)

skurfer commented 2 years ago

I ran across quite a few plug-ins that were either missing frameworks, or they weren’t correctly set up.

It should look like this for each one.

Screen Shot 2022-02-15 at 9 31 34 PM
n8henrie commented 2 years ago

OK, I think I figured out my issue -- at least in part -- and why it seemed to suddenly fix itself last time as well. I cloned the recently updated iCal plugin to have something that should work, but was still not able to find e.g. QSFoundation.h.

I knew the plugin build depends on the quicksilver build, which creates /tmp/QS (and /tmp/QS/build/{Debug,Release} etc.), as well as the QSFrameworks and QS_SOURCE_ROOT paths).

What I discovered, is that when I (out of habit) run the clean action (cmdshiftk) from the Plugin, I can no longer successfully build the plugin.

I have to return to the Xcode window building Quicksilver, re-build there, and then return to the plugin window, make sure not to clean, and then build -- and the build succeeds.

Does this sound right? I didn't expect a clean run from the plugin project to be removing necessary build artifacts from the Quicksilver build.

skurfer commented 2 years ago

Does this sound right? I didn't expect a clean run from the plugin project to be removing necessary build artifacts from the Quicksilver build.

Hmmm. That doesn’t sound right. I feel like I used to do that all the time, but it’s been a while.

pjrobertson commented 2 years ago

I noticed this a few days back. I just had to re-build the QS project and it was all fine. I also just experienced the Scheme switch from “Quicksilver Distribution” to “Quicksilver”. Xcode seems really quirky.

On 16 Feb 2022, at 21:46, Rob McBroom @.***> wrote:

Does this sound right? I didn't expect a clean run from the plugin project to be removing necessary build artifacts from the Quicksilver build.

Hmmm. That doesn’t sound right. I feel like I used to do that all the time, but it’s been a while.

— Reply to this email directly, view it on GitHub https://github.com/quicksilver/Quicksilver/issues/2634#issuecomment-1041508372, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABEXH6G2KAVXML322D7PALU3OTFHANCNFSM5OILQHFQ. Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub. You are receiving this because you authored the thread.

n8henrie commented 2 years ago

xcodebuild clean build seems to have the same effect; removing the clean and the script has a fair number of successes. I'll update the script above.

With the script above, these seem to succeed without further effort (I imagine most already done by @skurfer -- should have filtered by last push date):

elements.trigger.mouse-qsplugin
com.apple.Automator-qsplugin
Yojimbo-qsplugin
QSQRCode-qsplugin
TextStartRanker-qsplugin
QSWindowInterfacePlugIn-qsplugin
ChatSupport-qsplugin
Shelf-qsplugin
elements.trigger.event-qsplugin
Displays-qsplugin
ScreenCapture-qsplugin
MicrosoftOffice-qsplugin
iTunes-qsplugin
BezelClassic-qsplugin
DictPlugin-qsplugin
ProcessManipulationPlugIn-qsplugin
QSOmniWebPlugIn-qsplugin
elements.textmanipulation-qsplugin
PathFinder-qsplugin
FaceTime-qsplugin
com.apple.Safari-qsplugin
NotificationHub-qsplugin
Abracadabra-qsplugin
elements.websearch-qsplugin
UIAccess-qsplugin
Menu-qsplugin
Networking-qsplugin
Dash-qsplugin
Deminimizer-qsplugin
Compression-qsplugin
elements.hfsattributes-qsplugin
Services-qsplugin
Keychain-qsplugin
Cyberduck-qsplugin
CommandLineTool-qsplugin
Spotlight-qsplugin
ImageManipulation-qsplugin
Terminal-qsplugin
com.apple.Xcode.devdocs-qsplugin
com.apple.AddressBook-qsplugin
RemoteHosts-qsplugin
GoogleChrome-qsplugin
iCal-qsplugin
QuickTimePlayer-qsplugin
ExtraScripts-qsplugin
MiniBezel-qsplugin
Calculator-qsplugin

Failing:

Firefox-qsplugin
Bluetooth-qsplugin
com.apple.spaces-qsplugin
CLIX-qsplugin
OnMyCommand-qsplugin
DesktopManager-qsplugin
Stikkit-qsplugin
Transmit-qsplugin
QSDesktopPictureAction-qsplugin
Cl1p-qsplugin
AddressBookActionsPlugIn-qsplugin
QSHomestarRunnerPlugIn-qsplugin
GoogleCalendar-qsplugin
MailMate-qsplugin
QSCubeInterface-unused-qsplugin
Messages-qsplugin
CubeInterface-qsplugin
com.apple.Mail-qsplugin
Slideshow-qsplugin
Indigo-qsplugin
Daemons-qsplugin
MachineSource-qsplugin
Flashlight-qsplugin
Monolith-qsplugin
Skype-qsplugin
Dock-qsplugin
Bezel-qsplugin
UserAccounts-qsplugin
public.file.tags-qsplugin
Printer-qsplugin
QSSlimInterfacePlugIn-qsplugin
Xattr-qsplugin
QSShiiraPlugIn-qsplugin
OrnateInterface-qsplugin
XattrMetadataImporter-qsplugin
Eudora-qsplugin
Mini-qsplugin
Markdown-qsplugin
Alarm-qsplugin
com.facebook-qsplugin
SocialBookmarks-qsplugin
BuddyPop-qsplugin
remember-the-milk-qsplugin
Mailsmith-qsplugin
Audio-qsplugin
GrowlNotifier-qsplugin
elements.update-qsplugin
Camino-qsplugin
Translation-qsplugin
DeliciousLibrary-qsplugin
elements.clipboard-qsplugin
elements.support.music-qsplugin
elements.trigger.hotkey-qsplugin
com.google.mail-qsplugin
QSBezelInterfacePlugIn-qsplugin
CloudApp-qsplugin
Flickr-qsplugin
elements.support.mail-qsplugin
elements.trigger.time-qsplugin
BBEdit-qsplugin
AirPort-qsplugin
Deviant-qsplugin
Google-qsplugin
Phone-qsplugin
Viscosity-qsplugin
iTerm2-qsplugin
DokuWiki-qsplugin
elements.composerui-qsplugin
MusicArtwork-qsplugin
QSRSSPlugIn-qsplugin
NimbusAppSwitcher-qsplugin
DiskImage-qsplugin
AOL-qsplugin
Amazon-qsplugin
CalendarSupport-qsplugin
QSPatchPlugIn-qsplugin
Template-qsplugin
Evernote-qsplugin
QSOmniFocusPlugIn-qsplugin
X10PlugIn-qsplugin
SafariSearches-qsplugin
Expert-qsplugin
FindModule-qsplugin
com.apple.Xcode.application-qsplugin
SoundSupport-qsplugin
Adium-qsplugin
QSAdiumPlugIn-qsplugin
Teleflip-qsplugin
PowerManagementPlugIn-qsplugin
DiffModule-qsplugin
elements.webbridge-qsplugin
QSFullscreenPlugIn-qsplugin
elements.support.window-qsplugin
ProcessSwitcherSupportPlugIn-qsplugin
ColloquyPlugin-qsplugin
FileTagging-qsplugin
QSSherlockPlugIn-qsplugin
NetNewsWire-qsplugin
LegacyAudio-qsplugin
iPhoto-qsplugin
DiscInterface-qsplugin
YouControlDesktopsPlugIn-qsplugin
SystemKeys-qsplugin
TSActionsPlugin-qsplugin
NowContact-qsplugin
QSSpellcheckAction-qsplugin
QSWeatherPlugin-qsplugin
elements.trigger.gesture-qsplugin
NetworkLocation-qsplugin
RemoteDesktop-qsplugin
PrimerInterface-qsplugin
elements.survey-qsplugin
InternetExplorer-qsplugin
TextMate-qsplugin
Editor-qsplugin
StartupDisk-qsplugin

EDIT: remove QSPlugin/ prefix

pjrobertson commented 2 years ago

Here's a ranking of top 45 plugins by all-time downloads. Looks like most are already re-build and released. Let's make sure the these are re-built before we announce 2.0.0. iTunes is number one - we should update that to work with Music I guess.

+-------------------------------------------------------+---------+
| identifier                                            | dls     |
+-------------------------------------------------------+---------+
| com.blacktree.Quicksilver.QSiTunesPlugIn              |  927176 |
| com.blacktree.Quicksilver.QSSafariPlugIn              |  444939 |
| com.blacktree.Quicksilver.QSAddressBookPlugIn         |  432135 |
| com.blacktree.Quicksilver.QSTerminalPlugIn            |  334308 |
| com.blacktree.Quicksilver.QSAppleMailPlugIn           |  324278 |
| com.blacktree.Quicksilver.QSEmailSupport              |  312152 |
| se.stdin.quicksilver.GoogleChrome                     |  280363 |
| com.blacktree.Quicksilver.QSKeychainPlugIn            |  255774 |
| com.blacktree.Quicksilver.QSWebSearchPlugIn           |  248645 |
| com.qsapp.Networking                                  |  200737 |
| com.blacktree.Quicksilver.QSFirefoxPlugIn             |  193340 |
| com.blacktree.quicksilver.TSCalculatorPlugin          |  183881 |
| com.blacktree.Quicksilver.QSClipboardPlugIn           |  141902 |
| com.blacktree.Quicksilver.QSShelfPlugIn               |  129241 |
| com.qsapp.Quicksilver.MicrosoftOfficePlugin           |  127561 |
| com.robertson.Quicksilver.OnePassword                 |  111178 |
| com.qsapp.QSFaceTime                                  |  107745 |
| com.blacktree.Quicksilver.QSGrowlPlugIn               |   92758 |
| com.blacktree.Quicksilver.QSiCalModule                |   65658 |
| se.stdin.quicksilver.iTerm2                           |   65373 |
| com.skurfer.Quicksilver.RemoteHosts                   |   63182 |
| com.blacktree.Quicksilver.QSGmailPlugIn               |   62739 |
| com.blacktree.Quicksilver.QSDeveloperPlugIn           |   57236 |
| com.blacktree.Quicksilver.QSSpotlightPlugIn           |   55846 |
| com.blacktree.Quicksilver.QSScreenCapturePlugIn       |   51874 |
| com.blacktree.Quicksilver.QSUIAccessPlugIn            |   50543 |
| com.blacktree.Quicksilver.QSTextManipulationPlugIn    |   49604 |
| com.blacktree.Quicksilver.QSCompressionPlugIn         |   47328 |
| com.blacktree.Quicksilver.QSCommandLineTool           |   46740 |
| com.blacktree.Quicksilver.BezelHUD                    |   44533 |
| com.qsapp.Quicksilver.NostromoInterface               |   44073 |
| com.blacktree.Quicksilver.QSCubeInterfacePlugIn       |   44069 |
| com.blacktree.Quicksilver.QSMenuInterfacePlugin       |   43486 |
| com.blacktree.Quicksilver.QSExtraScriptsPlugIn        |   41091 |
| com.blacktree.Quicksilver.QSServicesMenuPlugIn        |   39601 |
| com.blacktree.Quicksilver.QSImageManipulationPlugIn   |   38170 |
| com.blacktree.Quicksilver.QSiPhotoPlugIn              |   38082 |
| com.blacktree.Quicksilver.QSiChatPlugIn               |   37794 |
| com.blacktree.Quicksilver.QSDictionaryPlugIn          |   37631 |
| com.blacktree.Quicksilver.QSMiniInterfacePlugin       |   34593 |
| com.blacktree.Quicksilver.QSChatSupport               |   34193 |
| com.blacktree.Quicksilver.QSMusicSupport              |   33329 |
| com.blacktree.Quicksilver.Cyberduck                   |   30267 |
pjrobertson commented 2 years ago

I've updated the original post to split those we're yet to build, but need to build for 2.0

n8henrie commented 2 years ago

Using repos.json from above to filter repos with no pushes in 2022:

$ jq --raw-output '.[] | select((.pushed_at | fromdateiso8601 ) < ("2022-01-01" | strptime("%Y-%m-%d") | mktime)) | .name' repos.json
Plugins
1Password-Plugin
QSCubeInterface-unused-qsplugin
AOL-qsplugin
AddressBookActionsPlugIn-qsplugin
Alarm-qsplugin
Amazon-qsplugin
LegacyAudio-qsplugin
BBEdit-qsplugin
Bezel-qsplugin
Bluetooth-qsplugin
BuddyPop-qsplugin
CLIX-qsplugin
CalendarSupport-qsplugin
Camino-qsplugin
Cl1p-qsplugin
ColloquyPlugin-qsplugin
Cyberduck-qsplugin
Daemons-qsplugin
DeliciousLibrary-qsplugin
DesktopManager-qsplugin
Deviant-qsplugin
DiffModule-qsplugin
DiscInterface-qsplugin
DiskImage-qsplugin
Dock-qsplugin
DokuWiki-qsplugin
Editor-qsplugin
Eudora-qsplugin
Expert-qsplugin
FindModule-qsplugin
Firefox-qsplugin
Flashlight-qsplugin
Flickr-qsplugin
Google-qsplugin
GoogleCalendar-qsplugin
GrowlNotifier-qsplugin
Indigo-qsplugin
MachineSource-qsplugin
Mailsmith-qsplugin
Markdown-qsplugin
Mini-qsplugin
Monolith-qsplugin
MusicArtwork-qsplugin
NetNewsWire-qsplugin
NetworkLocation-qsplugin
NimbusAppSwitcher-qsplugin
NowContact-qsplugin
OnMyCommand-qsplugin
OrnateInterface-qsplugin
Phone-qsplugin
PowerManagementPlugIn-qsplugin
PrimerInterface-qsplugin
Printer-qsplugin
ProcessSwitcherSupportPlugIn-qsplugin
QSAdiumPlugIn-qsplugin
QSBezelInterfacePlugIn-qsplugin
QSDesktopPictureAction-qsplugin
QSFullscreenPlugIn-qsplugin
QSHomestarRunnerPlugIn-qsplugin
QSOmniFocusPlugIn-qsplugin
QSOmniWebPlugIn-qsplugin
QSPatchPlugIn-qsplugin
QSRSSPlugIn-qsplugin
QSSherlockPlugIn-qsplugin
QSShiiraPlugIn-qsplugin
QSSlimInterfacePlugIn-qsplugin
QSSpellcheckAction-qsplugin
QSWeatherPlugin-qsplugin
RemoteDesktop-qsplugin
SafariSearches-qsplugin
Skype-qsplugin
Slideshow-qsplugin
SoundSupport-qsplugin
Spotlight-qsplugin
StartupDisk-qsplugin
Stikkit-qsplugin
SystemKeys-qsplugin
TSActionsPlugin-qsplugin
Teleflip-qsplugin
TextMate-qsplugin
Translation-qsplugin
Transmit-qsplugin
UserAccounts-qsplugin
X10PlugIn-qsplugin
Xattr-qsplugin
XattrMetadataImporter-qsplugin
YouControlDesktopsPlugIn-qsplugin
com.apple.Automator-qsplugin
com.apple.Mail-qsplugin
com.apple.Xcode.application-qsplugin
com.apple.Xcode.devdocs-qsplugin
Messages-qsplugin
com.apple.spaces-qsplugin
com.facebook-qsplugin
com.google.mail-qsplugin
SocialBookmarks-qsplugin
elements.composerui-qsplugin
elements.support.mail-qsplugin
elements.support.music-qsplugin
elements.support.window-qsplugin
elements.survey-qsplugin
elements.trigger.gesture-qsplugin
elements.trigger.hotkey-qsplugin
elements.trigger.time-qsplugin
elements.update-qsplugin
elements.webbridge-qsplugin
iPhoto-qsplugin
public.file.tags-qsplugin
InternetExplorer-qsplugin
PluginDevelopmentReference
MicrosoftOffice-qsplugin
Template-qsplugin
AirPort-qsplugin
iTunes-qsplugin
CubeInterface-qsplugin
qs-update
Adium-qsplugin
remember-the-milk-qsplugin
iTerm2-qsplugin
QuickTimePlayer-qsplugin
qsopera
MiniBezel-qsplugin
Deminimizer-qsplugin
QSQRCode-qsplugin
Evernote-qsplugin
Abracadabra-qsplugin
ndhotkeyevent
ChatSupport-qsplugin
OpenMetaFileTagging
CloudApp-qsplugin
VDKQueue
FileTagging-qsplugin
MailMate-qsplugin
LaunchAtLoginController
showcase
plugin_template

Looks like these have not been updated but can probably just get scripted:

$ comm -1 -2 <(sort norecentpushes) <(sort success.log)
Abracadabra-qsplugin
ChatSupport-qsplugin
Cyberduck-qsplugin
Deminimizer-qsplugin
MicrosoftOffice-qsplugin
MiniBezel-qsplugin
QSOmniWebPlugIn-qsplugin
QSQRCode-qsplugin
QuickTimePlayer-qsplugin
Spotlight-qsplugin
com.apple.Automator-qsplugin
com.apple.Xcode.devdocs-qsplugin
iTunes-qsplugin

As a test run, I built iTunes-qsplugin, confirmed it resulted in a universal binary, confirmed it installed (admittedly without testing functionality), and then ran qs-push-plugin args... -- I'm getting a password prompt. Had hoped it would just pick up my ssh config.

EDIT: To be more explcity -- @skurfer, do I need a password to use qs-push-plugin?

pjrobertson commented 2 years ago

@n8henrie - Yes, you need a password for qs-push-plugin. PM for it.

I've updated the 1st post to mark my name next to plugins I will test and update. We have two options here: just blindly update a plugin to work on Apple Silicon, or test functionality and fix any broken plugins. I vote for the latter. So e.g. for the iTunes-plugin - we should rename it to 'Music', and at the very least test that it still works before pushing any changes.

skurfer commented 2 years ago

The iTunes plug-in won’t work at all. See #2495

I think all we need to do is

  1. Rewrite QSiTunesDatabase to pull data from the newer iTunesLibrary API
  2. Update all the bundle IDs so the plug-in interacts with the correct app (and we might as well rename a lot of classes and variables)

The catch is that I think the app has to be properly signed in order to be allowed access to iTunesLibrary.

n8henrie commented 2 years ago

The catch is that I think the app has to be properly signed in order to be allowed access

I see where it says that, but it seems to run without any extra effort in swift. (I imagine it might also in objc, I just can't whip up a test case.)

// swift-tools-version:5.5.0
import iTunesLibrary

let library = try ITLibrary(apiVersion: "1.1")
let playlists = library.allPlaylists

for playlist in playlists {
    for item in playlist.items {
    print("\(item.title) by \(item.artist?.name ?? "<blank>") from playlist \(playlist.name)")
    }
}
$ swiftc itunes.swift
$ ./itunes | tail
I Get It by Chevelle from playlist Workout
Judith by A Perfect Circle from playlist Workout
Set Me On Fire (Original) by Killaflaw from playlist Workout
This Is The New Shit by Marilyn Manson from playlist Workout
Like A G6 by Far East Movement from playlist Workout
Forgot About Dre by Dr. Dre from playlist Workout
Blue Monday by Orgy from playlist Workout
The Hand That Feeds by Nine Inch Nails from playlist Workout
Burn It Down by Linkin Park from playlist Workout
Party Rock Anthem by Lmfao from playlist Workout
floriandk commented 2 years ago

The updated 1.7.0 that I got together with other updates today gets installed but isn't working with QS 1.6.1 on OS 10.12.6: Not reacting to cmd-L, pref-pane empty. (I am not using other plug-ins much, but likewise installed new Contacts-plugin seems to be working.)

If you (understandably enough) don't want to support 10.12 any more there should be a block for the updates or a warning. Also a link to the earlier versions of the plugins from https://qsapp.com/plugins.php would be good to have.

n8henrie commented 2 years ago

Not reacting to cmd-L

Clipboard history?

pref-pane empty

Can you send a screenshot?

I'm confused about 1.7.0 vs 1.6.1 -- which are you using?

floriandk commented 2 years ago

Not reacting to cmd-L

Clipboard history?

yes! (edited the name out again, sorry)

pref-pane empty

Can you send a screenshot?

https://www.dropbox.com/s/kwohurxupg86q47/Screen%20Shot%202022-02-18%20at%2016.14.25.png?dl=0

I'm confused about 1.7.0 vs 1.6.1 -- which are you using?

QS 1.6.1, the plug-in states its version as 1.7.0

https://www.dropbox.com/s/g9cc9k4axqasjyg/Screen%20Shot%202022-02-18%20at%2016.15.10.png?dl=0

Plugin version 1.5.0 from my backup still working nicely.

n8henrie commented 2 years ago

Ok, so this is specifically the clipboard plugin? If you can confirm I think we should make a separate issue.

Mine is showing version clipboard plugin version 1.6.2 -- can you refresh and see if that is available?

floriandk commented 2 years ago

Ok, so this is specifically the clipboard plugin? If you can confirm I think we should make a separate issue.

yes, as far as I can see the other updated plugins work, but, as I said, I hardly use most of them apart from Contacts and Clipboard. The Dictionary plugin comes up when evoked, but doesn't seem to send the word to the dictionary app though. But I wouldn't know if it did earlier as I didn't use it.

Mine is showing version clipboard plugin version 1.6.2 -- can you refresh and see if that is available?

After reverting to 1.5.0 the update dialog offers only 1.7.0:

https://www.dropbox.com/s/cpr2z5zuy5l0pqo/Screen%20Shot%202022-02-18%20at%2017.51.37.png?dl=0

pjrobertson commented 2 years ago

Thanks for the report @floriandk - v1.7.0 of the clipboard plugin was just released for Apple Silicon. If you're on 10.12, then you should stick with the previous version.

I have updated our system to not offer you the v1.7.0 version now. Stick to the 1.5.0 version of the plugin, and you should be all good!

Thanks

skurfer commented 2 years ago

I don’t think MailCore can be built on a modern Mac, so R.I.P. Send Directly?

We should be able to rip all that out and still allow sending through a client.

pjrobertson commented 2 years ago

MailCore2 builds, and works no problem :)

I've already updated Mail Support to use MailCore2 and fix a few other bugs (see 1st message - edited). Although - please build test it before releasing.

I'm just updating the Gmail plugin so there's at least one Mail handler - since we can't do anything with Apple Mail now (see #2648 )

skurfer commented 2 years ago

I saw a new version of the Mail plug-in is out there, but it has the same bundle version, so no one will see it. I think the current release is F0, so anything higher than that should work. Also, it looks like you updated Firefox, but didn’t release?

We’ll need E-mail Support rebuilt too before Mail will work, I think. I can do MailMate once we have all that working.

pjrobertson commented 2 years ago

Right, I should have communicated better: I've been updating various plugins over the past few days (Microsoft, Email Support, Clipboard etc.) but since I'm on an old Mac, and can't build for arm64. Instead, I'm pushing my changes the master branch of a plugin, then updating the 1st post in this thread with the [needs ~updating~ rebuilding] tag.

After that, I was thinking either one of you or Nate could then build the plugins, sign them and push to the repo.

If that's not a good way, I can instead create a PR so you know it needs building, or I can post a new comment here saying something like "Firefox plugin updated, @XXX please see 1st post and re-build".

RE the Mail Plugin: I didn't push anything new. (for the same 'lack of arm64' reason as above), but here are some changes I have made to live plugins over the past few days:

  1. Mail Plugin: Set max OS Version as 10.14.0 (i.e. 10.13.XX) on the server-side, meaning the plugin won't show up for anybody on 10.14+ - reason explained in #2648
  2. Cube Interface: Set max OS version to 10.9 - i.e. completely obsoleting the plugin.
  3. Various: Set max OS Version as per #2602
pjrobertson commented 2 years ago

P.S. - my latest comment on the Mailing list about the Mail Support plugin error: I debugged a bit and it seems the actual package itself is corrupt:

/usr/bin/ditto -x -rsrc -v /Users/me/Downloads/E-mail\ Support\ 2.0.2.qspkg  .                                           ⏎
Copying /Users/patrick/Downloads/E-mail Support 2.0.2.qspkg 
ditto: cpio read error: bad file format

That's why Quicksilver is choking and giving an error. Likely just needs repackaging

n8henrie commented 2 years ago

A few thoughts going forward

skurfer commented 2 years ago

I may need some tips for building e-mail Support. Can you clone it to a new folder, then update the README with whatever you had to do to get it to build? Out of the box, it complains that the framework is missing and I wasn’t able to build it separately outside the E-mail Support project.

n8henrie commented 2 years ago

Trying to rebuild firefox plugin -- @pjrobertson it looks like you replaced the old version logic with a var CURRENT_PROJECT_VERSION in f1972e20636a1741317e69613fe2764aa95fcba0, but the build steps still rely on bltrversion which chokes on this.

It would be nice to keep the build process consistent across plugins -- should we move to using CURRENT_PROJECT_VERSION as part of https://github.com/quicksilver/Quicksilver/issues/2640 and deprecate bltrversion altogether? Or revert these changes in the firefox plugin and just increment the versions for the time being?

pjrobertson commented 2 years ago

I may need some tips for building e-mail Support. Can you clone it to a new folder, then update the README with whatever you had to do to get it to build? Out of the box, it complains that the framework is missing and I wasn’t able to build it separately outside the E-mail Support project.

Will do. Please hold off on rebuilding just yet. There are a couple of other things that need changing. Turns out Google Auth is a massive PITA - it's so complicated. I'll let you know once I've updated the Gmail Plugin and Email Support

pjrobertson commented 2 years ago

Is there any reason why we couldn't -- in principle -- have GitHub Actions compile the plugins and push them to prod, when triggered by e.g. a pushing a new tag?

This is a good idea, and something I think we should work towards. I would suggest we create a Github action that:

  1. Runs on pushing to master
  2. Runs only if the last commit pushed to master is titled "PUSH PLUGIN"
  3. Takes the long commit message from the last commit, and uses it as the changes argument for qs-push-plugin (using a markdown generator to convert it to html)
  4. The action will need to pull the Quicksilver, and build that first

An example of a commit message would be:

PUSH PLUGIN

* Updated to work with latest Firefox
* Improved speed of indexing bookmarks
pjrobertson commented 2 years ago

It would be nice to keep the build process consistent across plugins -- should we move to using CURRENT_PROJECT_VERSION as part of https://github.com/quicksilver/Quicksilver/issues/2640 and deprecate bltrversion altogether? Or revert these changes in the firefox plugin and just increment the versions for the time being?

I think moving away from hex will break a lot of things with our update server, so I'm not for this right now. I've reverted those changes in the Firefox plugin and pushed to master. Agreed on keeping a consistent build process. That change must have happened when I chose the Xcode 'recommended settings'.

pjrobertson commented 2 years ago

@skurfer - Email Support plugin updated. I'd forgotten to check the .xcworkspace file in.

Gmail plugin also updated and can be released.

If there are no objections, I also plan on making another 'SMTP Mail Plugin' that allows you to use any SMTP server to send mail.

skurfer commented 2 years ago

OK. I won’t be able to look until late tonight at the earliest.

As for building the plug-ins, I don’t think we need to rebuild the app every time. We just need to store the configurations and Frameworks somewhere the plug-ins can find them. That could maybe be part of the QS build process.

n8henrie commented 2 years ago

@skurfer I was wondering about that -- isn't this why the QSFrameworkssetting is for?

https://github.com/quicksilver/Services-qsplugin#before-building

I'm still having trouble with e.g. #include <QSFoundation/QSFoundation.h> file not found (from memory). I've tried both "relative to Frameworks" (which puts its absolute path to /Applications/Quicksilver/...Frameworks and seems reasonable. I've also tried relative to build products and absolute path, using /tmp/QS/build/Release (or Debug) -- and even though I can click on the path button and have it open to the appropriate Framework, it still gives me a build error.

I've tried making it identical to the screenshot you've posted recently (using absolute path) and making it identical to other plugins that I have building without issue.

Ran into this with ProcessSwitcherSupportPlugIn-qsplugin most recently (I think that's what it was, don't have my Mac with me), but I'm hoping to get a better approach in general since I keep running into this same issue.

pjrobertson commented 2 years ago

As for building the plug-ins, I don’t think we need to rebuild the app every time. We just need to store the configurations and Frameworks somewhere the plug-ins can find them. That could maybe be part of the QS build process.

Good point, I like that idea. Although I would say it's safer to pull and rebuild every time and we don't want to have to maintain yet another repo. It's an extra 3-4 minutes in the build process, which should be fine.

I'm still having trouble with e.g. #include <QSFoundation/QSFoundation.h> file not found (from memory).

Services plugin builds just fine for me. Are you sure you're building "Quicksilver Distribution" first, and you're building it for the right configuration (You want to build 'Debug' for Services Plugin → build the 'Debug' version of QS, likewise for the 'Release' version).

If you're making your own plugin, then make sure the configuration is correctly set: Screenshot 2022-02-22 at 12 20 33

n8henrie commented 2 years ago

Man, lots of learning, making slow progress. I think several of my framework issues are due to trying to build old plugins that depend on an outdated .pch file. Also, it looks like most of the .xcconfig files can be referenced from the repo, but the .pch file has to be referenced from /tmp/QS/... -- I assume because it needs to be compiled (.pCh)?

Once I have the new pch file, it seems that most of the references to e.g. QSFoundation can be removed (as well as the import statements, as per https://github.com/quicksilver/PluginDevelopmentReference/blob/master/QuicksilverPlug-inReference.md#plug-in-clean-up-and-modernization.

@pjrobertson -- what version of Firefox are you using? I'm on 97.0.1; I rebuild the firefox plugin and used qs-push-plugin to deploy it, so your changes are live. Worked like a charm, and I was about to check it off above, but unfortunately the plugin doesn't seem to do anything -- history and bookmarks are empty in my catalog.

pjrobertson commented 2 years ago

I still think you're not building the right "Quicksilver Distribution" target before building the plugin. It looks like every time you 'clean' a project (be it Quicksilver or a plugin) it clears the /tmp/QS/ directory so you need to re-build "Quicksilver Distribution" again. Quicksilver.pch is copied to /tmp/QS/configuration as the 'Copy Files' part of the 'Preflight' target: Screenshot 2022-02-23 at 08 54 58

Plugin build issues

Which ones are you having trouble building? I think they've all been updated to build no-problem. Can you double check? Have you also read through everything at https://qsapp.com/wiki/Developer_Information ?

Firefox Plugin

Sorry, it seems my the updated sqlite files in the submodule hadn't been pushed to master. I've just fixed this. Easiest thing to do is:

  1. Completely delete the Firefox-qsplugin folder
  2. Re-clone then re-run git submodule update --init
  3. Build
skurfer commented 2 years ago

For Mail Support, I consistently get

'MailCore/MailCore.h' file not found

The MailCore framework doesn’t exist anywhere in the plug-ins folder. That’s why I opened the MailCore project separately and tried to build it manually, but that generates even more errors. Is building the plug-in supposed to build the framework first as a prerequisite?

I wonder if it’s getting confused because there is a MailCore.framework in the search path. Maybe you don’t have that on your version of macOS? Check in /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/PrivateFrameworks

pjrobertson commented 2 years ago

Strange. I just deleted and re-downloaded, and it still built fine. Yes, MailCore.framework should be built when you build the 'Email Plugin' target. Make sure when you open it, it's set up like this. The 'Dependencies' and 'Copy Files' sections. Screenshot 2022-02-23 at 11 09 56

I did just get a problem with Xcode not recognising the mailcore2.xcodeproj file. That's because I forgot to do git submodule update --init before opening Email Support.xcodeproj. If that's you, then quit Xcode and restart.

skurfer commented 2 years ago

I did check those settings. I thought it was strange that it wants to copy the framework from build/Debug, so I generated a Debug build of QS and tried to build the plug-in with Debug. In that case, I get errors similar to the ones I see when I try to build MailCore alone. So maybe that’s progress. Removing and re-adding it with the Release config active doesn’t change anything.

What if you wipe /tmp/QS and don’t create a Debug build before you try? Does it still work?

Also, I never see Products under MailCore, before or after building.

pjrobertson commented 2 years ago

Hmm... I followed these steps to set up the project. Can you try that?

https://github.com/MailCore/mailcore2/blob/master/build-mac/README.md#build-for-iososx

Under number 4, the first one 'Mac Framework'

Also, the build/Debug folder refers to here (not tmp/QS/build/debug) elements.support.mail-qsplugin/MailCore/build-mac/build/Debug

skurfer commented 2 years ago

I noticed in the framework target, they excluded arm64. If I remove that, I get tons of “Undefined symbol” errors. Looks it might not just build out of the box. I’ll look at these issues tomorrow for tips.