Skip to content

Commit

Permalink
feat: test suite and ci improvements
Browse files Browse the repository at this point in the history
linux build is dismissed (using distro packages or source recommended) and
release builds target win64 built using msvc

also implemented skip labels:
- skip-test
- skip-lint
- skip-release

test will list info about plugins found in any directory in a json file

also includes various ci fixes
  • Loading branch information
jaromil committed Dec 28, 2022
1 parent dcbc1ff commit 28ed154
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 66 deletions.
127 changes: 74 additions & 53 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
c-lint:
name: 🚨 C lint
runs-on: ubuntu-latest
if: "!contains(github.event.pull_request.labels.*.name, 'skip-lint')"
steps:
- uses: actions/checkout@v3
- uses: reviewdog/action-cpplint@master
Expand Down Expand Up @@ -58,16 +59,44 @@ jobs:
,-whitespace/semicolon\
,-build/include_subdir\
,-build/include_order\
" # Optional
# - name: Fail fast?!
# if: steps.linter.outputs.checks-failed > 0
# run: |
# echo "😤 Some files failed the C linting checks!"
"

test-suite:
name: 🔬 test
needs: [c-lint]
if: "!contains(github.event.pull_request.labels.*.name, 'skip-test')"
strategy:
matrix:
compiler: [clang-14]
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: install dependencies
run: |
sudo apt-get update -qy
sudo apt-get install --no-install-recommends -y ${{ matrix.compiler }} cmake ninja-build libfreetype-dev libopencv-dev libcairo2-dev libgavl-dev
- name: ${{ matrix.compiler }} initialize cmake build
run: |
mkdir -p build && cd build
cmake -G "Ninja" ../
- name: ${{ matrix.compiler }} run ninja build
run: |
cd build && ninja
- name: ${{ matrix.compiler }} analyze plugins
run: |
cd test && make
- name: ${{ matrix.compiler }} upload plugin analysis
uses: actions/upload-artifact@v3
with:
name: release-plugin-analysis
path: test/*.json

semantic-release:
name: 🤖 Semantic release
runs-on: ubuntu-latest
needs: [test-suite]
if: "!contains(github.event.pull_request.labels.*.name, 'skip-release')"
# if: ${{ github.ref_name == 'master' && github.event_name == 'push' }}
outputs:
release: ${{ steps.tag_release.outputs.release }}
Expand Down Expand Up @@ -95,51 +124,42 @@ jobs:
awk '/Published release/ { printf("version=v%s\n",$8) }' semantic-release.log >> $GITHUB_OUTPUT
fi
cmake-build:
name: 🏗️ cmake build linux amd64
needs: [c-lint, semantic-release]
if: "!contains(github.event.pull_request.labels.*.name, 'SKIP_MESON')"
strategy:
matrix:
compiler: [clang-14]
fail-fast: false
runs-on: ubuntu-latest
msvc-build:
name: 💻 msvc build win64
runs-on: windows-latest
needs: [semantic-release, test-suite, c-lint]
if: ${{ needs.semantic-release.outputs.release == 'True' }}
steps:
- uses: actions/checkout@v3
- name: install compiler and dependencies
run: |
sudo apt-get update -qy
sudo apt-get install --no-install-recommends -y ${{ matrix.compiler }} cmake ninja-build
# libfreetype-dev libopencv-dev libcairo2-dev libgavl-dev
- name: ${{ matrix.compiler }} initialize cmake build
run: |
mkdir -p build && cd build
cmake -G "Ninja" ../
- name: ${{ matrix.compiler }} make build
- uses: ilammy/msvc-dev-cmd@v1
- name: choco install deps
uses: crazy-max/ghaction-chocolatey@v2
with:
args: install libopencv-dev
- name: Build using nmake
run: |
cd build && ninja
- name: Upload artifacts from clang build
mkdir build && cd build
cmake -G "NMake Makefiles" ../
nmake
- name: Upload win64 filters
uses: actions/upload-artifact@v3
if: ${{ needs.semantic-release.outputs.release == 'True' }}
with:
name: release-filters-linux-amd64
path: build/src/filter/**/*.so
- name: Upload artifacts from clang build
name: release-win64-filters
path: build/src/filter/**/*.dll
- name: Upload win64 mixers
uses: actions/upload-artifact@v3
if: ${{ needs.semantic-release.outputs.release == 'True' }}
with:
name: release-mixers-linux-amd64
path: build/src/mixer*/**/*.so
- name: Upload artifacts from clang build
name: release-win64-mixers
path: build/src/mixer*/**/*.dll
- name: Upload win64 generators
uses: actions/upload-artifact@v3
if: ${{ needs.semantic-release.outputs.release == 'True' }}
with:
name: release-generators-linux-amd64
path: build/src/generator/**/*.so
name: release-win64-generators
path: build/src/generator/**/*.dll

