Browse Source

WIP: `test` port

pull/4820/head
Mateusz Sokol 1 year ago
parent
commit
69de58f380
5 changed files with 253 additions and 20 deletions
  1. +11
    -0
      driver/level3/meson.build
  2. +176
    -20
      kernel/meson.build
  3. +1
    -0
      meson.build
  4. +40
    -0
      test/meson.build
  5. +25
    -0
      test/test_runner.c

+ 11
- 0
driver/level3/meson.build View File

@@ -143,6 +143,11 @@ driver_kops = [
'_LN', '_LT', '']},
}
},
{ 'base': 'syrk_thread',
'sources': {
'syrk_thread.c': {'mode': [''], 'exts': ['']}
}
},
{ 'base': '?syrk_kernel',
'sources': {
'syrk_kernel.c': {'mode': ['s', 'd', # 'q'],
@@ -158,6 +163,12 @@ driver_kops = [
'_LN', '_LT']},
}
},
{ 'base': '?syr2k_kernel',
'sources': {
'syr2k_kernel.c': {'mode': ['s', 'd', 'c', 'z'],
'exts': ['_U', '_L']},
}
},
{ 'base': '?hemm',
'sources': {
'zhemm_k.c': {'mode': ['c', 'z'], # 'x'],


+ 176
- 20
kernel/meson.build View File

@@ -638,37 +638,163 @@ base_kops = [
's': {'exts': {
# TODO(rg): These actually use $(SGEMM_UNROLL_M) to choose the size
'_iunucopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_8.c',
'addl': ['-UOUTER', '-ULOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iunncopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_8.c',
'addl': ['-UOUTER', '-ULOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_ilnucopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_8.c',
'addl': ['-UOUTER', '-DLOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_ilnncopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_8.c',
'addl': ['-UOUTER', '-DLOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_iutucopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_8.c',
'addl': ['-UOUTER', '-ULOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iutncopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_8.c',
'addl': ['-UOUTER', '-ULOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_iltucopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_8.c',
'addl': ['-UOUTER', '-DLOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_iltncopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_8.c',
'addl': ['-UOUTER', '-DLOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_ounucopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_4.c',
'addl': ['-DOUTER', '-ULOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_ounncopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_4.c',
'addl': ['-DOUTER', '-ULOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_olnucopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_4.c',
'addl': ['-DOUTER', '-DLOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_olnncopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_4.c',
'addl': ['-DOUTER', '-DLOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
'_outucopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_4.c',
'addl': ['-DOUTER', '-ULOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_outncopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_4.c',
'addl': ['-DOUTER', '-ULOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_oltucopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_4.c',
'addl': ['-DOUTER', '-DLOWER', '-DUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_oltncopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_4.c',
'addl': ['-DOUTER', '-DLOWER', '-UUNIT']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
}},
'd': {'exts': {
'_iunucopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iunncopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_ilnucopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_ilnncopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_iutucopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iutncopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_iltucopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_iltncopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_ounucopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_ounncopy': {'dir': 'generic', 'kernel': 'trmm_uncopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_olnucopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_olnncopy': {'dir': 'generic', 'kernel': 'trmm_lncopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
'_outucopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_outncopy': {'dir': 'generic', 'kernel': 'trmm_utcopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_oltucopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_oltncopy': {'dir': 'generic', 'kernel': 'trmm_ltcopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
}},
'c': {'exts': {
'_iunucopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iunncopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_ilnucopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_ilnncopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_iutucopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iutncopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_iltucopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_iltncopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_ounucopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_ounncopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_olnucopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_olnncopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
'_outucopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_outncopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_oltucopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_oltncopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
}},
'z': {'exts': {
'_iunucopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iunncopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_ilnucopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_ilnncopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_iutucopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-DUNIT']},
'_iutncopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER', '-UUNIT']},
'_iltucopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-DUNIT']},
'_iltncopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER', '-UUNIT']},
'_ounucopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_ounncopy': {'dir': 'generic', 'kernel': 'ztrmm_uncopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_olnucopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_olnncopy': {'dir': 'generic', 'kernel': 'ztrmm_lncopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
'_outucopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-DUNIT']},
'_outncopy': {'dir': 'generic', 'kernel': 'ztrmm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER', '-UUNIT']},
'_oltucopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-DUNIT']},
'_oltncopy': {'dir': 'generic', 'kernel': 'ztrmm_ltcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER', '-UUNIT']},
}},
},
},
{ 'base': '?hemm',
'modes': {
'c': {'exts': {
'_iutcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER']},
}},
'z': {'exts': {
'_iutcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'zhemm_utcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER']},
}},
},
},
@@ -856,13 +982,43 @@ base_kops = [
's': {'exts': {
# TODO(rg): These actually use $(SGEMM_UNROLL_M) to choose the size
'_iutcopy': {'dir': 'generic', 'kernel': 'symm_ucopy_8.c',
'addl': ['-UOUTER', '-ULOWER']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'symm_lcopy_8.c',
'addl': ['-UOUTER', '-DLOWER']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'symm_ucopy_4.c',
'addl': ['-DOUTER', '-ULOWER']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'symm_lcopy_4.c',
'addl': ['-DOUTER', '-DLOWER']},
'addl': ['-UDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER']},
}},
'd': {'exts': {
'_iutcopy': {'dir': 'generic', 'kernel': 'symm_ucopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'symm_lcopy_8.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'symm_ucopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'symm_lcopy_4.c',
'addl': ['-DDOUBLE', '-UCOMPLEX', '-DOUTER', '-DLOWER']},
}},
'c': {'exts': {
'_iutcopy': {'dir': 'generic', 'kernel': 'zsymm_ucopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'zsymm_lcopy_8.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'zsymm_ucopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'zsymm_lcopy_4.c',
'addl': ['-UDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER']},
}},
'z': {'exts': {
'_iutcopy': {'dir': 'generic', 'kernel': 'zsymm_ucopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-ULOWER']},
'_iltcopy': {'dir': 'generic', 'kernel': 'zsymm_lcopy_8.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-UOUTER', '-DLOWER']},
'_outcopy': {'dir': 'generic', 'kernel': 'zsymm_ucopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-ULOWER']},
'_oltcopy': {'dir': 'generic', 'kernel': 'zsymm_lcopy_4.c',
'addl': ['-DDOUBLE', '-DCOMPLEX', '-DOUTER', '-DLOWER']},
}},
},
},


+ 1
- 0
meson.build View File

@@ -514,5 +514,6 @@ pkg.generate(_openblas,
)

if build_testing
subdir('test')
subdir('utest')
endif

+ 40
- 0
test/meson.build View File

@@ -0,0 +1,40 @@
_test_input_array = [
{'id': 'sblat1', 'has_dat': false},
{'id': 'sblat2', 'has_dat': true},
{'id': 'sblat3', 'has_dat': true},
{'id': 'dblat1', 'has_dat': false},
{'id': 'dblat2', 'has_dat': true},
{'id': 'dblat3', 'has_dat': true},
{'id': 'cblat1', 'has_dat': false},
{'id': 'cblat2', 'has_dat': true},
{'id': 'cblat3', 'has_dat': true},
{'id': 'cblat3_3m', 'has_dat': true},
{'id': 'zblat1', 'has_dat': false},
{'id': 'zblat2', 'has_dat': true},
{'id': 'zblat3', 'has_dat': true},
{'id': 'zblat3_3m', 'has_dat': true},
]

_test_runner = executable('test_runner', sources: ['test_runner.c'], install: false)

foreach _test : _test_input_array
test_id = _test['id']
executable(
test_id,
sources: f'@test_id@.f',
link_with: [_openblas],
dependencies: [dependency('threads')],
)

_args = [f'./@test_id@']
if _test['has_dat']
_args += [ meson.current_source_dir() / f'@test_id@.dat']
endif

test(
test_id,
_test_runner,
args: _args,
workdir: meson.current_build_dir(),
)
endforeach

+ 25
- 0
test/test_runner.c View File

@@ -0,0 +1,25 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
if (argc != 2 && argc != 3) {
fprintf(stderr, "Usage: %s <executable> <optional_input_file>\n", argv[0]);
return EXIT_FAILURE;
}

char command[1024];
if (argc == 2) {
snprintf(command, sizeof(command), "%s", argv[1]);
} else {
snprintf(command, sizeof(command), "%s < %s", argv[1], argv[2]);
}

int result = system(command);
if (result != 0) {
fprintf(stderr, "Error: Command '%s' failed with return code %d.\n", command, result);
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

Loading…
Cancel
Save