@@ -209,6 +209,15 @@ set(NRN_PROFILER
209
209
"${NRN_PROFILER_DEFAULT} "
210
210
CACHE STRING "Set which profiler to build against ('caliper', 'likwid')" )
211
211
212
+ # =============================================================================
213
+ # Build options for NMODL
214
+ # =============================================================================
215
+ option (NMODL_ENABLE_PYTHON_BINDINGS "Enable pybind11 based python bindings" ON )
216
+ set (NMODL_EXTRA_CXX_FLAGS
217
+ ""
218
+ CACHE STRING "Add extra compile flags for NMODL sources" )
219
+ separate_arguments (NMODL_EXTRA_CXX_FLAGS)
220
+
212
221
# =============================================================================
213
222
# Include cmake modules
214
223
# =============================================================================
@@ -507,22 +516,50 @@ cpp_cc_git_submodule(CLI11 BUILD PACKAGE CLI11 REQUIRED)
507
516
# Enable NMODL code-generator support
508
517
# =============================================================================
509
518
if (NRN_ENABLE_NMODL OR NRN_ENABLE_CORENEURON)
519
+ # NMODL Python build dependencies
520
+ nrn_find_python_module(MODULE jinja2 REQUIRED)
521
+ # N.B. `nrn_find_python_module` uses the _importable_ name of the package to find it, _not_ the
522
+ # actual package name. In this case, `pip install pyyaml` actually installs an importable package
523
+ # called `yaml`
524
+ nrn_find_python_module(MODULE yaml REQUIRED)
525
+
526
+ # NMODL non-Python build dependencies
527
+ cpp_cc_git_submodule(json BUILD PACKAGE nlohmann_json REQUIRED)
528
+ cpp_cc_git_submodule(pybind11 BUILD PACKAGE pybind11 REQUIRED)
529
+
530
+ option (SPDLOG_FMT_EXTERNAL "Force to use an external {{fmt}}" ON )
531
+ option (SPDLOG_SYSTEM_INCLUDE "Include spdlog as a system lib" ON )
532
+ cpp_cc_git_submodule(spdlog BUILD PACKAGE spdlog REQUIRED)
533
+ if (${CODING_CONV_PREFIX} _3RDPARTY_USE_SPDLOG)
534
+ # See above, same logic as fmt
535
+ set_target_properties (spdlog PROPERTIES POSITION_INDEPENDENT_CODE ON )
536
+ endif ()
510
537
511
538
set (NMODL_ENABLE_PYTHON_BINDINGS
512
539
OFF
513
540
CACHE BOOL "Enable NMODL python bindings" )
514
- nrn_add_external_project(nmodl)
541
+
542
+ include (${PROJECT_SOURCE_DIR} /cmake/nmodl/PythonLinkHelper.cmake)
543
+
544
+ # where the platform-specific sources are located
545
+ set (NMODL_PROJECT_PLATLIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /src/nmodl)
546
+ set (NMODL_PROJECT_PLATLIB_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /src/nmodl)
547
+ # where the platform-independent sources are located
548
+ set (NMODL_PROJECT_PURELIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /share/lib/python/neuron/nmodl)
549
+ set (NMODL_PROJECT_PURELIB_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /lib/python/neuron/nmodl)
550
+
551
+ add_subdirectory (src/nmodl)
515
552
set (CORENRN_NMODL_BINARY ${CMAKE_BINARY_DIR} /bin/nmodl${CMAKE_EXECUTABLE_SUFFIX} )
516
553
set (NMODL_TARGET_TO_DEPEND nmodl)
517
- set (NMODL_PROJECT_BINARY_DIR ${CMAKE_BINARY_DIR} /external /nmodl)
554
+ set (NMODL_PROJECT_PLATLIB_BINARY_DIR ${CMAKE_BINARY_DIR} /src /nmodl)
518
555
# install nrnunits.lib and libpywrapper.so from external/nmodl
519
556
install (
520
- FILES ${NMODL_PROJECT_BINARY_DIR } /lib/libpywrapper${CMAKE_SHARED_LIBRARY_SUFFIX}
557
+ FILES ${NMODL_PROJECT_PLATLIB_BINARY_DIR } /lib/libpywrapper${CMAKE_SHARED_LIBRARY_SUFFIX}
521
558
DESTINATION lib
522
559
COMPONENT pywrapper
523
560
OPTIONAL )
524
561
install (
525
- FILES ${NMODL_PROJECT_BINARY_DIR } /share/nmodl/nrnunits.lib
562
+ FILES ${NMODL_PROJECT_PLATLIB_BINARY_DIR } /share/nmodl/nrnunits.lib
526
563
DESTINATION share/nmodl
527
564
COMPONENT nrnunits)
528
565
@@ -648,6 +685,13 @@ function(prepend_to_var var new_path)
648
685
endfunction ()
649
686
set (NRN_RUN_FROM_BUILD_DIR_ENV "NEURONHOME=${PROJECT_BINARY_DIR} /share/nrn"
650
687
"NRNHOME=${PROJECT_BINARY_DIR} " )
688
+
689
+ # if we do not link against Python, NMODL will complain that some of the env variables are missing
690
+ # when building coreNEURON mod files
691
+ if (NOT NRN_LINK_AGAINST_PYTHON)
692
+ set (NRN_RUN_FROM_BUILD_DIR_ENV "${NRN_RUN_FROM_BUILD_DIR_ENV} " "NMODLHOME=${PROJECT_BINARY_DIR} "
693
+ "NMODL_PYLIB=${PYTHON_LIBRARY} " )
694
+ endif ()
651
695
prepend_to_var(PATH "${PROJECT_BINARY_DIR} /bin" )
652
696
if (APPLE )
653
697
prepend_to_var(DYLD_LIBRARY_PATH "${PROJECT_BINARY_DIR} /lib" )
0 commit comments