@@ -9,6 +9,7 @@ MECH_VERSION = 0.0
99MODS_PATH = .
1010OUTPUT = @CMAKE_HOST_SYSTEM_PROCESSOR@
1111OPTMODS = @CORENRN_OPTMODS@
12+ OPTMODS_OUTPUTS = @CORENRN_OPTMODS_OUTPUTS@
1213DESTDIR =
1314
1415# Coreneuron dirs
@@ -18,6 +19,9 @@ incdir := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@
1819datadir:= @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/coreneuron
1920datadir_mod2c := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/mod2c
2021
22+ # Binary of MOD2C/NMODL depending on what was activated
23+ mod2c_install_bin := @mod2c_install_bin@
24+
2125# Additional variables set in CMAKE usable here
2226# - @CORENRN_COMPILE_DEFS
2327# - @CORENRN_LINK_DEFS
@@ -41,13 +45,45 @@ CXXCOMPILE = $(CXX) $(CXXFLAGS) @CORENRN_COMPILE_DEFS@ $(INCLUDES)
4145CXX_LINK_EXE = $(CXX) $(CXXFLAGS) @CMAKE_EXE_LINKER_FLAGS@
4246CXX_LINK_SHARED = $(CXX) $(CXXFLAGS) @CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS@ @CMAKE_SHARED_LIBRARY_CXX_FLAGS@ @CMAKE_SHARED_LINKER_FLAGS@
4347
48+ ISPC = @CMAKE_ISPC_COMPILER@
49+ ISPC_FLAGS = @CMAKE_ISPC_FLAGS@
50+ ISPC_COMPILE = $(ISPC) $(ISPC_FLAGS) -I$(incdir) -I@nmodl_INCLUDE@
51+
52+ # Variables used in the "ARTIFICIAL_CELL" detection
53+ mod_c_srcs_path =
54+ mod_ispc_srcs_path =
55+ mod_c_srcs_names =
56+ mod_ispc_srcs_names =
57+ define check_file
58+ ifeq (@ENABLE_ISPC_TARGET@, ON)
59+ ifeq ($(shell grep -q $(2) $(1); echo $$?), 0)
60+ mod_c_srcs_path += $(MODC_DIR)/$(notdir $(1))
61+ mod_c_srcs_names += $(notdir $(1))
62+ else
63+ mod_ispc_srcs_path += $(MODC_DIR)/$(notdir $(1))
64+ mod_ispc_srcs_names += $(notdir $(1))
65+ endif
66+ else
67+ mod_c_srcs_path += $(MODC_DIR)/$(notdir $(1))
68+ mod_c_srcs_names += $(notdir $(1))
69+ endif
70+ endef
71+
4472# File path config (internal)
4573MODC_DIR = $(OUTPUT)/core/mod2c
4674OBJS_DIR = $(OUTPUT)/core/build
4775mod_files = $(sort $(notdir $(wildcard $(MODS_PATH)/*.mod)))
76+ mod_paths = $(sort $(wildcard $(MODS_PATH)/*.mod))
4877mod_names = $(mod_files:.mod=) $(OPTMODS:.mod=)
49- modc_files = $(addprefix $(MODC_DIR)/,$(addsuffix .cpp,$(mod_names)))
50- mod_objs = $(addprefix $(OBJS_DIR)/,$(addsuffix .o,$(mod_names)))
78+ mod_all_cpp_files = $(addprefix $(MODC_DIR)/,$(addsuffix .cpp,$(mod_names)))
79+ mod_c_objs = $(addprefix $(OBJS_DIR)/,$(addsuffix .o,$(basename $(mod_c_srcs_names)))) $(addprefix $(OBJS_DIR)/,$(addsuffix .o,$(basename $(filter %.cpp, $(OPTMODS_OUTPUTS)))))
80+ mod_ispc_objs = $(addprefix $(OBJS_DIR)/,$(addsuffix .obj,$(basename $(mod_ispc_srcs_names)))) $(addprefix $(OBJS_DIR)/,$(addsuffix .obj,$(basename $(filter %.ispc, $(OPTMODS_OUTPUTS)))))
81+
82+ $(foreach ittxtfile, $(mod_paths), $(eval $(call check_file, $(ittxtfile), ARTIFICIAL_CELL)))
83+
84+ mod_c_files = $(patsubst %.mod,%.cpp,$(mod_c_srcs_path))
85+ mod_ispc_files = $(patsubst %.mod,%.ispc,$(mod_ispc_srcs_path))
86+ mod_ispc_c_files = $(patsubst %.mod,%.cpp,$(mod_ispc_srcs_path))
5187
5288kinderiv_h = $(MODC_DIR)/_kinderiv.h
5389mod_func_o = $(OBJS_DIR)/_mod_func.o
@@ -80,27 +116,42 @@ $(special): $(coremech_lib)
80116 -L $(OUTPUT) -l$(coremech_libname) $(CORENRNLIB_FLAGS) -Wl,-rpath,'$(DESTDIR_RPATH)' -Wl,-rpath,$(libdir) $(LDFLAGS)
81117
82118
83- $(coremech_lib): $(mod_func_o) $(dimplic_o) $(mod_objs ) build_always
119+ $(coremech_lib): $(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs ) build_always
84120 @printf " => $(C_GREEN)LINKING$(C_RESET) library $(coremech_lib) Mod files: $(mod_files) (+ $(OPTMODS))\n"
85121 $(CXX_LINK_SHARED) -I $(incdir) -DADDITIONAL_MECHS $(datadir)/enginemech.cpp -o ${coremech_lib} ${_SONAME} \
86- $(mod_func_o) $(dimplic_o) $(mod_objs ) $(datadir)/libscopmath.a $(CORENRNLIB_FLAGS) -Wl,-rpath,$(libdir) $(LDFLAGS)
122+ $(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs ) $(datadir)/libscopmath.a $(CORENRNLIB_FLAGS) -Wl,-rpath,$(libdir) $(LDFLAGS)
87123
88124
89- # Generic build cpp->o. Need PIC for shared lib
125+ # Generic build cpp->.o Need PIC for shared lib
90126$(OBJS_DIR)/%.o: $(MODC_DIR)/%.cpp $(kinderiv_h) | $(OBJS_DIR)
91127 @printf " -> $(C_GREEN)Compiling$(C_RESET) $<\n"
92128 $(CXXCOMPILE) @CMAKE_CXX_COMPILE_OPTIONS_PIC@ -c $< -o $@
93129
130+ # Generic build ispc->.obj Need PIC for shared lib
131+ $(OBJS_DIR)/%.obj: $(MODC_DIR)/%.ispc | $(OBJS_DIR)
132+ @printf " -> $(C_GREEN)Compiling with ISPC$(C_RESET) $<\n"
133+ $(ISPC_COMPILE) @CMAKE_ISPC_COMPILE_OPTIONS_PIC@ $< -o $@
94134
95- # Build cpp files with mod2c
96- $(MODC_DIR)/%.cpp : $(MODS_PATH)/%.mod | $(MODC_DIR)
135+ # Build ispc files with mod2c/nmodl
136+ $(mod_ispc_files): $( MODC_DIR)/%.ispc : $(MODS_PATH)/%.mod | $(MODC_DIR)
97137 @printf " -> $(C_GREEN)MOD2C$(C_RESET) $<\n"
98138 MODLUNIT=$(datadir_mod2c)/nrnunits.lib \
99- $(bindir)/mod2c_core $< -o $(MODC_DIR)/
139+ $(mod2c_install_bin) $< -o $(MODC_DIR)/ @nmodl_arguments_ispc@
140+
141+ # Static pattern to set up the dependencies for the previous recipe.
142+ $(mod_ispc_c_files): $(MODC_DIR)/%.cpp: $(MODC_DIR)/%.ispc
143+
144+ # Build cpp files with mod2c/nmodl
145+ $(mod_c_files): $(MODC_DIR)/%.cpp: $(MODS_PATH)/%.mod | $(MODC_DIR)
146+ @printf " -> $(C_GREEN)MOD2C$(C_RESET) $<\n"
147+ MODLUNIT=$(datadir_mod2c)/nrnunits.lib \
148+ $(mod2c_install_bin) $< -o $(MODC_DIR)/ @nmodl_arguments_c@
100149
101150# If .mod doesnt exist attempt from previously built opt mods in shared/
102151$(MODC_DIR)/%.cpp: $(datadir_mod2c)/%.cpp | $(MODC_DIR)
103152 ln -s $< $@
153+ $(MODC_DIR)/%.ispc: $(datadir_mod2c)/%.ispc | $(MODC_DIR)
154+ ln -s $< $@
104155
105156
106157# Mod registration. Compiled by generic rule. Dont overwrite if not changed
@@ -112,10 +163,10 @@ $(mod_func_c): build_always | $(MODC_DIR)
112163
113164# Header to avoid function callbacks using function pointers
114165# Move all mods to temp and bring back only those required
115- $(kinderiv_h): $(modc_files ) build_always | $(MODC_DIR)
166+ $(kinderiv_h): $(mod_all_cpp_files ) build_always | $(MODC_DIR)
116167 @printf " -> $(C_GREEN)Generating$(C_RESET) $(kinderiv_h)\n"
117168 cd $(MODC_DIR) && mkdir -p _tmp && mv [^_]*.cpp _tmp/ && \
118- mv $(addprefix _tmp/,$(notdir $(modc_files ))) ./ || true
169+ mv $(addprefix _tmp/,$(notdir $(mod_all_cpp_files ))) ./ || true
119170 rm -rf $(MODC_DIR)/_tmp
120171 cd $(MODC_DIR) && python $(datadir)/kinderiv.py
121172
0 commit comments