#!/bin/bash ################################################################################################################################# # community-builds-from-source.sh # by Jeremy Wentworth # # Modified by Kent Williams chaircrusher@gmail.com # Modified by Gerhard Brandt gbrandt@cern.ch # # This script pulls down the VCV Rack community repo, finds source urls, pulls down source repos, and builds plugins. # # This script requires: # bash - brew install bash # on mac # git - https://git-scm.com/ # VCV Rack dev env - https://github.com/VCVRack/Rack#setting-up-your-development-environment # # Copy this script into: # Rack/plugins # # Run this in Rack/plugins: # . community-builds-from-source.sh # ################################################################################################################################# nproc=`sysctl -n hw.physicalcpu` #mac #nproc=`nproc` #linux echo "threads: " $nproc # check for the community repo locally echo [Update community repo] echo if [ -d "community" ]; then pushd community # discard any changes git reset HEAD --hard # update the community repo if it exists if ! git pull; then git status exit fi popd else # community repo does not exist so pull it down git clone https://github.com/VCVRack/community fi echo buildfails="" # the strategy is that you want the 'latest and greatest' version of # each plugin -- the master branch. But some plugins won't compile # unless you check out a specific git label. So the versionMap lets # you look up that version below when checking out source. declare -A versionMap versionMap=([Autodafe]=skip [Autodafe-Drums]=skip [AepelzensParasites]=skip [NYSTHI]=skip [VCV-Console]=skip [VCV-PulseMatrix]=skip [Vult]=skip [VultModules]=skip [southpole-vcvrack]=skip [vcvrack-rtlsdr]=skip [Alikins-rack-plugins]=v0.5.2 [AudibleInstruments]=v0.5.0 [Befaco]=v0.5.0 [BogaudioModules]=0.5.4 [DHE-Modules]=v0.5.0 [ESeries]=v0.5.0 [JW-Modules]=v0.5.11 [vcv_luckyxxl]=v0.5.1) # helper function to see if a particular key is in an associative array exists(){ if [ "$2" != in ]; then echo "Incorrect usage." echo "Correct usage: exists {key} in {array}" return fi eval '[ ${'$3'[$1]+muahaha} ]' } # loop through the json in the community repo for gitPlugin in $(cat community/plugins/*.json | grep \"source\" | awk -F'"' '{print $4}') do #strip eventual extension gitPlugin=${gitPlugin%.git} # get the folder name and see if we already haave it locally pluginDirName=$(echo $gitPlugin | awk -F'/' '{print $5}') echo echo [$pluginDirName] if exists ${pluginDirName} in versionMap then echo ${versionMap[${pluginDirName}]} if [ ${versionMap[${pluginDirName}]} == "skip" ] then echo [$pluginDirName SKIPPING] continue; fi fi #echo ${gitPlugin%.git} if [ -d "$pluginDirName" ]; then echo "[$pluginDirName exists]" else echo "[$pluginDirName does not exist yet]" userNameUrlPart=$(echo $gitPlugin | awk -F'/' '{print $4}') #git clone ${gitPlugin%.git} #strip eventual extension git clone $gitPlugin #NOTE: not all plugins are on github, sonus is on gitlab fi # if there's a problem with checkout everything goes to hell if [ ! -d ${pluginDirName} ] ; then echo "[$pluginDirName] clone failed!!!" exit continue; fi # change to the repo dir pushd $pluginDirName # Some devs don't have a .gitignore so you can't pull until you do something with the changed files. git reset HEAD --hard #discards any changes - we could do `git stash` here instead git clean -f -d # pull down the latest code git pull if exists ${pluginDirName} in versionMap then git checkout ${versionMap[${pluginDirName}]} else latest=`git describe --tags --abbrev=0` if [[ ! -z $latest ]]; then echo "[$pluginDirName Latest tag: $latest]" #git checkout $latest git checkout master git pull else echo "[$pluginDirName no tags - using master !!!]" git checkout master fi fi # try to update submodules if there are any git submodule update --init --recursive # clean old builds (might not be needed but can prevent issues) #make clean make -q dep if test $? -le 1 ; then make -j$nproc dep fi # finally, build the plugin if make -j$nproc then true; # say nothing else # if master failed try again with latest tag echo "[$pluginDirName master failed - trying latest tag $latest]" git checkout $latest make clean if make -j$nproc then true; else buildfails="${buildfails} ${pluginDirName}" fi fi # go back to the last dir popd done echo "BUILD FAILURES: ${buildfails}" echo echo "Binaries only:" for binOnly in $(grep -L \"source\" community/plugins/*.json) do for dlurl in $(cat $binOnly | grep \"download\" | awk -F'"' '{print $4}') do echo $dlurl done done