draft-binary-release:
name: 📦 Pack release
needs: [cmake-build, semantic-release]
needs: [semantic-release, msvc-build]
if: ${{ needs.semantic-release.outputs.release == 'True' }}
runs-on: ubuntu-latest
steps:
Expand All @@ -149,35 +169,36 @@ jobs:
with:
path: |
frei0r-bin
- name: show directory structure
run: tree -dL 3
- name: create compressed archives
run: |
cd frei0r-bin
dst=frei0r-mixers_${{ needs.semantic-release.outputs.version }}_linux-amd64
mkdir $dst && find release-mixers-linux-amd64 -type f -name '*.so' -exec cp {} $dst \;
dst=frei0r-filters_${{ needs.semantic-release.outputs.version }}_win64
mkdir $dst && find release-win64-filters -type f -name '*.dll' -exec cp {} $dst \;
cp ../README.md ../COPYING ../ChangeLog ../AUTHORS $dst
echo "${{ needs.semantic-release.outputs.version }}" > $dst/VERSION
tar cfz $dst.tar.gz $dst
dst=frei0r-filters_${{ needs.semantic-release.outputs.version }}_linux-amd64
mkdir $dst && find release-filters-linux-amd64 -type f -name '*.so' -exec cp {} $dst \;
zip -r -9 $dst.zip $dst
dst=frei0r-mixers_${{ needs.semantic-release.outputs.version }}_win64
mkdir $dst && find release-win64-mixers -type f -name '*.dll' -exec cp {} $dst \;
cp ../README.md ../COPYING ../ChangeLog ../AUTHORS $dst
echo "${{ needs.semantic-release.outputs.version }}" > $dst/VERSION
tar cfz $dst.tar.gz $dst
dst=frei0r-generators_${{ needs.semantic-release.outputs.version }}_linux-amd64
mkdir $dst && find release-generators-linux-amd64 -type f -name '*.so' -exec cp {} $dst \;
zip -r -9 $dst.zip $dst
dst=frei0r-generators_${{ needs.semantic-release.outputs.version }}_win64
mkdir $dst && find release-win64-generators -type f -name '*.dll' -exec cp {} $dst \;
cp ../README.md ../COPYING ../ChangeLog ../AUTHORS $dst
echo "${{ needs.semantic-release.outputs.version }}" > $dst/VERSION
tar cfz $dst.tar.gz $dst
sha256sum *.tar.gz > SHA256SUMS.txt
- name: relase all archives
zip -r -9 $dst.zip $dst
sha256sum *.zip > SHA256SUMS.txt
- name: show directory structure
run: tree -dL 3
- name: release all archives
uses: softprops/action-gh-release@v1
with:
files: |
frei0r-bin/*.tar.gz
frei0r-bin/*.zip
frei0r-bin/SHA256SUMS.txt
frei0r-bin/release-plugin-analysis/*.json
tag_name: ${{ needs.semantic-release.outputs.version }}
draft: false
draft: true
prerelease: false
fail_on_unmatched_files: true
generate_release_notes: true
Expand Down
15 changes: 11 additions & 4 deletions test/Makefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
INCLUDES ?= -I ../include

all: build scan-filters
PLUGINDIR ?= ../build/src

scan-filters:
@$(if $(wildcard ../build),,>&2 echo "Test needs a ../build" && exit 1)
@find ../build/src -type f -name '*.so' -exec ./frei0r-info {} \; > tmp.json && echo "[" > frei0r-plugin-list.json && head -n -1 tmp.json >> frei0r-plugin-list.json && echo "}\n]" >> frei0r-plugin-list.json && rm tmp.json && >&2 echo "frei0r-plugin-list.json"
all: build scan-plugins

scan-plugins:
@$(if $(wildcard ${PLUGINDIR}),,>&2 echo "Scan dir not found: ${PLUGINDIR}" && exit 1)
@find ${PLUGINDIR} -type f -name '*.so' -exec ./frei0r-info {} \; > tmp.json
@echo "[" > frei0r-plugin-list.json
@head -n -1 tmp.json >> frei0r-plugin-list.json
@echo "}\n]" >> frei0r-plugin-list.json
@rm tmp.json
$(info frei0r-plugin-list.json)

build:
@${CC} -o frei0r-info -ggdb frei0r-info.c ${INCLUDES}
Expand Down
73 changes: 64 additions & 9 deletions test/frei0r-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,54 @@
#include <errno.h>
#include <string.h>
#include <dlfcn.h>
#include <libgen.h>

#include <frei0r.h>

// frei0r function prototypes
typedef int (*f0r_init_f)(void);
typedef void (*f0r_deinit_f)(void);
typedef void (*f0r_get_plugin_info_f)(f0r_plugin_info_t *info);
/* typedef void (*f0r_get_param_info_f)(f0r_param_info_t *info, int param_index); */
/* typedef void (*f0r_get_param_value_f)(f0r_instance_t instance, f0r_param_t param, int param_index); */

