diff --git a/recipes/genodsp/build.sh b/recipes/genodsp/build.sh new file mode 100644 index 0000000000000..8b3a89f8a7287 --- /dev/null +++ b/recipes/genodsp/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash -e +set -uex + +mkdir -vp "${PREFIX}/bin" + +make VERBOSE=1 -j ${CPU_COUNT} + +if ! install -v "$SRC_DIR/genodsp" "$PREFIX/bin/genodsp"; then + echo "Failed to install genodsp binary" >&2 + exit 1 +fi diff --git a/recipes/genodsp/meta.yaml b/recipes/genodsp/meta.yaml new file mode 100644 index 0000000000000..d8806c20b4d49 --- /dev/null +++ b/recipes/genodsp/meta.yaml @@ -0,0 +1,36 @@ +{% set name = "genodsp" %} +{% set version = "0.0.3" %} + +package: + name: {{ name|lower }} + version: {{ version }} + +source: + url: https://github.com/rsharris/genodsp/archive/refs/tags/v{{ version }}+.zip + sha256: a7fb2218311d1ae5231041863d28adb8b5fffe724fc5ff2422310ce90a9f894a + patches: + - stringop-truncation.patch + +requirements: + build: + - {{ compiler('c') }} + - make + +build: + number: 0 + skip: True # [not linux or not x86_64] + run_exports: + - {{ pin_subpackage('genodsp', max_pin="x.x") }} + +test: + commands: + - genodsp --help + - ls -l ${PREFIX}/bin/ + - ${PREFIX}/bin/genodsp --help + +about: + home: https://github.com/rsharris/genodsp + summary: General workbench for processing signals along genomic (chromosomal) intervals + license: GPL-3.0-only + license_file: LICENSE + license_url: https://github.com/rsharris/genodsp/blob/master/LICENSE diff --git a/recipes/genodsp/stringop-truncation.patch b/recipes/genodsp/stringop-truncation.patch new file mode 100644 index 0000000000000..e2699e188a854 --- /dev/null +++ b/recipes/genodsp/stringop-truncation.patch @@ -0,0 +1,185 @@ +diff --git a/Makefile b/Makefile +index cf07368..d1dfb95 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,5 +1,4 @@ + CFLAGS = -O3 -Wall -Wextra -Werror +-CC = gcc + LDLIBS = -lm + + operators = sum clump percentile add multiply mask logical minmax morphology map opio variables +diff --git a/add.c b/add.c +index 752dd5d..8fa4bad 100644 +--- a/add.c ++++ b/add.c +@@ -240,7 +240,7 @@ void op_add_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +@@ -533,7 +533,7 @@ void op_subtract_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +diff --git a/genodsp.c b/genodsp.c +index ac1704e..dffd622 100644 +--- a/genodsp.c ++++ b/genodsp.c +@@ -1229,7 +1229,7 @@ void read_intervals + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +diff --git a/logical.c b/logical.c +index fb295e3..45e1c20 100644 +--- a/logical.c ++++ b/logical.c +@@ -497,7 +497,7 @@ void op_or_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +@@ -810,7 +810,7 @@ void op_and_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +diff --git a/mask.c b/mask.c +index 4fd5ebd..ddd068e 100644 +--- a/mask.c ++++ b/mask.c +@@ -253,7 +253,7 @@ void op_mask_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +@@ -548,7 +548,7 @@ void op_mask_not_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +diff --git a/minmax.c b/minmax.c +index c222bd0..eae69ab 100644 +--- a/minmax.c ++++ b/minmax.c +@@ -261,7 +261,7 @@ void op_min_in_interval_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +@@ -664,7 +664,7 @@ void op_max_in_interval_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +@@ -1941,7 +1941,7 @@ void op_min_with_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +@@ -2227,7 +2227,7 @@ void op_max_with_apply + v = NULL; + chromSpec = find_chromosome_spec (chrom); + if (chromSpec != NULL) v = chromSpec->valVector; +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + if (chromSpec == NULL) continue; +diff --git a/multiply.c b/multiply.c +index 4c1b550..d04cc41 100644 +--- a/multiply.c ++++ b/multiply.c +@@ -260,7 +260,7 @@ void op_multiply_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +@@ -654,7 +654,7 @@ void op_divide_apply + if (chromSpec->flag) goto chrom_not_together; + } + +- strncpy (prevChrom, chrom, sizeof(prevChrom)); ++ safe_strncpy (prevChrom, chrom, sizeof(prevChrom)); + } + + // if the current chromosome is not of any interest, ignore this +diff --git a/utilities.c b/utilities.c +index 03d2ff1..3157538 100644 +--- a/utilities.c ++++ b/utilities.c +@@ -493,3 +493,16 @@ char* ucommatize + return s; + } + ++// ++void safe_strncpy ++ (char *dest, const char *src, size_t n) ++ { ++ #pragma GCC diagnostic push ++ #pragma GCC diagnostic ignored "-Wstringop-truncation" ++ strncpy(dest, src, n); ++ #pragma GCC diagnostic pop ++ if (n > 0) ++ { ++ dest[n-1] = '\0'; // Ensure null-termination ++ } ++ } +diff --git a/utilities.h b/utilities.h +index ac9cef7..87cfc2d 100644 +--- a/utilities.h ++++ b/utilities.h +@@ -31,6 +31,8 @@ char* skip_whitespace (char* s); + char* skip_darkspace (char* s); + char* duration_to_string (float seconds); + char* ucommatize (const u32 v); ++void safe_strncpy (char *dest, const char *src, size_t n); ++ + + // miscellany +