From 9ab470f64963aa7f93811a0a56314fe0734d61ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Mon, 16 Aug 2021 13:02:11 +0700 Subject: [PATCH] Adhere to XDG (#458) * Adhere to XDG * Make things simpler * Simplify Makefile * Simplify Makefile * Better deb package * Create /etc/ludo.toml in deb package * Try this * Fix bundle id * Try this * Move packaging files to pkg --- .github/workflows/cd.yml | 6 +-- Makefile | 58 ++++++++++++------------ go.mod | 1 + go.sum | 2 + history/history.go | 16 ++----- options/options.go | 15 ++---- Info.plist => pkg/Info.plist | 2 +- control => pkg/control | 0 entitlements.xml => pkg/entitlements.xml | 0 ludo.desktop => pkg/ludo.desktop | 0 settings/defaults.go | 38 ++++------------ settings/settings.go | 17 ++----- 12 files changed, 54 insertions(+), 101 deletions(-) rename Info.plist => pkg/Info.plist (95%) rename control => pkg/control (100%) rename entitlements.xml => pkg/entitlements.xml (100%) rename ludo.desktop => pkg/ludo.desktop (100%) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 712dc8d8..545f2ab2 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -20,8 +20,6 @@ jobs: - run: sudo apt-get update -q - run: sudo apt-get install libopenal-dev xorg-dev libgl1-mesa-dev -y --allow-unauthenticated - run: OS=Linux ARCH=x86_64 VERSION=$VERSION make tar - - run: make deb_defaults - - run: go build - run: OS=Linux ARCH=x86_64 VERSION=$VERSION make deb - run: sha256sum Ludo-Linux-x86_64-${VERSION}.tar.gz > Ludo-Linux-x86_64-${VERSION}.tar.gz.sha256 @@ -55,8 +53,6 @@ jobs: - run: export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/ - run: GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=arm-linux-gnueabihf-gcc go build -v - run: OS=Linux ARCH=arm VERSION=$VERSION make tar - - run: make deb_defaults - - run: GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=arm-linux-gnueabihf-gcc go build -v - run: OS=Linux ARCH=arm VERSION=$VERSION make deb - run: sha256sum Ludo-Linux-arm-${VERSION}.tar.gz > Ludo-Linux-arm-${VERSION}.tar.gz.sha256 @@ -86,7 +82,7 @@ jobs: - run: security import dev.p12 -k build.keychain -P ${{ secrets.OSXCERTPASS }} -T /usr/bin/codesign && rm dev.p12 - run: security set-key-partition-list -S "apple-tool:,apple:,codesign:" -s -k github build.keychain - run: OS=OSX ARCH=x86_64 VERSION=$VERSION make dmg - - run: echo "REQUESTUUID=$(xcrun altool --notarize-app -t osx -f Ludo-OSX-x86_64-${VERSION}.dmg --primary-bundle-id org.libretro.ludo -u ${{ secrets.APPLEID }} -p ${{ secrets.APPLEIDPASS }} -itc_provider ZE9XE938Z2 | awk '/RequestUUID/ { print $NF; }')" >> $GITHUB_ENV + - run: echo "REQUESTUUID=$(xcrun altool --notarize-app -t osx -f Ludo-OSX-x86_64-${VERSION}.dmg --primary-bundle-id com.libretro.ludo -u ${{ secrets.APPLEID }} -p ${{ secrets.APPLEIDPASS }} -itc_provider ZE9XE938Z2 | awk '/RequestUUID/ { print $NF; }')" >> $GITHUB_ENV - run: sleep 180 - run: xcrun altool --notarization-info $REQUESTUUID -u ${{ secrets.APPLEID }} -p ${{ secrets.APPLEIDPASS }} -ascprovider ZE9XE938Z2 - run: xcrun stapler staple Ludo-OSX-x86_64-${VERSION}.dmg diff --git a/Makefile b/Makefile index 842c1e50..ba03a75f 100644 --- a/Makefile +++ b/Makefile @@ -52,17 +52,16 @@ cores/%_libretro.dylib cores/%_libretro.dll cores/%_libretro.so: $(APP).app: ludo $(DYLIBS) mkdir -p $(APP).app/Contents/MacOS - mkdir -p $(APP).app/Contents/Frameworks mkdir -p $(APP).app/Contents/Resources/$(APP).iconset - cp Info.plist $(APP).app/Contents/ + cp pkg/Info.plist $(APP).app/Contents/ sed -i.bak 's/0.1.0/$(VERSION)/' $(APP).app/Contents/Info.plist rm $(APP).app/Contents/Info.plist.bak echo "APPL????" > $(APP).app/Contents/PkgInfo cp -r database $(APP).app/Contents/Resources cp -r assets $(APP).app/Contents/Resources - cp cores/* $(APP).app/Contents/Frameworks + cp -r cores $(APP).app/Contents/Resources codesign --force --options runtime --verbose --timestamp --sign "7069CC8A4AE9AFF0493CC539BBA4FA345F0A668B" \ - --entitlements entitlements.xml $(APP).app/Contents/Frameworks/*.dylib + --entitlements pkg/entitlements.xml $(APP).app/Contents/Resources/cores/*.dylib rm -rf $(APP).app/Contents/Resources/database/.git rm -rf $(APP).app/Contents/Resources/assets/.git sips -z 16 16 assets/icon.png --out $(APP).app/Contents/Resources/$(APP).iconset/icon_16x16.png @@ -76,11 +75,11 @@ $(APP).app: ludo $(DYLIBS) sips -z 512 512 assets/icon.png --out $(APP).app/Contents/Resources/$(APP).iconset/icon_512x512.png cp ludo $(APP).app/Contents/MacOS codesign --force --options runtime --verbose --timestamp --sign "7069CC8A4AE9AFF0493CC539BBA4FA345F0A668B" \ - --entitlements entitlements.xml $(APP).app/Contents/MacOS/ludo + --entitlements pkg/entitlements.xml $(APP).app/Contents/MacOS/ludo iconutil -c icns -o $(APP).app/Contents/Resources/$(APP).icns $(APP).app/Contents/Resources/$(APP).iconset rm -rf $(APP).app/Contents/Resources/$(APP).iconset codesign --force --options runtime --verbose --timestamp --sign "7069CC8A4AE9AFF0493CC539BBA4FA345F0A668B" \ - --entitlements entitlements.xml $(APP).app + --entitlements pkg/entitlements.xml $(APP).app empty.dmg: mkdir -p template @@ -98,7 +97,7 @@ dmg: empty.dmg $(APP).app rm -f $(BUNDLENAME)-*.dmg hdiutil convert empty.dmg -quiet -format UDZO -imagekey zlib-level=9 -o $(BUNDLENAME).dmg codesign --force --options runtime --verbose --timestamp --sign "7069CC8A4AE9AFF0493CC539BBA4FA345F0A668B" \ - --entitlements entitlements.xml $(BUNDLENAME).dmg + --entitlements pkg/entitlements.xml $(BUNDLENAME).dmg # For Windows zip: ludo.exe $(DLLS) @@ -125,30 +124,31 @@ DEB_ARCH = amd64 ifeq ($(ARCH), arm) DEB_ARCH = armhf endif - -deb_defaults: - sed -i.bak 's/"\.\/assets"/"\/usr\/local\/share\/ludo\/assets"/' settings/defaults.go - sed -i.bak 's/"\.\/database"/"\/usr\/local\/share\/ludo\/database"/' settings/defaults.go - sed -i.bak 's/"\.\/cores"/"\/usr\/local\/lib\/ludo\/cores"/' settings/defaults.go +DEB_ROOT = ludo_$(VERSION)-1_$(DEB_ARCH) deb: ludo $(SOBJS) - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/DEBIAN - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/bin - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/share/ludo - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/lib/ludo - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/share/applications - mkdir -p ludo_$(VERSION)-1_$(DEB_ARCH)/usr/share/icons/hicolor/1024x1024/apps/ - cp ludo ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/bin - cp -r database ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/share/ludo - cp -r assets ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/share/ludo - cp -r cores ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/lib/ludo - cp assets/icon.png ludo_$(VERSION)-1_$(DEB_ARCH)/usr/share/icons/hicolor/1024x1024/apps/ludo.png - cp ludo.desktop ludo_$(VERSION)-1_$(DEB_ARCH)/usr/local/share/applications - cp control ludo_$(VERSION)-1_$(DEB_ARCH)/DEBIAN - sed -i.bak 's/VERSION/$(VERSION)/' ludo_$(VERSION)-1_$(DEB_ARCH)/DEBIAN/control - sed -i.bak 's/ARCH/$(DEB_ARCH)/' ludo_$(VERSION)-1_$(DEB_ARCH)/DEBIAN/control - rm ludo_$(VERSION)-1_$(DEB_ARCH)/DEBIAN/control.bak - dpkg-deb --build ludo_$(VERSION)-1_$(DEB_ARCH) + mkdir -p $(DEB_ROOT)/DEBIAN + mkdir -p $(DEB_ROOT)/etc + mkdir -p $(DEB_ROOT)/usr/bin + mkdir -p $(DEB_ROOT)/usr/lib/ludo + mkdir -p $(DEB_ROOT)/usr/share/ludo + mkdir -p $(DEB_ROOT)/usr/share/applications + mkdir -p $(DEB_ROOT)/usr/share/icons/hicolor/1024x1024/apps/ + touch $(DEB_ROOT)/etc/ludo.toml + echo "cores_dir = \"/usr/lib/ludo\"" >> $(DEB_ROOT)/etc/ludo.toml + echo "assets_dir = \"/usr/share/ludo/assets\"" >> $(DEB_ROOT)/etc/ludo.toml + echo "database_dir = \"/usr/share/ludo/databbase\"" >> $(DEB_ROOT)/etc/ludo.toml + cp ludo $(DEB_ROOT)/usr/bin + cp cores/* $(DEB_ROOT)/usr/lib/ludo + cp -r assets $(DEB_ROOT)/usr/share/ludo + cp -r database $(DEB_ROOT)/usr/share/ludo + cp assets/icon.png $(DEB_ROOT)/usr/share/icons/hicolor/1024x1024/apps/ludo.png + cp pkg/ludo.desktop $(DEB_ROOT)/usr/share/applications + cp pkg/control $(DEB_ROOT)/DEBIAN + sed -i.bak 's/VERSION/$(VERSION)/' $(DEB_ROOT)/DEBIAN/control + sed -i.bak 's/ARCH/$(DEB_ARCH)/' $(DEB_ROOT)/DEBIAN/control + rm $(DEB_ROOT)/DEBIAN/control.bak + dpkg-deb --build $(DEB_ROOT) clean: rm -rf Ludo.app ludo wc *.dmg *.deb $(BUNDLENAME)-* cores/ diff --git a/go.mod b/go.mod index 3ffed130..646b628b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,7 @@ module github.com/libretro/ludo require ( + github.com/adrg/xdg v0.3.3 // indirect github.com/cavaliercoder/grab v2.0.0+incompatible github.com/davecgh/go-spew v1.1.1 // indirect github.com/disintegration/imaging v1.6.2 diff --git a/go.sum b/go.sum index 08d4d823..773357e9 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/adrg/xdg v0.3.3 h1:s/tV7MdqQnzB1nKY8aqHvAMD+uCiuEDzVB5HLRY849U= +github.com/adrg/xdg v0.3.3/go.mod h1:61xAR2VZcggl2St4O9ohF5qCKe08+JDmE4VNzPFQvOQ= github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= github.com/cavaliercoder/grab v2.0.0+incompatible/go.mod h1:tTBkfNqSBfuMmMBFaO2phgyhdYhiZQ/+iXCZDzcDsMI= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= diff --git a/history/history.go b/history/history.go index 29a4e395..fd9a30c2 100644 --- a/history/history.go +++ b/history/history.go @@ -8,6 +8,8 @@ import ( "log" "os" "path/filepath" + + "github.com/adrg/xdg" ) // Game represents a game in the history file @@ -48,12 +50,7 @@ func Push(g Game) { // Load loads history.csv in memory func Load() error { - home, err := os.UserHomeDir() - if err != nil { - return err - } - - file, err := os.Open(filepath.Join(home, ".ludo", "history.csv")) + file, err := os.Open(filepath.Join(xdg.DataHome, "ludo", "history.csv")) if err != nil { return err } @@ -83,12 +80,7 @@ func Load() error { // Save persists the history as a csv file func Save() error { - home, err := os.UserHomeDir() - if err != nil { - return err - } - - file, err := os.Create(filepath.Join(home, ".ludo", "history.csv")) + file, err := os.Create(filepath.Join(xdg.DataHome, "ludo", "history.csv")) if err != nil { return err } diff --git a/options/options.go b/options/options.go index 333abdd8..0683a511 100644 --- a/options/options.go +++ b/options/options.go @@ -12,6 +12,7 @@ import ( "strings" "sync" + "github.com/adrg/xdg" "github.com/libretro/ludo/state" "github.com/libretro/ludo/utils" "github.com/pelletier/go-toml" @@ -69,11 +70,6 @@ func (o *Options) Save() error { o.Lock() defer o.Unlock() - home, err := os.UserHomeDir() - if err != nil { - return err - } - m := make(map[string]string) for _, v := range o.Vars { m[strings.Replace(v.Key, ".", "___", 1)] = v.Choices[v.Choice] @@ -84,7 +80,7 @@ func (o *Options) Save() error { } name := utils.FileName(state.CorePath) - fd, err := os.Create(filepath.Join(home, ".ludo", name+".toml")) + fd, err := os.Create(filepath.Join(xdg.ConfigHome, "ludo", name+".toml")) if err != nil { return err } @@ -103,13 +99,8 @@ func (o *Options) load() error { o.Lock() defer o.Unlock() - home, err := os.UserHomeDir() - if err != nil { - return err - } - name := utils.FileName(state.CorePath) - b, err := ioutil.ReadFile(filepath.Join(home, ".ludo", name+".toml")) + b, err := ioutil.ReadFile(filepath.Join(xdg.ConfigHome, "ludo", name+".toml")) if err != nil { return err } diff --git a/Info.plist b/pkg/Info.plist similarity index 95% rename from Info.plist rename to pkg/Info.plist index 1d628e4b..bd3c311b 100644 --- a/Info.plist +++ b/pkg/Info.plist @@ -17,7 +17,7 @@ CFBundleVersion 0.1.0 CFBundleIdentifier - org.libretro.ludo + com.libretro.ludo CFBundleDisplayName Ludo CFBundleName diff --git a/control b/pkg/control similarity index 100% rename from control rename to pkg/control diff --git a/entitlements.xml b/pkg/entitlements.xml similarity index 100% rename from entitlements.xml rename to pkg/entitlements.xml diff --git a/ludo.desktop b/pkg/ludo.desktop similarity index 100% rename from ludo.desktop rename to pkg/ludo.desktop diff --git a/settings/defaults.go b/settings/defaults.go index ed9a60ba..072615ec 100644 --- a/settings/defaults.go +++ b/settings/defaults.go @@ -1,32 +1,12 @@ package settings import ( - "log" - "os" "path/filepath" - "runtime" -) -func coresDir() string { - coresDir := "./cores" - // with hardened runtime enabled, dylibs can't be loaded from a relative path - if runtime.GOOS == "darwin" { - exe, err := os.Executable() - if err != nil { - log.Fatalln(err) - } - exeDir := filepath.Dir(exe) - coresDir = filepath.Join(exeDir, "..", "Frameworks") - } - return coresDir -} + "github.com/adrg/xdg" +) func defaultSettings() Settings { - home, err := os.UserHomeDir() - if err != nil { - log.Fatalln(err) - } - return Settings{ VideoFullscreen: false, VideoMonitorIndex: 0, @@ -78,14 +58,14 @@ func defaultSettings() Settings { "SNK - Neo Geo Pocket": "mednafen_ngp_libretro", "Sony - PlayStation": playstationCore, }, - CoresDirectory: coresDir(), + CoresDirectory: "./cores", AssetsDirectory: "./assets", DatabaseDirectory: "./database", - SavestatesDirectory: filepath.Join(home, ".ludo", "savestates"), - SavefilesDirectory: filepath.Join(home, ".ludo", "savefiles"), - ScreenshotsDirectory: filepath.Join(home, ".ludo", "screenshots"), - SystemDirectory: filepath.Join(home, ".ludo", "system"), - PlaylistsDirectory: filepath.Join(home, ".ludo", "playlists"), - ThumbnailsDirectory: filepath.Join(home, ".ludo", "thumbnails"), + SavestatesDirectory: filepath.Join(xdg.DataHome, "ludo", "savestates"), + SavefilesDirectory: filepath.Join(xdg.DataHome, "ludo", "savefiles"), + ScreenshotsDirectory: filepath.Join(xdg.DataHome, "ludo", "screenshots"), + SystemDirectory: filepath.Join(xdg.DataHome, "ludo", "system"), + PlaylistsDirectory: filepath.Join(xdg.DataHome, "ludo", "playlists"), + ThumbnailsDirectory: filepath.Join(xdg.DataHome, "ludo", "thumbnails"), } } diff --git a/settings/settings.go b/settings/settings.go index 42084f8a..b3d6fb87 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -11,6 +11,7 @@ import ( "os" "path/filepath" + "github.com/adrg/xdg" "github.com/fatih/structs" "github.com/libretro/ludo/ludos" "github.com/libretro/ludo/utils" @@ -67,11 +68,6 @@ func Load() error { } }() - home, err := os.UserHomeDir() - if err != nil { - return err - } - // Set default values for settings Current = Defaults @@ -84,7 +80,7 @@ func Load() error { } } - b, err := ioutil.ReadFile(filepath.Join(home, ".ludo", "settings.toml")) + b, err := ioutil.ReadFile(filepath.Join(xdg.ConfigHome, "ludo", "settings.toml")) if err != nil { return err } @@ -102,12 +98,7 @@ func Load() error { // Save saves the current configuration to the home directory func Save() error { - home, err := os.UserHomeDir() - if err != nil { - return err - } - - err = os.MkdirAll(filepath.Join(home, ".ludo"), os.ModePerm) + err := os.MkdirAll(filepath.Join(xdg.ConfigHome, "ludo"), os.ModePerm) if err != nil { return err } @@ -117,7 +108,7 @@ func Save() error { return err } - fd, err := os.Create(filepath.Join(home, ".ludo", "settings.toml")) + fd, err := os.Create(filepath.Join(xdg.ConfigHome, "ludo", "settings.toml")) if err != nil { return err }