diff --git a/recipes/reseek/build.sh b/recipes/reseek/build.sh new file mode 100644 index 0000000000000..db61203aa3f99 --- /dev/null +++ b/recipes/reseek/build.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +mkdir -p ${PREFIX}/bin +cd src || exit 1 +echo "0" > gitver.txt + +cp ${RECIPE_DIR}/vcxproj_make.py . +chmod +x vcxproj_make.py +./vcxproj_make.py --openmp --cppcompiler ${CXX} --ccompiler ${CC} + +# Verify binary exists and is executable +if [ ! -f ../bin/reseek ]; then + echo "Error: reseek binary not found" + exit 1 +fi + +cp ../bin/reseek ${PREFIX}/bin/reseek diff --git a/recipes/reseek/meta.yaml b/recipes/reseek/meta.yaml new file mode 100644 index 0000000000000..334df5bf224a4 --- /dev/null +++ b/recipes/reseek/meta.yaml @@ -0,0 +1,32 @@ +{% set name = "reseek" %} +{% set version = "2.0.1" %} + +package: + name: {{ name|lower }} + version: {{ version }} + +source: + url: https://github.com/rcedgar/reseek/archive/refs/tags/v{{ version }}.tar.gz + sha256: 79a2aca249547a164ff7a6460abc6875c182a40693ac07068cc859b7cb7a95ec + +build: + number: 0 + skip: True #[osx] + run_exports: + - {{ pin_subpackage(name, max_pin="x.x") }} + + +requirements: + build: + - {{ compiler("cxx") }} + - {{ compiler("c") }} + - make + +test: + commands: + - reseek -version +about: + home: https://github.com/rcedgar/reseek + license: GPL-3.0-only + license_file: LICENSE + summary: Protein structure alignment and search algorithm diff --git a/recipes/reseek/vcxproj_make.py b/recipes/reseek/vcxproj_make.py new file mode 100644 index 0000000000000..739663b29c933 --- /dev/null +++ b/recipes/reseek/vcxproj_make.py @@ -0,0 +1,225 @@ +#!/usr/bin/env python + +import argparse +import os +import sys + +Usage = ( + "Convert Visual Studio .vcxproj file in current directory to Makefile and run make." +) + +AP = argparse.ArgumentParser(description=Usage) + +# Value opts +AP.add_argument( + "--std", + required=False, + help="C++ standard option for GCC, e.g. c++11 or c++17 (default none)", +) +AP.add_argument( + "--cppcompiler", + required=False, + default="g++", + help="C++ compiler command name default g++)", +) +AP.add_argument( + "--ccompiler", + required=False, + default="gcc", + help="C++ compiler command name default gcc)", +) + +# Flag opts +AP.add_argument("--debug", required=False, action="store_true", help="Debug build") +AP.add_argument("--openmp", required=False, action="store_true", help="Requires OMP") +AP.add_argument( + "--pthread", required=False, action="store_true", help="Requires pthread" +) +AP.add_argument("--lrt", required=False, action="store_true", help="Requires lrt") +AP.add_argument( + "--symbols", + required=False, + action="store_true", + help="Debug symbols (default if --debug)", +) +AP.add_argument( + "--nostrip", + required=False, + action="store_true", + help="Don't strip symbols (default if --debug or --symbols)", +) + +Args = AP.parse_args() +debug = Args.debug +std = Args.std +cppcompiler = Args.cppcompiler +ccompiler = Args.ccompiler +nostrip = debug or Args.symbols +symbols = debug or Args.symbols + +ProjFileName = None +HdrNames = [] +for FileName in os.listdir("."): + if FileName.endswith(".vcxproj"): + ProjFileName = FileName + elif FileName.endswith(".h"): + HdrNames.append(FileName) +if ProjFileName is None: + sys.stderr.write("\nProject file not found in current directory\n") + sys.exit(1) + +binary = ProjFileName.replace(".vcxproj", "") +sys.stderr.write("binary=" + binary + "\n") + +compiler_opts = " -ffast-math -march=native" +linker_opts = " -ffast-math -march=native" + +if std: + compiler_opts += " --std=" + std + +if debug: + compiler_opts += " -O0 -DDEBUG" + linker_opts += " -O0" +else: + compiler_opts += " -O3 -DNDEBUG" + linker_opts += " -O3" + +if symbols: + compiler_opts += " -g3" + linker_opts += " -g3" + +if Args.openmp: + compiler_opts += " -fopenmp" + linker_opts += " -fopenmp" + +if Args.pthread: + compiler_opts += " -pthread" + linker_opts += " -lpthread" + +rc = os.system(r"rm -rf o/ ../bin/%s*" % binary) +if rc != 0: + sys.stderr.write("\n\nERROR -- failed to clean\n\n") + sys.exit(1) +sys.stderr.write("clean done.\n") + +OBJDIR = "o" +BINDIR = "../bin" + +Fields = ProjFileName.split("/") +n = len(Fields) +Name = Fields[n - 1] +Fields = Name.split(".") +binary = Fields[0] + +CXXNames = [] +CNames = [] +with open(ProjFileName) as File: + for Line in File: + Line = Line.strip() + Line = Line.replace('"', "") + Line = Line.replace(" ", "") + # + if Line.startswith("", "") + if FileName.endswith(".cpp"): + FileName = FileName.replace(".cpp", "") + CXXNames.append(FileName) + elif FileName.endswith(".c"): + FileName = FileName.replace(".c", "") + CNames.append(FileName) + +assert len(CXXNames) > 0 or len(CNames) > 0 + +with open("Makefile", "w") as f: + + def Out(s): + print(s, file=f) + + BINPATH = "$(BINDIR)/%s" % (binary) + + Out("######################################################") + Out("# Makefile is generated by " + sys.argv[0]) + Out("# Don't edit the Makefile -- update the python script") + Out("######################################################") + Out("") + Out("BINDIR := %s" % BINDIR) + Out("OBJDIR := %s" % OBJDIR) + Out("BINPATH := %s" % BINPATH) + + if CNames: + Out("") + Out("CC = " + ccompiler) + Out("CFLAGS := $(CFLAGS) " + compiler_opts) + + if CXXNames: + Out("") + Out("CXX = " + cppcompiler) + Out("CXXFLAGS := $(CFLAGS) " + compiler_opts) + + Out("") + Out("UNAME_S := $(shell uname -s)") + Out("LDFLAGS := $(LDFLAGS) " + linker_opts) + Out("ifeq ($(UNAME_S),Linux)") + Out(" LDFLAGS += -static") + Out("endif") + + Out("") + Out("HDRS = \\") + for Name in sorted(HdrNames): + Out(" %s \\" % Name) + + Out("") + Out("OBJS = \\") + for Name in CXXNames: + Out(" $(OBJDIR)/%s.o \\" % (Name)) + + for Name in CNames: + Out(" $(OBJDIR)/%s.o \\" % (Name)) + + Out("") + Out(".PHONY: clean") + + Out("") + Out("$(BINPATH) : $(BINDIR)/ $(OBJDIR)/ $(OBJS)") + + if len(CXXNames) > 0: + Cmd = "\t$(CXX) $(LDFLAGS) $(OBJS) -o $(BINPATH)" + else: + Cmd = "\t%(CC) $(LDFLAGS) $(OBJS) -o $(BINPATH)" + + if Args.lrt: + Cmd += " -lrt" + Out(Cmd) + + if not nostrip: + Out(" strip $(BINPATH)") + + Out("") + Out("$(OBJDIR)/ :") + Out(" mkdir -p $(OBJDIR)/") + + Out("") + Out("$(BINDIR)/ :") + Out(" mkdir -p $(BINDIR)/") + + if CNames: + Out("") + Out("$(OBJDIR)/%.o : %.c $(HDRS)") + Out(" $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<") + + if CXXNames: + Out("") + Out("$(OBJDIR)/%.o : %.cpp $(HDRS)") + Out(" $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<") + +sys.stderr.write("Makefile done.\n") + +rc = os.system("make") +if rc != 0: + sys.stderr.write("\n\nERROR -- make failed\n\n") + sys.exit(1) +sys.stderr.write("make done.\n")