Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit cc85723

Browse files
authored
Improve nrnivmodl-core workflow and integration with nmodl/mod2c (#388)
* nrnivmodl-core cleanup - remove destination option - avoid re-compilation of mod files - minor cleanup of makefile - remove unused variables and install target * Remove unused CMake module and code for new workflow - remove libnrnmech which is not used (?) - install special-core as nrniv-core - install libcorenrnmech into bin directory - rmeove unused cmake code * install mod files from /share * fix test links * Add dependency between coreneuron_test for mech library * linking fixes for GPU build * Small changes/refactoring in nrnivmodl-core.in * Refactoring of target rules * Cleanup makefile rules more * Add dependency with nmodl target * Change INSTALL_ to CORENRN_ prefix and address review comment * Build libcornrnmech static one always required for nrniv-core * Add CLI option to choose static or shared build
1 parent 1a3bfa3 commit cc85723

File tree

12 files changed

+312
-379
lines changed

12 files changed

+312
-379
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ script:
171171
else
172172
cmake ${cmake_option} -DCMAKE_INSTALL_PREFIX=$HOME/CoreNeuron -DPYTHON_EXECUTABLE=$(which python3) ..;
173173
fi
174-
- cmake --build .
174+
- make
175175
- ctest --output-on-failure
176176
- make install
177177

CMake/NmodlHelper.cmake

Lines changed: 0 additions & 95 deletions
This file was deleted.

CMake/config/CompilerFlagsHelpers.cmake

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,12 @@ foreach(COMPILER_LANGUAGE ${SUPPORTED_COMPILER_LANGUAGE_LIST})
132132
endif()
133133

134134
endforeach()
135+
136+
# ===============================================================================
137+
# Allow undefined reference in shared library as mod files will be linked later
138+
# ===============================================================================
139+
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
140+
set(UNDEFINED_SYMBOLS_IGNORE_FLAG "-undefined dynamic_lookup")
141+
string(APPEND CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS " ${UNDEFINED_SYMBOLS_IGNORE_FLAG}")
142+
string(APPEND CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS " ${UNDEFINED_SYMBOLS_IGNORE_FLAG}")
143+
endif()

CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ include(OpenAccHelper)
113113
# Common dependencies
114114
# =============================================================================
115115
find_package(PythonInterp REQUIRED)
116+
find_package(Perl REQUIRED)
116117

117118
# =============================================================================
118119
# ISPC should compile with --pic by default
@@ -144,7 +145,11 @@ endif()
144145
# OpenACC needs to build static library in order to have global/routines working.
145146
# See https://www.pgroup.com/userforum/viewtopic.php?t=5350
146147
# ~~~
147-
if(CORENRN_ENABLE_SHARED AND NOT CORENRN_ENABLE_GPU)
148+
if(CORENRN_ENABLE_GPU)
149+
set(CORENRN_ENABLE_SHARED OFF)
150+
endif()
151+
152+
if(CORENRN_ENABLE_SHARED)
148153
set(COMPILE_LIBRARY_TYPE "SHARED")
149154
else()
150155
set(COMPILE_LIBRARY_TYPE "STATIC")
@@ -247,6 +252,7 @@ if(CORENRN_ENABLE_NMODL)
247252
set(ENV{PYTHONPATH} "$ENV{PYTHONPATH}")
248253
set(nmodl_PYTHONPATH "${CMAKE_BINARY_DIR}/lib")
249254
set(CORENRN_NMODL_PYTHONPATH "${nmodl_PYTHONPATH}:$ENV{PYTHONPATH}")
255+
set(NMODL_TARGET_TO_DEPEND nmodl)
250256
endif()
251257
include_directories(${CORENRN_NMODL_INCLUDE})
252258
# set correct arguments for nmodl for cpu/gpu target

coreneuron/CMakeLists.txt

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -50,47 +50,10 @@ set(KINDERIV_PYTHON_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kinderiv.py")
5050
set(KINDERIV_HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/_kinderiv.h")
5151

5252
set(NMODL_UNITS_FILE "${CMAKE_BINARY_DIR}/share/nrnunits.lib")
53-
set(INBUILT_MOD_PATH "mechanism/mech/modfile")
54-
set(INBUILT_MOD_FILES
55-
expsyn.mod
56-
exp2syn.mod
57-
hh.mod
58-
netstim.mod
59-
passive.mod
60-
pattern.mod
61-
stim.mod)
62-
63-
# Has helper macro for generating cpp file from mod2c
64-
include(NmodlHelper)
6553

66-
# =============================================================================
67-
# Command for MOD to CPP conversion
68-
# =============================================================================
69-
set(CORENRN_NMODL_COMMAND env "MODLUNIT=${NMODL_UNITS_FILE}"
70-
"PYTHONPATH=${CORENRN_NMODL_PYTHONPATH}" ${CORENRN_NMODL_BINARY})
71-
72-
if(${CORENRN_ENABLE_ISPC})
73-
set(NMODL_CODEGEN_TARGET ispc)
74-
else()
75-
set(NMODL_CODEGEN_TARGET serial)
76-
endif()
77-
78-
# configure every mod file to configure with mod2c/nmodl
79-
foreach(MOD ${INBUILT_MOD_FILES})
80-
nmodl_to_cpp_target(KEY INBUILT_MOD MODFILE "${INBUILT_MOD_PATH}/${MOD}" TARGET
81-
${NMODL_CODEGEN_TARGET})
82-
endforeach()
83-
84-
set_source_files_properties(${NMODL_INBUILT_MOD_OUTPUTS} PROPERTIES GENERATED TRUE)
85-
86-
# for ispc generated files, we need add extra compilation flags
87-
if(CORENRN_ENABLE_ISPC)
88-
set(NMODL_ISPC_INBUILT_MOD_OUTPUTS ${NMODL_INBUILT_MOD_OUTPUTS})
89-
list(FILTER NMODL_ISPC_INBUILT_MOD_OUTPUTS INCLUDE REGEX ".*\.ispc$")
90-
set_source_files_properties(${NMODL_ISPC_INBUILT_MOD_OUTPUTS} PROPERTIES LANGUAGE ISPC)
91-
set_source_files_properties(${NMODL_ISPC_INBUILT_MOD_OUTPUTS} PROPERTIES COMPILE_FLAGS
92-
"-I${CORENRN_NMODL_INCLUDE} --pic")
93-
endif()
54+
# copy inbuilt mod files to share
55+
file(COPY ${CORENEURON_PROJECT_SOURCE_DIR}/coreneuron/mechanism/mech/modfile
56+
DESTINATION ${CMAKE_BINARY_DIR}/share)
9457

9558
# =============================================================================
9659
# coreneuron GPU library
@@ -155,18 +118,14 @@ add_custom_target(kin_deriv_header DEPENDS "${KINDERIV_HEADER_FILE}")
155118
# main coreneuron library
156119
add_library(
157120
coreneuron ${COMPILE_LIBRARY_TYPE} ${CORENEURON_HEADER_FILES} ${CORENEURON_TEMPLATE_FILES}
158-
${CORENEURON_CODE_FILES} ${cudacorenrn_objs} ${NMODL_INBUILT_MOD_OUTPUTS})
121+
${CORENEURON_CODE_FILES} ${cudacorenrn_objs} ${NMODL_INBUILT_MOD_OUTPUTS})
159122

160123
# need to have _kinderiv.h for mod2c generated files
161124
add_dependencies(coreneuron kin_deriv_header)
162125

163126
# scopmath is created separately for nrnivmodl-core workflow
164127
add_library(scopmath STATIC ${CORENEURON_HEADER_FILES} ${SCOPMATH_CODE_FILES})
165128

166-
# minimal main and dimplic file for nrnivmodl-core workflow
167-
add_library(corenrnmech ${COMPILE_LIBRARY_TYPE} ${CORENEURON_HEADER_FILES} ${ENGINEMECH_CODE_FILE}
168-
${DIMPLIC_CODE_FILE})
169-
170129
target_link_libraries(
171130
coreneuron
172131
${MPI_C_LIBRARIES}
@@ -182,35 +141,26 @@ target_include_directories(coreneuron SYSTEM
182141
target_include_directories(coreneuron SYSTEM
183142
PRIVATE ${CORENEURON_PROJECT_SOURCE_DIR}/external/CLI11/include)
184143

185-
target_link_libraries(corenrnmech scopmath coreneuron)
186-
187144
set_target_properties(
188-
coreneuron corenrnmech scopmath ${link_cudacoreneuron}
145+
coreneuron scopmath ${link_cudacoreneuron}
189146
PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib LIBRARY_OUTPUT_DIRECTORY
190147
${CMAKE_BINARY_DIR}/lib POSITION_INDEPENDENT_CODE ON)
191148

192149
# =============================================================================
193150
# create special-core with halfgap.mod for tests
194151
# =============================================================================
195-
add_custom_command(
196-
TARGET coreneuron POST_BUILD
197-
COMMAND ${CMAKE_BINARY_DIR}/bin/nrnivmodl-core
152+
add_custom_target(
153+
nrniv-core ALL
154+
COMMAND ${CMAKE_BINARY_DIR}/bin/nrnivmodl-core -b STATIC
198155
${CORENEURON_PROJECT_SOURCE_DIR}/tests/integration/ring_gap/mod
199-
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
200-
BYPRODUCTS ${CMAKE_BINARY_DIR}/bin/${CMAKE_SYSTEM_PROCESSOR}/special-core
156+
WORKING_DIRECTORY
157+
${CMAKE_BINARY_DIR}/bin
158+
BYPRODUCTS
159+
${CMAKE_BINARY_DIR}/bin/${CMAKE_SYSTEM_PROCESSOR}/special-core
201160
COMMENT "Running nrnivmodl-core with halfgap.mod")
202-
add_dependencies(coreneuron scopmath)
161+
add_dependencies(nrniv-core scopmath coreneuron ${NMODL_TARGET_TO_DEPEND})
203162

204-
# =============================================================================
205-
# create nrnivmodl-core
206-
# =============================================================================
207-
# coreneuron executable
208163
include_directories(${CORENEURON_PROJECT_SOURCE_DIR})
209-
add_executable(nrniv-core "apps/coreneuron.cpp")
210-
211-
target_link_libraries(nrniv-core corenrnmech ${reportinglib_LIBRARY} ${sonatareport_LIBRARY})
212-
213-
set_target_properties(nrniv-core PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
214164

215165
# =============================================================================
216166
# Extract link definitions to be used with nrnivmodl-core
@@ -255,6 +205,7 @@ if(NOT CORENRN_ENABLE_NMODL)
255205
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/mod2c/")
256206
add_custom_target(link_units ALL COMMAND ${CMAKE_COMMAND} -E create_symlink "${NMODL_UNITS_FILE}"
257207
"${CMAKE_BINARY_DIR}/share/mod2c/nrnunits.lib")
208+
add_dependencies(nrniv-core link_units)
258209
endif()
259210

260211
# main program required for building special-core
@@ -266,7 +217,7 @@ file(COPY apps/coreneuron.cpp DESTINATION ${CMAKE_BINARY_DIR}/share/coreneuron)
266217

267218
# coreneuron main libraries
268219
install(
269-
TARGETS coreneuron corenrnmech ${link_cudacoreneuron}
220+
TARGETS coreneuron ${link_cudacoreneuron}
270221
EXPORT coreneuron
271222
LIBRARY DESTINATION lib
272223
ARCHIVE DESTINATION lib
@@ -297,8 +248,14 @@ if(NOT CORENRN_ENABLE_NMODL)
297248
endif()
298249

299250
# install nrniv-core app
300-
install(TARGETS nrniv-core DESTINATION bin)
251+
install(
252+
PROGRAMS ${CMAKE_BINARY_DIR}/bin/${CMAKE_HOST_SYSTEM_PROCESSOR}/special-core
253+
DESTINATION bin
254+
RENAME nrniv-core)
301255
install(FILES apps/coreneuron.cpp DESTINATION share/coreneuron)
302256

303257
# install random123 and nmodl headers
304258
install(DIRECTORY ${CMAKE_BINARY_DIR}/include/ DESTINATION include)
259+
260+
# install mod files
261+
install(DIRECTORY ${CMAKE_BINARY_DIR}/share/modfile DESTINATION share)

0 commit comments

Comments
 (0)