Skip to content

Commit

Permalink
Support for translating mod files to cpp using nrnivmodl
Browse files Browse the repository at this point in the history
  - nrnivmodl accept extra option -cpp by which all mod files
    are translated to .cpp instead of .c
  - all files are then compiled with CXX and relevant compiler
    flags to build special
  - keep everything backward compatible i.e. if -cpp flag is not
    provided then keep old behaviour
  - nocmodl accepts extra comamnd line argument ext=cpp (last argument)
    by which .mod file is translated to .cpp
  - nrnivmodl and relevant makefiles are updated to accept -cpp flag

fixes #384
  • Loading branch information
pramodk committed Aug 16, 2020
1 parent d1ba505 commit 518eb06
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 57 deletions.
23 changes: 14 additions & 9 deletions bin/nrniv_makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,18 @@ CC = @CC@
CXX = @CXX@
CFLAGS = @CFLAGS@ $(PTHREAD_CFLAGS)
CXXFLAGS = @CXXFLAGS@ $(PTHREAD_CFLAGS)
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCCOMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CCLD = $(CC)
CXXLD = $(CXX)

CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS)

COMPILE=$(CCCOMPILE)
ifeq ($(NMODL_C_Ext),cpp)
COMPILE = $(CXXCOMPILE)
endif

@BUILD_NRNMPI_DYNAMIC_TRUE@lnrnmpi =
@BUILD_NRNMPI_DYNAMIC_FALSE@lnrnmpi = -lnrnmpi

Expand All @@ -63,7 +68,7 @@ NRNOCOBJS = $(libobjdir)/ocmain.o $(libobjdir)/nrnnoiv.o $(libobjdir)/ocnoiv.o
NRNIVOBJS = $(libobjdir)/nrnmain.o $(libobjdir)/ivocmain.o $(libobjdir)/nvkludge.o

.SUFFIXES:
.SUFFIXES: .c .mod .o
.SUFFIXES: .$(NMODL_C_Ext) .mod .o
#
# How to make a .o file from a .mod file. Note that we have to delete the
# .c file, or else make will get confused. We have to go directly from
Expand All @@ -82,17 +87,17 @@ NRNIVOBJS = $(libobjdir)/nrnmain.o $(libobjdir)/ivocmain.o $(libobjdir)/nvkludge

#%.o : %.mod

.mod.c:
$(bindir)/nocmodl $*
.mod.$(NMODL_C_Ext):
$(bindir)/nocmodl $* ext=$(NMODL_C_Ext)

.c.o:
$(COMPILE) -c $*.c
.$(NMODL_C_Ext).o:
$(COMPILE) -c $*.$(NMODL_C_Ext)

.mod.o:
$(bindir)/nocmodl $*
$(COMPILE) -c $*.c
$(bindir)/nocmodl $* ext=$(NMODL_C_Ext)
$(COMPILE) -c $*.$(NMODL_C_Ext)

mod_func.o: mod_func.c
mod_func.o: mod_func.$(NMODL_C_Ext)
$(COMPILE) -c $<

special: $(MODOBJFILES) $(COBJFILES) mod_func.o
Expand Down
31 changes: 19 additions & 12 deletions bin/nrnivmodl.in
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ if [ ! -d $MODSUBDIR ] ; then
mkdir $MODSUBDIR
fi

NMODL_C_Ext="c"
if [ "$1" = "-cpp" ] ; then
NMODL_C_Ext="cpp"
shift
shift
fi

pwd

files=""
Expand Down Expand Up @@ -132,47 +139,47 @@ echo '#include <stdio.h>
#include "hocdec.h"
extern int nrnmpi_myid;
extern int nrn_nobanner_;
' > mod_func.c
' > mod_func.${NMODL_C_Ext}
for i in $bfiles ; do
echo 'extern void _'$i'_reg(void);'
done >> mod_func.c
done >> mod_func.${NMODL_C_Ext}
echo '
void modl_reg(){
if (!nrn_nobanner_) if (nrnmpi_myid < 1) {
fprintf(stderr, "Additional mechanisms from files'$newline'");
' >> mod_func.c
' >> mod_func.${NMODL_C_Ext}

for i in $files
do
echo ' fprintf(stderr," '$i'.mod");'
done >>mod_func.c
done >>mod_func.${NMODL_C_Ext}

echo ' fprintf(stderr, "'$newline'");
}' >>mod_func.c
}' >>mod_func.${NMODL_C_Ext}