/* f0r_get_param_info_f get_param_info; */
/* f0r_get_param_value_f get_param_value; */
typedef void (*f0r_get_param_info_f)(f0r_param_info_t *info, int param_index);

int main(int argc, char **argv) {

// instance frei0r pointers
static void *dl_handle;
static f0r_init_f f0r_init;
static f0r_init_f f0r_deinit;
static f0r_plugin_info_t pi;
static f0r_get_plugin_info_f f0r_get_plugin_info;
static f0r_get_param_info_f f0r_get_param_info;
static f0r_param_info_t param;

int c;

if(argc<2) exit(1);
const char *file = basename(argv[1]);
const char *dir = dirname(argv[1]);
char path[256];;
snprintf(path, 255,"%s/%s",dir,file);
// fprintf(stderr,"%s %s\n",argv[0], file);
// load shared library
dl_handle = dlopen(argv[1], RTLD_NOW|RTLD_LOCAL);
dl_handle = dlopen(path, RTLD_NOW|RTLD_LOCAL);
if(!dl_handle) {
fprintf(stderr,"error: %s\n",dlerror());
exit(1);
}
// get plugin info
// get plugin function calls
f0r_init = dlsym(dl_handle,"f0r_init");
f0r_deinit = dlsym(dl_handle,"f0r_deinit");
f0r_get_plugin_info = dlsym(dl_handle,"f0r_get_plugin_info");
f0r_get_param_info = dlsym(dl_handle,"f0r_get_param_info");
// always initialize plugin first
f0r_init();
// get info about plugin
f0r_get_plugin_info(&pi);
fprintf(stdout,
"{\n \"name\":\"%s\",\n \"type\":\"%s\",\n \"author\":\"%s\",\n"
"\"explanation\":\"%s\",\n \"color_model\":\"%s\",\n"
"\"frei0r_version\":\"%d\",\n \"version\":\"%d.%d\",\n \"num_params\":\"%d\"\n},\n",
" \"explanation\":\"%s\",\n \"color_model\":\"%s\",\n"
" \"frei0r_version\":\"%d\",\n \"version\":\"%d.%d\",\n \"num_params\":\"%d\"",
pi.name,
pi.plugin_type == F0R_PLUGIN_TYPE_FILTER ? "filter" :
pi.plugin_type == F0R_PLUGIN_TYPE_SOURCE ? "source" :
Expand All @@ -43,6 +63,41 @@ int main(int argc, char **argv) {
pi.color_model == F0R_COLOR_MODEL_PACKED32 ? "packed32" : "unknown",
pi.frei0r_version, pi.major_version, pi.minor_version, pi.num_params);

/* // check icon */
/* char icon[256]; */
/* char *dot = rindex(file, '.'); */
/* *dot = 0x0; */
/* snprintf(icon,255,"%s/%s.png",dir,file); */
/* FILE *icon_fd = fopen(icon,"r"); */
/* if(icon_fd) { */
/* fprintf(stderr," icon found: %s\n",icon); */
/* } */

// get info about params
if(pi.num_params>0) {
fprintf(stdout,",\n \"params\":[\n");
for(c=0; c<pi.num_params; c++) {
f0r_get_param_info(&param, c);
fprintf(stdout,
" {\n \"name\":\"%s\",\n \"type\":\"%s\",\n \"explanation\":\"%s\"\n }",
param.name,
param.type == F0R_PARAM_BOOL ? "bool" :
param.type == F0R_PARAM_COLOR ? "color" :
param.type == F0R_PARAM_DOUBLE ? "number" :
param.type == F0R_PARAM_POSITION ? "position" :
param.type == F0R_PARAM_STRING ? "string" : "unknown",
param.explanation);
if(pi.num_params>c+1) {
fprintf(stdout,",\n");
} else {
fprintf(stdout,"\n");
}
}
fprintf(stdout," ]\n");
}
fprintf(stdout,"\n},\n");
fflush(stdout);
f0r_deinit();
dlclose(dl_handle);
exit(0);
}

0 comments on commit 28ed154

Please sign in to comment.