...
 
Commits (2)
# For all directories
.deps
*.o
*~
# Binaries and libraries
/src/goodvibes
/src/goodvibes-client
/libcaphe/caphe/libcaphe.a
/libcaphe/tests/caphe-test
# Generated files
/AUTHORS
# Generated makefiles
/Makefile*
/data/Makefile*
/libcaphe/Makefile*
/libcaphe/caphe/Makefile*
/libcaphe/tests/Makefile*
/po/Makefile*
/src/Makefile*
# Generated source files
*enum-types.[ch]
# Data
/data/*.1
/data/*.service
/data/*.service.in
/data/*.desktop
/data/*.desktop.in
/data/*.gschema.xml
/data/*.gschema.valid
/data/*.enums.xml
/data/gschemas.compiled
# M4 macros
/m4/*
!/m4/gv-*.m4
# Autotools stuff
.dirstamp
/INSTALL
/aclocal.m4
/ar-lib
/autom4te.cache/
/compile
/config.guess
/config.log
/config.rpath
/config.status
/config.sub
/configure
/depcomp
/install-sh
/missing
# Documentation
/build
/docs/goodvibes.readthedocs.io/_build
# I18n stuff
/ABOUT-NLS
/po/*.gmo
/po/*.header
/po/*.mo
/po/*.sed
/po/*.sin
/po/Makefile.in.in
/po/Makevars.template
/po/POTFILES
/po/Rules-quot
/po/stamp-it
/po/stamp-po
debian-gcc:
image: registry.gitlab.com/goodvibes/goodvibes/debian:buster
stage: build
script:
- bash -x ./.gitlab-ci/build.sh
debian-clang:
image: registry.gitlab.com/goodvibes/goodvibes/debian:buster
stage: build
only: [ tags ]
variables:
CC: clang
script:
- bash -x ./.gitlab-ci/build.sh
fedora-gcc:
image: registry.gitlab.com/goodvibes/goodvibes/fedora:28
stage: build
only: [ tags ]
script:
- bash -x ./.gitlab-ci/build.sh
fedora-clang:
image: registry.gitlab.com/goodvibes/goodvibes/fedora:28
stage: build
only: [ tags ]
variables:
CC: clang
script:
- bash -x ./.gitlab-ci/build.sh
debian-gcc-no-ui:
image: registry.gitlab.com/goodvibes/goodvibes/debian:buster
stage: build
only: [ tags ]
script:
- bash -x ./.gitlab-ci/build.sh -Dui-enabled=false
debian-gcc-no-feat-hotkeys:
image: registry.gitlab.com/goodvibes/goodvibes/debian:buster
stage: build
only: [ tags ]
script:
- bash -x ./.gitlab-ci/build.sh -Dfeat-hotkeys=false
FROM debian:buster
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive \
apt-get install --yes --no-install-recommends \
clang \
gcc \
gettext \
libglib2.0-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libkeybinder-3.0-dev \
libsoup2.4-dev \
locales \
meson \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
RUN useradd \
--create-home \
--shell /bin/bash \
--uid 4321 \
builder
USER builder
WORKDIR /home/builder
ENV LANG C.UTF-8
FROM fedora:28
RUN dnf -y install \
clang \
findutils \
gcc \
gettext-devel \
glib2-devel \
gstreamer1-devel \
gstreamer1-plugins-base-devel \
gtk3-devel \
keybinder3-devel \
libsoup-devel \
meson \
pkgconfig \
tar \
xz \
&& dnf clean all
RUN useradd \
--create-home \
--shell /bin/bash \
--uid 4321 \
builder
USER builder
WORKDIR /home/builder
ENV LANG C.UTF-8
#!/bin/bash
set -e
set -u
CPPFLAGS="\
-std=gnu99 \
-Wall \
-Wextra \
-Wshadow \
-Werror"
# As long as we use GtkStatusIcon, we need no-deprecated-declarations
CPPFLAGS="$CPPFLAGS -Wno-deprecated-declarations"
# For some casts to GFunc, we get a warning. Typically:
#
# error: cast between incompatible function types from
# ‘void (*)(void *)’ to ‘void (*)(void *, void *)’
# g_list_foreach(core_objects, (GFunc) g_object_unref, NULL);
# ^
# gcc prefers no-cast-function-type
# clang prefers no-bad-function-cast
# It's unclear if an agreement will be reached.
if [ "${CC:-}" == "clang" ]; then
CPPFLAGS="$CPPFLAGS -Wno-bad-function-cast"
else
CPPFLAGS="$CPPFLAGS -Wno-cast-function-type"
fi
export CPPFLAGS
meson build $@
ninja -C build
ninja -C build test
#!/bin/bash
set -e
set -u
fail() { echo >&2 "$@"; exit 1; }
[ $# -eq 1 ] || fail "Usage: $(basename $0) <dockerfile>"
DOCKERFILE=$1
[ -e $DOCKERFILE ] || fail "File '$DOCKERFILE' does not exist"
FROM=$(grep '^FROM' $DOCKERFILE | sed 's/^FROM *//')
[ "$FROM" ] || fail "Failed to parse dockerfile"
TAG=registry.gitlab.com/goodvibes/goodvibes/$FROM
docker build \
--tag $TAG \
--file $DOCKERFILE \
.
cat << EOF
--------
Now you might just want to push the image:
docker push $TAG
EOF
#!/bin/bash
# This script is for developers, not CI.
set -e
set -u
fail() { echo >&2 "$@"; exit 1; }
[ $# -eq 1 ] || fail "Usage: $(basename $0) <image>"
IMAGE=$1
docker run \
--rm \
--tty \
--interactive \
--hostname gvbuilder \
--user root:root \
--volume $(pwd):/home/builder/goodvibes \
--workdir /home/builder/goodvibes \
$IMAGE \
bash
language: c
branches:
only:
- master
compiler:
- gcc
- clang
env:
global:
- CPPFLAGS="-std=gnu99 -Wall -Wextra -Wshadow -Werror -Wno-deprecated-declarations"
matrix:
- IMAGE_NAME="elboulangero/goodvibes-debian"
- IMAGE_NAME="elboulangero/goodvibes-ubuntu"
- IMAGE_NAME="elboulangero/goodvibes-fedora"
build:
pre_ci_boot:
image_name: $IMAGE_NAME
image_tag: latest
pull: true
ci:
- ./autogen.sh && CPPFLAGS="$CPPFLAGS" ./configure --enable-all && make && make install
@PACKAGE_AUTHOR_NAME@ @PACKAGE_AUTHOR_EMAIL@
This diff is collapsed.
RELEASING
=========
MAINTAINING
===========
......@@ -9,42 +9,46 @@ Updating translations
Before every release, it's time to update everything regarding translations, so
that translators have a chance to do their homework !
First, ensure that the file `po/POTFILES.in` is still up to date. This is still
a manual process, but it wouldn't be that hard to write a little script.
First, ensure that the file `po/POTFILES` is still up to date. This is still a
manual process, but it wouldn't be that hard to write a little script.
Then, and before modifying the po files on our side, synchronize with Weblate
and lock it. We can do it either via the web interface, either via the client.
# Lock Weblate translation
wlc lock
# Push changes from Weblate to upstream repository
wlc push
# Pull changes from upstream repository to your local copy
git pull
# Lock Weblate translation
wlc lock
# Make Weblate push its changes to the git repo
wlc push
# Pull changes from the git repo to your local copy
git pull
Then, update the *translation template*, aka. `po/goodvibes.pot`, along with
the *message catalogs*, aka. the po files.
# Update translation files
make -C po update-po
git add po/*.{po,pot}
git commit -m"i18n: update goodvibes.pot and po files"
# Push changes to upstream repository
git push
# Update the pot file and the po files
[ -d build ] || meson build
ninja -C build goodvibes-pot
ninja -C build goodvibes-update-po
# Commit changes
git add po/*.{po,pot}
git commit -m"i18n: Update goodvibes.pot and po files"
# Push changes to upstream repository
git push
At last, we can unlock Weblate and update it.
# Tell Weblate to pull changes (not needed if Weblate follows your repo automatically)
wlc pull
# Unlock translations
wlc unlock
# Tell Weblate to pull changes (not needed if Weblate follows your repo automatically)
wlc pull
# Unlock translations
wlc unlock
For more details, refer to the weblate workflow as described at:
<https://docs.weblate.org/en/latest/admin/continuous.html>.
Releasing
---------
......@@ -60,31 +64,30 @@ Only then you can go on with:
In bash, it translates to something like that:
./scripts/translators.sh code
vi src/ui/gv-about-dialog.c
git commit -am"ui: update translation credits"
./scripts/translators.sh doc
vi docs/goodvibes.readthedocs.io/credits.rst
git commit -am"doc: update translation credits"
vi NEWS
git commit -am"Update translations in changelog"
./scripts/translators.sh code
vi src/ui/gv-about-dialog.c
git commit -am"ui: Update translation credits"
./scripts/translators.sh doc
vi docs/goodvibes.readthedocs.io/credits.rst
git commit -am"doc: Update translation credits"
vi NEWS
git commit -am"news: Update translations"
Then:
- Ensure `NEWS` is up-to-date (check git history and GitHub milestones).
- Bump the version in `configure.ac`.
- Ensure `NEWS` is up-to-date (check Git history and GitLab milestones).
- Bump the version in `meson.build`.
- Git commit, git tag, git push.
In bash, here you go:
vi NEWS
p=0.3.4
v=0.3.5
sed -i "s/${p:?}/${v:?}/" configure.ac
git add NEWS configure.ac
git commit -m "Bump version to ${v:?}"
git tag "v${v:?}"
git push && git push --tags
vi NEWS
v=0.3.5
sed -i -E "s/version: '([0-9.]*)'/version: '$v'/" meson.build
git add NEWS meson.build
git commit -m "Bump version to ${v:?}"
git tag "v${v:?}"
git push && git push --tags
Done.
......@@ -96,22 +99,22 @@ Packaging
After releasing, update the Debian packaging files in the `goodvibes-debian`
repository. Basically, just bump the changelog, there's nothing else to do.
DEBFULLNAME=$(git config user.name) \
DEBEMAIL=$(git config user.email) \
dch --distribution $(dpkg-parsechangelog --show-field Distribution) \
--newversion ${v:?}-0ebo1
DEBFULLNAME=$(git config user.name) \
DEBEMAIL=$(git config user.email) \
dch --distribution $(dpkg-parsechangelog --show-field Distribution) \
--newversion ${v:?}-0ebo1
Git commit, git push. Done
Git commit, git push. Done.
git add debian/changelog
git commit -m "Version ${v:?}"
git push
git add debian/changelog
git commit -m "Version ${v:?}"
git push
Then, just fire the script `debian/build-all.sh`.
export DEBFULLNAME=$(git config user.name)
export DEBEMAIL=$(git config user.email)
./debian/build-all.sh
export DEBFULLNAME=$(git config user.name)
export DEBEMAIL=$(git config user.email)
./debian/build-all.sh
This script is tied to my config and won't work out of the box on someone else
system. But heck, if you're not me, you're not supposed to release anything
......@@ -121,9 +124,67 @@ At last, a few `dput` commands will finish the damn job. Done with packaging.
Artwork
-------
Both svg source files and png files are versioned. To update the png files, run
`make icons`.
Both the svg source files and the png files are versioned. To rebuild the png
files, run:
./scripts/rebuild-images.sh icons
Integrations
------------
This is just for myself to remember what additional services are used for
Goodvibes development, and how it integrates with GitLab.
#### GitLab CI
Up to date documentation should be available on the *Registry* page:
<https://gitlab.com/goodvibes/goodvibes/container_registry>
The configuration is mostly in-tree:
- `.gitlab-ci.yml` describes the different pipelines
- `.gitlab-ci` contains Dockerfiles and associated scripts.
The docker images need to be updated from time to time. The procedure to update
an image is roughly:
DIST=debian
cd .gitlab-ci
# Work on the image
vi Dockerfile.${DIST:?}
# Build the image
./docker-build-image.sh Dockerfile.${DIST:?}
# Log in the registry
docker login registry.gitlab.com
# Push the image
docker push registry.gitlab.com/goodvibes/goodvibes/${DIST:?}
#### GitHub Mirror
Very well documented at: <https://docs.gitlab.com/ee/workflow/repository_mirroring.html>.
In short:
1. Create a GitHub token.
2. Configure GitLab to push automatically, using the token to authenticate.
This mirror is just there for a while, so that active GitHub users (if any)
have time to notice the change.
#### WebLate
Weblate needs to be notified of new commits, so there's a webhook.
Additionally, Weblate needs write permission on the repository. This is
achieved by adding the [Weblate push user](https://gitlab.com/weblate) as a
member of the project. I configured it as a `Developer`, however developers
can't write to protected branches by default, so there's a bit of additional
config.
#### ReadTheDocs
Just needs to be notified of changes, so there's only a webhook.
SUBDIRS = \
data \
libcaphe\
po \
src
EXTRA_DIST = \
autogen.sh \
HACKING.md \
README.md \
RELEASING.md
distclean-local:
find . -name '*~' -print0 | \
xargs --no-run-if-empty -0 rm -vf
indent:
./scripts/code/indent.sh all
icons:
./scripts/images.sh icons
0.4.2 (2018-11-10) - Paris / L'Imperatrice
------------------------------------------
Fixes
* Segfault on application shutdown
0.4.1 (2018-11-10) - Parfum Theremine / L'Imperatrice
-----------------------------------------------------
Outstanding!
* Ready for Flatpak!
General
* Change application id to 'io.gitlab.Goodvibes'.
* Rename icon files according to the app id (flatpak requirement).
* Stations are now saved in $XDG_DATA_HOME (was $XDG_CONFIG_HOME).
* Use GResource to handle glade files. #54
Fixes
* Support lowercase keys in pls playlists. #88
* Add meson post-install script.
Translations
* New translations: Spanish.
0.4 (2018-08-18) - Sphynx / La Femme
------------------------------------
Outstanding!
* Project moved to GitLab, good-bye GitHub.
* CI is now handled by GitLab, good-bye Shippable.
* Build system switched to Meson, good-bye Autotools. #53
General
* Add an appstream file (ie. appdata). #47
Fixes
* Desktop file: exec now accepts url (thx Elías Alejandro Año Mendoza).
Translations
* Updated translations: Dutch, German.
0.3.7 (2018-05-08) - Marilou Reggae (Gainsbourg Cover) / Alain Bashung
----------------------------------------------------------------------
......
Goodvibes
=========
[![Tag](https://img.shields.io/github/tag/elboulangero/goodvibes.svg)](https://github.com/elboulangero/goodvibes/releases)
[![Build](https://img.shields.io/shippable/586380d4666b4b1000d180e8.svg)](https://app.shippable.com/github/elboulangero/goodvibes)
[![Translation](https://hosted.weblate.org/widgets/goodvibes/-/svg-badge.svg)](https://hosted.weblate.org/engage/goodvibes/?utm_source=widget)
[![License](https://img.shields.io/github/license/elboulangero/goodvibes.svg)](COPYING)
<p align="center">
<img src="https://raw.githubusercontent.com/elboulangero/goodvibes/master/data/icons/hicolor/256x256/apps/goodvibes.png" alt="Goodvibes logo"/>
</p>
![Goodvibes Logo](https://gitlab.com/goodvibes/goodvibes/raw/master/data/icons/hicolor/256x256/apps/goodvibes.png)
**Goodvibes** is an internet radio player for GNU/Linux. It aims to be light,
simple, straightforward.
- **Documentation** is available on [Read the Docs](https://goodvibes.readthedocs.io)
- **Development** is hosted on [GitLab](https://gitlab.com/goodvibes/goodvibes)
- **Translation** takes place on [Weblate](https://hosted.weblate.org/projects/goodvibes)
- **Development** is hosted on [GitHub](https://github.com/elboulangero/goodvibes)
- **Artwork** is made by [Hector Lahminèwskï](http://lahminewski-lab.net)
Goodvibes is released under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html),
Goodvibes is released under the [GPLv3+](https://www.gnu.org/licenses/gpl-3.0.html),
and relies on major open-source building blocks such as [GLib][], [LibSoup][],
[GStreamer][] and [GTK+][].
......@@ -35,13 +28,13 @@ For install instructions, please refer to the
Compiling
---------
Goodvibes is written in C and builds with the Autotools.
Goodvibes is written in C and builds with Meson.
At first, make sure you have all the dependencies installed.
*Note*: The following commands assume a Debian-like distribution. If you're
*Note*: The following commands are for a Debian-like distribution. If you're
using another distribution, please adjust the package names and replace `apt`
by whatever yo use.
by whatever you use.
```bash
#
......@@ -49,7 +42,7 @@ by whatever yo use.
#
# Build toolchain
sudo apt install autoconf autopoint build-essential git
sudo apt install build-essential git meson
# Core dependencies
sudo apt install libglib2.0-dev libsoup2.4-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
......@@ -74,17 +67,19 @@ Now you're ready to get the source and compile.
```bash
# Grab the source
git clone https://github.com/elboulangero/goodvibes.git
git clone https://gitlab.com/goodvibes/goodvibes.git
cd goodvibes
# Build
./autogen.sh
./configure
make
# Run from the source tree
./goodvibes-launcher.sh
meson build
ninja -C build
# Install
sudo make install
sudo ninja -C build install
```
You can also run the application in-tree, without installing anything.
```bash
./goodvibes-launcher.sh
```
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
set -e
echo "Running $0..."
# Check installed commands
if ! command -v autoreconf >/dev/null 2>&1; then
echo >&2 "*** 'autoreconf' not found, please install it ***"
exit 1
fi
if ! command -v pkg-config >/dev/null 2>&1; then
echo >&2 "*** 'pkg-config' not found, please install it ***"
exit 1
fi
# Enable pre-commit hook
if [ -f .git/hooks/pre-commit.sample ] && [ ! -f .git/hooks/pre-commit ]; then
# This part is allowed to fail
cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \
chmod +x .git/hooks/pre-commit && \
echo "Activated pre-commit hook." || :
fi
# Autoreconf
autoreconf --force --install --verbose
# Done
echo "Done, please type './configure' to continue."
# Process this file with autoconf
# Init autoconf
# 2.60: obsoleting plenty of stuff
AC_PREREQ([2.60])
AC_INIT([goodvibes], [0.3.7])
: ${CPPFLAGS="-std=gnu99 -Wall -Wextra -Wshadow"}
# Init automake
# 1.11: silent-rules
# 1.14: obsoleting AM_PROG_CC_C_O
AM_INIT_AUTOMAKE([1.14 foreign subdir-objects])
AM_SILENT_RULES([yes])
# Load our own set of m4 macros
AC_CONFIG_MACRO_DIRS([m4])
# Additional package information
GV_ADD_GLOBAL_VAR([PACKAGE_CAMEL_NAME], ["Goodvibes"])
GV_ADD_GLOBAL_VAR([PACKAGE_ALLCAPS_NAME], ["GOODVIBES"])
GV_ADD_GLOBAL_VAR([PACKAGE_LONG_NAME], ["Goodvibes Radio Player"])
GV_ADD_GLOBAL_VAR([PACKAGE_APPLICATION_ID], ["com.elboulangero.Goodvibes"])
GV_ADD_GLOBAL_VAR([PACKAGE_APPLICATION_PATH], ["/com/elboulangero/Goodvibes"])
GV_ADD_GLOBAL_VAR([PACKAGE_AUTHOR_NAME], ["Arnaud Rebillout"])
GV_ADD_GLOBAL_VAR([PACKAGE_AUTHOR_EMAIL], ["<elboulangero@gmail.com>"])
GV_ADD_GLOBAL_VAR([PACKAGE_COPYRIGHT], ["Copyright (C) 2015-2017"])
GV_ADD_GLOBAL_VAR([PACKAGE_HOMEPAGE], ["http://goodvibes.elboulangero.com"])
# ------------------------------------- #
# Toolchain #
# ------------------------------------- #
AS_ECHO(["---- Toolchain ----"])
AC_PROG_CC()
AC_PROG_INSTALL()
PKG_PROG_PKG_CONFIG()
# To build static libraries (libcaphe)
AC_PROG_RANLIB()
AM_PROG_AR()
# For glib settings
GLIB_GSETTINGS()
# ------------------------------------- #
# Internationalization (i18n) #
# ------------------------------------- #
AS_ECHO(["---- I18n ----"])
# Init gettext
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19.7])
# ------------------------------------- #
# Mandatory dependencies #
# ------------------------------------- #
# Check for core dependencies
# - gio-unix-2.0 is needed for libcaphe. In a perfect world, libcaphe
# (and therefore gio-unix-2.0) should depend on the inhibitor feature.
AS_ECHO(["---- Core ----"])
PKG_CHECK_MODULES([GLIB], [glib-2.0, gobject-2.0, gio-2.0, gio-unix-2.0 >= 2.44])
PKG_CHECK_MODULES([LIBSOUP], [libsoup-2.4 >= 2.42])
PKG_CHECK_MODULES([GST], [gstreamer-1.0, gstreamer-base-1.0, gstreamer-audio-1.0 >= 1.4.4])
# Libcaphe flags
CAPHE_CFLAGS="-I../libcaphe/"
CAPHE_LIBS="../libcaphe/caphe/libcaphe.a"
AC_SUBST(CAPHE_CFLAGS)
AC_SUBST(CAPHE_LIBS)
# ------------------------------------- #
# Optional dependencies #
# ------------------------------------- #
# The default behavior is as following:
# - a feature that doesn't require an extra library is enabled.
# - a feature that requires an extra library is set to 'auto',
# and will be enabled only if the required library is found.
feat_noextra="yes"
feat_extra="auto"
# The default behavior can be modified with the '--enable-all' switch.
# If you want to use it, expect the following behavior:
# - --enable-all Build a full-featured version (maximum dependencies).
# This will force the compilation of every feature,
# and fail the build if a dependency is not met.
# - --disable-all Build a lightweight version (minimum dependencies).
# This will exclude every feature from the build.
AC_ARG_ENABLE(all, AS_HELP_STRING([--enable-all], [Enable every features]))
if test -n "$enable_all"; then
feat_noextra="$enable_all"
feat_extra="$enable_all"
fi
# For a higher degree of granularity, every feature has its own switch.
# If you want to use it, expect the following behavior:
# - --enable-FEATURE Force the compilation of a feature, and fail
# the build if dependencies are not met.
# - --disable-FEATURE Exclude a feature from the build.
# Check for ui dependencies
# Notice that the UI is managed as a feature here.
AS_ECHO(["---- Ui ----"])
GV_FEATURE_ENABLE([ui], [Gtk+ graphical user interface], [$feat_extra])
GV_FEATURE_PKG_CHECK([ui], [UI], [gtk+-3.0 >= 3.12.0])
AM_CONDITIONAL([UI_ENABLED], [test "$enable_ui" = "yes"])
# Check for core features dependencies
AS_ECHO(["---- Core Features ----"])
GV_FEATURE_ENABLE([console_output], [console output support], [$feat_noextra])
GV_FEATURE_ENABLE([dbus_server], [dbus server support], [$feat_noextra])
GV_FEATURE_ENABLE([inhibitor], [inhibitor support], [$feat_noextra])
AM_CONDITIONAL([CONSOLE_OUTPUT_ENABLED], [test "$enable_console_output" = "yes"])
AM_CONDITIONAL([DBUS_SERVER_ENABLED], [test "$enable_dbus_server" = "yes"])
AM_CONDITIONAL([INHIBITOR_ENABLED], [test "$enable_inhibitor" = "yes"])
# Check for ui features dependencies
# If the ui is disabled, ensure features are disabled as well.
AS_ECHO(["---- Ui Features ----"])
if test "$enable_ui" = "no"; then
feat_noextra="no"
feat_extra="no"
fi
GV_FEATURE_ENABLE([hotkeys], [hotkeys support], [$feat_extra])
GV_FEATURE_ENABLE([notifications], [notifications support], [$feat_noextra])
GV_FEATURE_PKG_CHECK([hotkeys], [HOTKEYS], [keybinder-3.0 >= 0.3])
AM_CONDITIONAL([HOTKEYS_ENABLED], [test "$enable_hotkeys" = "yes"])
AM_CONDITIONAL([NOTIFICATIONS_ENABLED], [test "$enable_notifications" = "yes"])
# ------------------------------------- #
# Output files #
# ------------------------------------- #
AS_ECHO(["---- Output Files ----"])
# Files to be created
AC_CONFIG_FILES([
AUTHORS
Makefile
data/Makefile
data/$PACKAGE_NAME.1
data/$PACKAGE_NAME-client.1
data/$PACKAGE_APPLICATION_ID.service.in
data/$PACKAGE_APPLICATION_ID.desktop.in
data/$PACKAGE_APPLICATION_ID.gschema.xml
libcaphe/Makefile
libcaphe/caphe/Makefile
libcaphe/tests/Makefile
po/Makefile.in
src/Makefile
])
AC_OUTPUT()
# ------------------------------------- #
# Summary #
# ------------------------------------- #
# String for silent rules
is_silent_rules_enabled=no
if test "$AM_DEFAULT_VERBOSITY" = "0"; then
is_silent_rules_enabled=yes
fi
AS_ECHO(["
-------------------------------------------------------------
~ $PACKAGE_LONG_NAME - $PACKAGE_VERSION ~
Core
----
Console output : $enable_console_output
D-Bus server : $enable_dbus_server
Inhibitor : $enable_inhibitor
Ui : $enable_ui
--
Hotkeys : $enable_hotkeys
Notifications : $enable_notifications
Build
-----
Silent rules : $is_silent_rules_enabled
CC : $CC
CFLAGS : $CFLAGS
CPPFLAGS : $CPPFLAGS
LDFLAGS : $LDFLAGS
LIBS : $LIBS
-------------------------------------------------------------
Configuration finished, please type 'make' to compile."])
EXTRA_DIST =
DISTCLEANFILES =
CLEANFILES =
# ----------------------------------------------------- #
# D-Bus Service File #
# ----------------------------------------------------- #
servicedir = $(datadir)/dbus-1/services
service_in_in_files = @PACKAGE_APPLICATION_ID@.service.in.in
service_in_files = @PACKAGE_APPLICATION_ID@.service.in
service_DATA = $(service_in_files:.in=)
# Rule to make the service file with bindir expanded
$(service_DATA): $(service_in_files) Makefile
@sed -e "s|bindir|$(bindir)|" $< > $@
EXTRA_DIST += $(service_in_in_files)
DISTCLEANFILES += $(service_in_files)
CLEANFILES += $(service_DATA)
# ----------------------------------------------------- #
# Desktop File #
# ----------------------------------------------------- #
desktopdir = $(datadir)/applications
desktop_in_in_files = @PACKAGE_APPLICATION_ID@.desktop.in.in
desktop_in_files = $(desktop_in_in_files:.in=)
desktop_DATA = $(desktop_in_files:.in=)
# Translate with gettext
%.desktop: %.desktop.in
msgfmt --desktop -d $(top_srcdir)/po --template $< -o $@
EXTRA_DIST += $(desktop_in_in_files)
DISTCLEANFILES += $(desktop_in_files)
CLEANFILES += $(desktop_DATA)
# ----------------------------------------------------- #
# GSettings Schemas #
# ----------------------------------------------------- #
gsettings_ENUM_NAMESPACE = @PACKAGE_APPLICATION_ID@
gsettings_ENUM_FILES = $(shell find $(top_srcdir)/src -type f -name '*.h')
gsettings_SCHEMAS = @PACKAGE_APPLICATION_ID@.gschema.xml
@GSETTINGS_RULES@
# Compile schemas for running from the source tree
gschemas.compiled: $(gsettings_SCHEMAS:.xml=.valid)
$(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) .
all-local: gschemas.compiled
EXTRA_DIST += $(gsettings_SCHEMAS).in
DISTCLEANFILES += $(gsettings_SCHEMAS)
CLEANFILES += gschemas.compiled
# ----------------------------------------------------- #
# Icons #
# ----------------------------------------------------- #
icon16dir = $(datadir)/icons/hicolor/16x16/apps
icon16_DATA = icons/hicolor/16x16/apps/@PACKAGE_NAME@.png
icon22dir = $(datadir)/icons/hicolor/22x22/apps
icon22_DATA = icons/hicolor/22x22/apps/@PACKAGE_NAME@.png
icon24dir = $(datadir)/icons/hicolor/24x24/apps
icon24_DATA = icons/hicolor/24x24/apps/@PACKAGE_NAME@.png
icon32dir = $(datadir)/icons/hicolor/32x32/apps
icon32_DATA = icons/hicolor/32x32/apps/@PACKAGE_NAME@.png
icon48dir = $(datadir)/icons/hicolor/48x48/apps
icon48_DATA = icons/hicolor/48x48/apps/@PACKAGE_NAME@.png
icon256dir = $(datadir)/icons/hicolor/256x256/apps
icon256_DATA = icons/hicolor/256x256/apps/@PACKAGE_NAME@.png
icon512dir = $(datadir)/icons/hicolor/512x512/apps
icon512_DATA = icons/hicolor/512x512/apps/@PACKAGE_NAME@.png
iconsymdir = $(datadir)/icons/hicolor/symbolic/apps
iconsym_DATA = icons/hicolor/symbolic/apps/@PACKAGE_NAME@-symbolic.svg
EXTRA_DIST += \
$(icon16_DATA) \
$(icon22_DATA) \
$(icon24_DATA) \
$(icon32_DATA) \
$(icon48_DATA) \
$(icon256_DATA) \
$(icon512_DATA) \
$(iconsym_DATA) \
icons/src/@PACKAGE_NAME@-large.svg \
icons/src/@PACKAGE_NAME@-small.svg
# ----------------------------------------------------- #
# Manual Pages #
# ----------------------------------------------------- #
man1_in_files = $(wildcard *.1.in)
man1_MANS = $(man1_in_files:.in=)
EXTRA_DIST += $(man1_in_files)
DISTCLEANFILES += $(man1_MANS)
# ----------------------------------------------------- #
# Ui Files #
# ----------------------------------------------------- #
uidir = $(pkgdatadir)/ui
ui_DATA = $(wildcard ui/*.glade)
EXTRA_DIST += $(ui_DATA)
[D-BUS Service]
Name=@PACKAGE_APPLICATION_ID@
Exec=bindir/@PACKAGE_NAME@ --background
.TH "@PACKAGE_ALLCAPS_NAME@-CLIENT" "1" "February 2017"
.TH "@PACKAGE@-CLIENT" "1" "July 2018" "@package@-client @version@"
.SH NAME
@PACKAGE_NAME@-client \- command-line client for @PACKAGE_NAME@
@package@-client \- command-line client for @package@
.SH SYNOPSIS
.B @PACKAGE_NAME@-client
.B @package@-client
[OPTIONS...]
.SH DESCRIPTION
.B @PACKAGE_NAME@-client
is the command-line client for @PACKAGE_NAME@.
It communicates through the native D-Bus interface, which therefore must be enabled in @PACKAGE_NAME@.
.B @package@-client
is the command-line client for @package@.
It communicates through the native D-Bus interface, which therefore must be enabled in @package@.
For more details, type '@PACKAGE_NAME@-client help'.
For more details, type '@package@-client help'.
.SH AUTHORS
Written by @PACKAGE_AUTHOR_NAME@.
Written by @author@.
.SH SEE ALSO
.nf
.BR @PACKAGE_NAME@ (1)
\fI\%@PACKAGE_HOMEPAGE@\fR\&
.BR @package@ (1)
\fI\%@homepage@\fR\&
.fi
.TH "@PACKAGE_ALLCAPS_NAME@" "1" "February 2017"
.TH "@PACKAGE@" "1" "July 2018" "@package@ @version@"
.SH NAME
@PACKAGE_NAME@ \- a lightweight internet radio player for GNU/Linux
@package@ \- a lightweight internet radio player for GNU/Linux
.SH SYNOPSIS
.B @PACKAGE_NAME@
.B @package@
[OPTIONS...] [STATION]
.SH DESCRIPTION
.B @PACKAGE_CAMEL_NAME@
.B @Package@
is a lightweight internet radio player for GNU/Linux.
It offers a simple way to have your favorite radio stations at easy reach.
It provides everything you can expect from a modern media player: multimedia keys binding, mpris2 support, notifications, and sleep inhibition.
It can be launched with or without GUI, and comes with a command-line client.
.PP
This manual page is only a short reference for @PACKAGE_CAMEL_NAME@.
Complete documentation is available at \fI\%@PACKAGE_HOMEPAGE@\fR\&.
This manual page is only a short reference for @Package@.
Complete documentation is available at \fI\%@homepage@\fR\&.
.SH OPTIONS
.TP
......@@ -42,10 +42,10 @@ Disable the graphical user interface at startup.
Launch as a status icon (deprecated on modern desktops).
.SH AUTHORS
Written by @PACKAGE_AUTHOR_NAME@.
Written by @author@.
.SH SEE ALSO
.nf
.BR @PACKAGE_NAME@-client (1)
\fI\%@PACKAGE_HOMEPAGE@\fR\&
.BR @package@-client (1)
\fI\%@homepage@\fR\&
.fi
# SPDX-License-Identifier: GPL-3.0-or-later
themes = [
[ 'hicolor', [
[ '16x16', gv_icon_name + '.png' ],
[ '22x22', gv_icon_name + '.png' ],
[ '24x24', gv_icon_name + '.png' ],
[ '32x32', gv_icon_name + '.png' ],
[ '48x48', gv_icon_name + '.png' ],
[ '256x256', gv_icon_name + '.png' ],
[ '512x512', gv_icon_name + '.png' ],
[ 'symbolic', gv_icon_name + '-symbolic.svg' ],
]]
]
foreach i : themes
theme = i[0]
sizes = i[1]
foreach i : sizes
size = i[0]
icon = i[1]
install_data(join_paths(theme, size, 'apps', icon),
install_dir : join_paths(datadir, 'icons', theme, size, 'apps')
)
endforeach
endforeach
......@@ -17,7 +17,6 @@
version="1.1"
inkscape:version="0.92.3pre0 (0ab9bec, 2018-03-03)"
sodipodi:docname="goodvibes-favicon.svg"
inkscape:export-filename="/Users/jbx/Desktop/gooV5-0.png"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300">
<defs
......
......@@ -477,8 +477,7 @@
y="367.25461"
ry="35.15802"
inkscape:export-xdpi="150"
inkscape:export-ydpi="150"
inkscape:export-filename="/home/art/dev/goodvibes/goodvibes/data/icons/hicolor/256x256/apps/goodvibes.png" />
inkscape:export-ydpi="150" />
<g
transform="matrix(0.60954107,0,0,0.60954107,39.690129,224.13705)"
inkscape:export-ydpi="150"
......
......@@ -477,8 +477,7 @@
y="367.25461"
ry="35.15802"
inkscape:export-xdpi="150"
inkscape:export-ydpi="150"
inkscape:export-filename="/home/art/dev/goodvibes/goodvibes/data/icons/hicolor/256x256/apps/goodvibes.png" />
inkscape:export-ydpi="150" />
<g
transform="matrix(0.6271852,0,0,0.6271852,4.4910724,265.29016)"
id="g5449">
......
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>io.gitlab.Goodvibes</id>
<name>Goodvibes</name>
<summary>Play web radios</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<description>
<p>
Goodvibes is a simple internet radio player for GNU/Linux.
</p>
<p>
It comes with every basic features you can expect from an audio player,
such as multimedia keys, notifications, system sleep inhibition, and
MPRIS2 support.
</p>
</description>
<screenshots>
<screenshot type="default">
<image>https://goodvibes.gitlab.io/appdata/screenshot-2018-11-10-light.png</image>
</screenshot>
<screenshot>
<image>https://goodvibes.gitlab.io/appdata/screenshot-2018-11-10-light-prefs.png</image>
</screenshot>
<screenshot>
<image>https://goodvibes.gitlab.io/appdata/screenshot-2018-11-10-dark-with-appmenu.png</image>
</screenshot>
</screenshots>
<releases>
<release version="0.4.1" date="2018-11-10"/>
<release version="0.4" date="2018-08-18"/>
<release version="0.3" date="2017-02-20"/>
<release version="0.2" date="2017-01-26"/>
<release version="0.1" date="2017-01-13"/>
</releases>
<url type="homepage">https://gitlab.com/goodvibes/goodvibes</url>
<url type="bugtracker">https://gitlab.com/goodvibes/goodvibes/issues</url>
<url type="help">https://goodvibes.readthedocs.io</url>
<url type="translate">https://hosted.weblate.org/projects/goodvibes</url>
<launchable type="desktop-id">io.gitlab.Goodvibes.desktop</launchable>
<translation type="gettext">goodvibes</translation>
<provides>
<binary>goodvibes</binary>
</provides>
<update_contact>elboulangero_at_gmail.com</update_contact>
</component>
[Desktop Entry]
Name=@PACKAGE_LONG_NAME@
Name=Goodvibes
GenericName=Radio Player
Comment=Play web radios
# TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
......@@ -7,7 +7,7 @@ Keywords=Audio;Radio;Player;
Categories=GTK;AudioVideo;Audio;Player;
Type=Application
# TRANSLATORS: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=@PACKAGE_NAME@
Exec=@PACKAGE_NAME@
Icon=io.gitlab.Goodvibes
Exec=goodvibes %u
DBusActivatable=true
MimeType=audio/*;
......@@ -2,7 +2,7 @@
<schemalist>
<!-- Core settings -->
<schema id="@PACKAGE_APPLICATION_ID@.Core" path="@PACKAGE_APPLICATION_PATH@/Core/">
<schema id="@id@.Core" path="@path@/Core/">
<key name="pipeline-enabled" type="b">
<default>false</default>
<summary>Enable custom pipeline</summary>
......@@ -47,7 +47,7 @@
</schema>
<!-- UI settings -->
<schema id="@PACKAGE_APPLICATION_ID@.Ui" path="@PACKAGE_APPLICATION_PATH@/Ui/">
<schema id="@id@.Ui" path="@path@/Ui/">
<key name="window-size" type="(ii)">
<default>(-1, -1)</default>
<summary>Main window size</summary>
......@@ -63,17 +63,17 @@
<summary>Autoset main window height</summary>
<description>Automatically set the main window position</description>
</key>
<key name="theme-variant" enum="@PACKAGE_APPLICATION_ID@.GvMainWindowThemeVariant">
<key name="theme-variant" enum="@id@.GvMainWindowThemeVariant">
<default>'default'</default>
<summary>Theme variant</summary>
<description>Prefer a different variant of the theme (if available)</description>
</key>
<key name="middle-click-action" enum="@PACKAGE_APPLICATION_ID@.GvStatusIconMiddleClick">
<key name="middle-click-action" enum="@id@.GvStatusIconMiddleClick">
<default>'toggle'</default>
<summary>Middle click action</summary>
<description>Action for middle click on the status icon</description>
</key>
<key name="scroll-action" enum="@PACKAGE_APPLICATION_ID@.GvStatusIconScroll">
<key name="scroll-action" enum="@id@.GvStatusIconScroll">
<default>'station'</default>
<summary>Scroll action</summary>
<description>Action for mouse scroll on the status icon</description>
......@@ -81,7 +81,7 @@
</schema>
<!-- Feature settings -->
<schema id="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat">
<key name="enabled" type="b">
<default>false</default>
<summary>Enable the feature</summary>
......@@ -89,27 +89,27 @@
</key>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.ConsoleOutput" path="@PACKAGE_APPLICATION_PATH@/Feat/ConsoleOutput/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.ConsoleOutput" path="@path@/Feat/ConsoleOutput/" extends="@id@.Feat">
<override name="enabled">false</override>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.DBusServerNative" path="@PACKAGE_APPLICATION_PATH@/Feat/DBusServerNative/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.DBusServerNative" path="@path@/Feat/DBusServerNative/" extends="@id@.Feat">
<override name="enabled">true</override>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.DBusServerMpris2" path="@PACKAGE_APPLICATION_PATH@/Feat/DBusServerMpris2/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.DBusServerMpris2" path="@path@/Feat/DBusServerMpris2/" extends="@id@.Feat">
<override name="enabled">true</override>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.Inhibitor" path="@PACKAGE_APPLICATION_PATH@/Feat/Inhibitor/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.Inhibitor" path="@path@/Feat/Inhibitor/" extends="@id@.Feat">
<override name="enabled">false</override>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.Hotkeys" path="@PACKAGE_APPLICATION_PATH@/Feat/Hotkeys/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.Hotkeys" path="@path@/Feat/Hotkeys/" extends="@id@.Feat">
<override name="enabled">false</override>
</schema>
<schema id="@PACKAGE_APPLICATION_ID@.Feat.Notifications" path="@PACKAGE_APPLICATION_PATH@/Feat/Notifications/" extends="@PACKAGE_APPLICATION_ID@.Feat">
<schema id="@id@.Feat.Notifications" path="@path@/Feat/Notifications/" extends="@id@.Feat">
<override name="enabled">false</override>
</schema>
......
[D-BUS Service]
Name=@dbus_name@
Exec=@bindir@/@binary@ --background
# SPDX-License-Identifier: GPL-3.0-or-later
# My understanding of meson (a beginner guide)
#
# 'configure step' and 'build step'
#
# *Configure files* are generated early when creating the build directory with
# 'meson 'builddir', and afterward Meson automatically update these files if
# the source changes. Therefore, my understanding is that there's no need to
# declare a dependency to ensure configure files are up-to-date: they're always
# up-to-date.
#
# However, custom_target() has a 'depend_files:' keyword for declaring
# dependencies on files. It's unclear if we need to use it for configure files.
# I'd say no need.
#
# *Build targets* are, on the other hand, part of a dependency chain, and the
# 'depends:' keyword must be used to indicate a dependency. This is mandatory.
#
# 'source dir' and 'build dir'
#
# Meson has a clear concept of 'source dir' and 'build dir'.
#
# When you give a relative path to 'input:', meson assumes it's relative to
# 'source dir'. Beware when you need to use configure files as inputs, as they
# live in 'build dir'.
#
# References
#
# <http://mesonbuild.com/Overview.html>
#
# Credit for this file goes to <https://github.com/pithos/pithos>.
# ----------------------------------------------------- #
# D-Bus Service File #
# ----------------------------------------------------- #
# <https://dbus.freedesktop.org/doc/system-activation.txt>
services_dir = join_paths(datadir, 'dbus-1/services')
service_conf = configuration_data()
service_conf.set('bindir', bindir)
service_conf.set('binary', gv_binary)
service_conf.set('dbus_name', gv_application_id)
configure_file(
input: gv_application_id + '.service.in',
output: gv_application_id + '.service',
configuration: service_conf,
install_dir: services_dir,
)
# XXX It would be nice to have a tool to validate the service file.
# ----------------------------------------------------- #
# Desktop File #
# ----------------------------------------------------- #
# <https://specifications.freedesktop.org/desktop-entry-spec/latest/>
# XXX It would be nice to have desktop.in created with configure_file(),
# so that we can do some variable substitution, like for the other data
# files here. However, it means that the POTFILES should list the built
# file, which lives in the build dir. Right now it doesn't work.
# https://github.com/mesonbuild/meson/issues/1733
applications_dir = join_paths(datadir, 'applications')
desktop_file = i18n.merge_file(
input: gv_application_id + '.desktop.in',
output: gv_application_id + '.desktop',
po_dir: '../po',
type: 'desktop',
install: true,
install_dir: applications_dir,
)
desktop_utils = find_program('desktop-file-validate', required: false)
if desktop_utils.found()
test('Validate desktop file', desktop_utils,
args: [ desktop_file ],
)
endif
# ----------------------------------------------------- #
# Appstream File #
# ----------------------------------------------------- #
# <https://www.freedesktop.org/software/appstream/docs/>
appstream_dir = join_paths(datadir, 'metainfo')
appstream_file = i18n.merge_file(
input: gv_application_id + '.appdata.xml.in',
output: gv_application_id + '.appdata.xml',
po_dir: '../po',
type: 'xml',
install: true,
install_dir: appstream_dir,
)
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
# Relaxed validation, our screenshots don't meet the expectations
# (16:9 without padding is definitely not suitable).
test('Validate appstream file', appstream_util,
args: [ 'validate-relax', appstream_file ]
)
endif
# ----------------------------------------------------- #
# GSettings Schemas #
# ----------------------------------------------------- #
# <https://developer.gnome.org/gio/stable/GSettings.html>
schemas_dir = join_paths(datadir, 'glib-2.0', 'schemas')
schema_conf = configuration_data()
schema_conf.set('id', gv_application_id)
schema_conf.set('path', gv_application_path)
schema_file = configure_file(
input: gv_application_id + '.gschema.xml.in',
output: gv_application_id + '.gschema.xml',
configuration: schema_conf,
install_dir: schemas_dir,
)
#gv_settings = gnome.compile_schemas(
# depend_files: schema_file
#)
# Generate enums.xml file.
# XXX gnome.compile_schemas() can't generate the enum.xml file automatically,
# like it was done with the autotools. We need to do it explicitly.
# https://github.com/mesonbuild/meson/issues/1687
# XXX It's unfortunate that we have to list the headers here,
# maybe that would be better done in src/ ?
enum_headers = [
'../src/ui/gv-main-window.h',
'../src/ui/gv-status-icon.h',
]
generate_enums = gnome.mkenums(gv_application_id + '.enums.xml',
sources: enum_headers,
comments: '<!-- @comment@ -->',
fhead: '<schemalist>',
vhead: ' <@type@ id="' + gv_application_id + '.@EnumName@">',
vprod: ' <value nick="@valuenick@" value="@valuenum@"/>',
vtail: ' </@type@>',
ftail: '</schemalist>',
install_header: true,
install_dir: schemas_dir
)
# Compile schemas for running the application in-tree
# XXX We use a custom target, because gnome.compile_schemas()
# would run in the source dir rather than the build dir, hence
# missing the generated 'enums.xml' file.
# https://github.com/mesonbuild/meson/issues/1687
compile_schemas = custom_target('glib-compile-schemas',
output: 'gschemas.compiled',
build_by_default: true,
install: false,
command: [
find_program('glib-compile-schemas'),
meson.current_build_dir(),
],
depends: [ generate_enums ],
)
compile_schemas = find_program('glib-compile-schemas', required: false)
if compile_schemas.found()
test('Validate schema file', compile_schemas,
args: [ '--strict', '--dry-run', meson.current_build_dir() ],
# Requires meson >= 0.46, commenting for now
# depends: [ generate_enums ],
)
endif
# ----------------------------------------------------- #
# Old GSettings Schemas #