for i in $bfiles; do
echo ' _'$i'_reg();'
MODOBJS="$MODOBJS $i.o"
done >> mod_func.c
done >> mod_func.${NMODL_C_Ext}

echo "}" >> mod_func.c
echo "}" >> mod_func.${NMODL_C_Ext}


if test -n "$cfiles" ; then
COBJS=`echo "$cfiles" | sed 's/\.c/.o/g'`
COBJS=`echo "$cfiles" | sed "s/\.${NMODL_C_Ext}/.o/g"`
fi

@NRN_BINARY_SPECIAL_TRUE@@USING_CMAKE_TRUE@make -j 4 -f "${MAKEFILEDIR}/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" special &&
@NRN_BINARY_SPECIAL_TRUE@@USING_CMAKE_FALSE@make -j 4 -f "${MAKEFILEDIR}/nrniv_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" special &&
@NRN_BINARY_SPECIAL_TRUE@@USING_CMAKE_TRUE@make -j 4 -f "${MAKEFILEDIR}/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" "NMODL_C_Ext=$NMODL_C_Ext" special &&
@NRN_BINARY_SPECIAL_TRUE@@USING_CMAKE_FALSE@make -j 4 -f "${MAKEFILEDIR}/nrniv_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" "NMODL_C_Ext=$NMODL_C_Ext" special &&
@NRN_BINARY_SPECIAL_TRUE@ echo "Successfully created $MODSUBDIR/special"

@NRN_BINARY_SPECIAL_FALSE@MODLO=`echo "$MODOBJS" | sed 's/\.o/.lo/g'`
@NRN_BINARY_SPECIAL_FALSE@CLO=`echo "$COBJS" | sed 's/\.o/.lo/g'`
@NRN_BINARY_SPECIAL_FALSE@if test "${mdir}" = "${prefix}/share/nrn/demo/release/powerpc" ; then
@NRN_BINARY_SPECIAL_FALSE@ mdir='${NRNHOME}'/share/nrn/demo/release/${MODSUBDIR}
@NRN_BINARY_SPECIAL_FALSE@fi
@NRN_BINARY_SPECIAL_FALSE@@USING_CMAKE_FALSE@make -j 4 -f "$MAKEFILEDIR/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODLO" "COBJFILES=$CLO" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" libnrnmech.la
@NRN_BINARY_SPECIAL_FALSE@@USING_CMAKE_TRUE@make -j 4 -f "$MAKEFILEDIR/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" libnrnmech.la VERBOSE=1
@NRN_BINARY_SPECIAL_FALSE@@USING_CMAKE_FALSE@make -j 4 -f "$MAKEFILEDIR/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODLO" "COBJFILES=$CLO" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" "NMODL_C_Ext=$NMODL_C_Ext" libnrnmech.la
@NRN_BINARY_SPECIAL_FALSE@@USING_CMAKE_TRUE@make -j 4 -f "$MAKEFILEDIR/nrnmech_makefile" "ROOT=${prefix}" "MODOBJFILES=$MODOBJS" "COBJFILES=$COBJS" "UserLDFLAGS=$UserLDFLAGS" "UserINCFLAGS=$UserINCFLAGS" "NMODL_C_Ext=$NMODL_C_Ext" libnrnmech.la VERBOSE=1
@NRN_BINARY_SPECIAL_FALSE@ echo '#!/bin/sh
@NRN_BINARY_SPECIAL_FALSE@if test "x${NRNHOME}" = "x" ; then
@NRN_BINARY_SPECIAL_FALSE@ NRNHOME='"\"${prefix}\""'
Expand Down
21 changes: 13 additions & 8 deletions bin/nrnivmodl_makefile_cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,26 @@ CXX ?= @CMAKE_CXX_COMPILER@
CFLAGS = @BUILD_TYPE_C_FLAGS@ @CMAKE_C_FLAGS@
CXXFLAGS = @BUILD_TYPE_CXX_FLAGS@ @CMAKE_CXX_FLAGS@ @CXX11_STANDARD_COMPILE_OPTION@

COMPILE = $(CC) $(CFLAGS) @NRN_COMPILE_DEFS@ $(INCLUDES)
CCCOMPILE = $(CC) $(CFLAGS) @NRN_COMPILE_DEFS@ $(INCLUDES)
CXXCOMPILE = $(CXX) $(CXXFLAGS) @NRN_COMPILE_DEFS@ $(INCLUDES)
CXX_LINK_EXE = $(CXX) $(CXXFLAGS) @CMAKE_EXE_LINKER_FLAGS@
CXX_LINK_SHARED = $(CXX) $(CXXFLAGS) @CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS@ @CMAKE_SHARED_LIBRARY_CXX_FLAGS@ @CMAKE_SHARED_LINKER_FLAGS@

COMPILE=$(CCCOMPILE)
ifeq ($(NMODL_C_Ext),cpp)
COMPILE = $(CXXCOMPILE)
endif

# File path config (internal)
MODC_DIR = $(OUTPUT)
OBJS_DIR = $(OUTPUT)
mod_files = $(sort $(notdir $(wildcard $(MODS_PATH)/*.mod)))
mod_names = $(mod_files:.mod=)
modc_files = $(addprefix $(MODC_DIR)/,$(addsuffix .c,$(mod_names)))
modc_files = $(addprefix $(MODC_DIR)/,$(addsuffix .$(NMODL_C_Ext),$(mod_names)))
mod_objs = $(addprefix $(OBJS_DIR)/,$(addsuffix .o,$(mod_names)))

mod_func_o = $(OBJS_DIR)/mod_func.o
mod_func_c = $(MODC_DIR)/mod_func.c
mod_func_c = $(MODC_DIR)/mod_func.$(NMODL_C_Ext)

special = $(OUTPUT)/special
LIB_SUFFIX_ = $(if $(MECH_NAME),_$(MECH_NAME),)
Expand Down Expand Up @@ -96,21 +101,21 @@ mech_lib_static: mod_func.o $(mod_objs) build_always
@printf " => $(C_GREEN)LINKING$(C_RESET) static library $(mech_lib) Mod files: $(mod_files)\n"
(cd .. ; ar cq ${mech_lib} $(mod_func_o) $(mod_objs);)

mod_func.o: mod_func.c
mod_func.o: mod_func.$(NMODL_C_Ext)
@printf " -> $(C_GREEN)Compiling$(C_RESET) $<\n"
$(COMPILE) @CMAKE_CXX_COMPILE_OPTIONS_PIC@ -c $< -o $@

# Generic build c->o. Need PIC for shared lib
$(OBJS_DIR)/%.o: $(MODC_DIR)/%.c | $(OBJS_DIR)
$(OBJS_DIR)/%.o: $(MODC_DIR)/%.$(NMODL_C_Ext) | $(OBJS_DIR)
@printf " -> $(C_GREEN)Compiling$(C_RESET) $<\n"
(cd .. ; $(COMPILE) @CMAKE_CXX_COMPILE_OPTIONS_PIC@ -c $< -o $@)


# Build c files with nocmodl
$(MODC_DIR)/%.c: $(MODS_PATH)/%.mod | $(MODC_DIR)
@printf " -> $(C_GREEN)NMODL$(C_RESET) $<\n"
$(MODC_DIR)/%.$(NMODL_C_Ext): $(MODS_PATH)/%.mod | $(MODC_DIR)
@printf " -> $(C_GREEN)MOD2C$(C_RESET) $<\n"
MODLUNIT=$(datadir_lib)/nrnunits.lib \
$(bindir)/nocmodl $<
$(bindir)/nocmodl $< ext=$(NMODL_C_Ext)

# If .mod doesnt exist attempt from previously built opt mods in shared/
$(MODC_DIR)/%.cpp: $(datadir_lib)/%.cpp | $(MODC_DIR)
Expand Down
36 changes: 24 additions & 12 deletions bin/nrnmech_makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,31 @@ NJ_LIBS = @NRNJAVA_LIBS@
PY_LIBS =
NRNNI_LIBS = @NRNNI_LIBS@

INCLUDES = -I. -I.. -I"$(pkgincludedir)" -I"$(libdir)" $(UserINCFLAGS)
INCLUDES = -I. -I.. -I"$(pkgincludedir)" -I"$(libdir)" $(UserINCFLAGS)

LIBTOOL = "$(pkgdatadir)/libtool" @LIBTOOLTAG@
CC = @CC@
CXX = @CXX@
CFLAGS = @CFLAGS@

CXXFLAGS = @CXXFLAGS@

ifeq ($(NMODL_C_Ext),cpp)
COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) \
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CCLD = $(CXX)
LINK = $(LIBTOOL) --mode=link $(CCLD) -module $(AM_CXXFLAGS) $(CXXFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
else
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) -module $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
endif

@BUILD_NRNMPI_DYNAMIC_TRUE@lnrnmpi =
@BUILD_NRNMPI_DYNAMIC_FALSE@lnrnmpi = -lnrnmpi
Expand All @@ -55,14 +67,14 @@ NRNIVOBJS = "$(libobjdir)/nrnmain.o" "$(libobjdir)/ivocmain.o" "$(libobjdir)/nvk

.SUFFIXES:

.SUFFIXES: .c .mod .lo
.SUFFIXES: .$(NMODL_C_Ext) .mod .lo
#
# How to make a .o file from a .mod file. Note that we have to delete the
# .c file, or else make will get confused. We have to go directly from
# a .mod to a .o file because otherwise GNU make will try to use a rule
# involving m2c. Argh!! Why did they have to build in so many implicit
# rules?
#
#
#.mod.o:
# $(bindir)/nocmodl $* || (rm -f $*.c; exit 1)
# $(COMPILE) -c $*.c
Expand All @@ -74,18 +86,18 @@ NRNIVOBJS = "$(libobjdir)/nrnmain.o" "$(libobjdir)/ivocmain.o" "$(libobjdir)/nvk

#%.o : %.mod

.mod.c:
"$(bindir)/nocmodl" $*
.c.lo:
.mod.$(NMODL_C_Ext):
"$(bindir)/nocmodl" $* ext=$(NMODL_C_Ext)

.$(NMODL_C_Ext).lo:
$(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<

.mod.lo:
"$(bindir)/nocmodl" $*
$(LTCOMPILE) -c -o $@ $*.c
"$(bindir)/nocmodl" $* ext=$(NMODL_C_Ext)
$(LTCOMPILE) -c -o $@ $*.$(NMODL_C_Ext)

mod_func.lo: mod_func.c
$(LTCOMPILE) -c -o $@ $*.c
mod_func.lo: mod_func.$(NMODL_C_Ext)
$(LTCOMPILE) -c -o $@ $*.$(NMODL_C_Ext)

libnrnmech_la_OBJECTS = $(MODOBJFILES) mod_func.lo $(COBJFILES)
libnrnmech_la_LIBADD = $(NRNOCLIBS) $(NRNIVLIBS)
Expand Down
27 changes: 18 additions & 9 deletions bin/nrnoc_makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,18 @@ INCLUDES = -I. -I$(pkgincludedir) -I$(libdir)
LIBTOOL = $(pkgdatadir)/libtool
CC = @CC@
CFLAGS = @CFLAGS@
CXX = @CXX@
CXXFLAGS = @CXXFLAGS@

ifeq ($(NMODL_C_Ext),cpp)
COMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CCLD = $(CXX)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS)
else
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS)
endif

NRNOCLIBS = -L$(libdir) $(libdir)/libnrnoc.la -loc @MEMACSLIB@ \
-lscopmath -lsparse13 @READLINE_LIBS@ \
Expand All @@ -47,14 +56,14 @@ NRNOCLIBS = -L$(libdir) $(libdir)/libnrnoc.la -loc @MEMACSLIB@ \
NRNOCOBJS = $(libobjdir)/ocmain.o $(libobjdir)/nrnnoiv.o $(libobjdir)/ocnoiv.o

.SUFFIXES:
.SUFFIXES: .c .mod .o
.SUFFIXES: .$(NMODL_C_Ext) .mod .o
#
# How to make a .o file from a .mod file. Note that we have to delete the
# .c file, or else make will get confused. We have to go directly from
# a .mod to a .o file because otherwise GNU make will try to use a rule
# involving m2c. Argh!! Why did they have to build in so many implicit
# rules?
#
#
#.mod.o:
# $(bindir)/nocmodl $* || (rm -f $*.c; exit 1)
# $(COMPILE) -c $*.c
Expand All @@ -66,15 +75,15 @@ NRNOCOBJS = $(libobjdir)/ocmain.o $(libobjdir)/nrnnoiv.o $(libobjdir)/ocnoiv.o

#%.o : %.mod

.mod.c:
$(bindir)/nocmodl $*
.c.o:
$(COMPILE) -c $*.c
.mod.$(NMODL_C_Ext):
$(bindir)/nocmodl $* ext=${NMODL_C_Ext}

.$(NMODL_C_Ext).o:
$(COMPILE) -c $*.$(NMODL_C_Ext)

.mod.o:
$(bindir)/nocmodl $*
$(COMPILE) -c $*.c
$(bindir)/nocmodl $* ext=${NMODL_C_Ext}
$(COMPILE) -c $*.$(NMODL_C_Ext)

mod_func.o: mod_func.c
$(COMPILE) -c $<
Expand Down
22 changes: 15 additions & 7 deletions src/nmodl/modl.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ static char pgm_name[] = "nmodl";
extern char *RCS_version;
extern char *RCS_date;
static void openfiles();
static char *translator_extension;

int main(argc, argv)
int argc;
Expand All @@ -102,8 +103,7 @@ int main(argc, argv)
Fprintf(stderr, "%s %s %s\n",
pgm_name, RCS_version, RCS_date);
#endif
#endif

#endif
modprefix = prefix_;
init(); /* keywords into symbol table, initialize
* lists, etc. */
Expand All @@ -127,12 +127,12 @@ int main(argc, argv)

openfiles(argc, argv); /* .mrg else .mod, .var, .c */
#if NMODL || HMODL
Fprintf(stderr, "Translating %s into %s.c\n", finname,
modprefix);
Fprintf(stderr, "Translating %s into %s.%s\n", finname,
modprefix, translator_extension);
#else
#if !SIMSYS
Fprintf(stderr, "Translating %s into %s.c and %s.var\n", finname,
modprefix, modprefix);
Fprintf(stderr, "Translating %s into %s.%s and %s.var\n", finname,
modprefix, translator_extension, modprefix);
#endif
#endif
IGNORE(yyparse());
Expand Down Expand Up @@ -288,7 +288,15 @@ static void openfiles(argc, argv)
diag("Can't create variable file: ", s);
}
#endif
Sprintf(s, "%s.c", modprefix);
// if last command line argument is 'ext=cpp' then use
// .cpp as extension for translated c code otherwise
// use .c as extension.
if (strcmp(argv[argc-1], "ext=cpp") == 0) {
translator_extension = "cpp";
} else {
translator_extension = "c";
}
Sprintf(s, "%s.%s", modprefix, translator_extension);
if ((fcout = fopen(s, "w")) == (FILE *) 0) {
diag("Can't create C file: ", s);
}
Expand Down

0 comments on commit 518eb06

Please sign in to comment.