diff --git a/CMakeLists.txt b/CMakeLists.txt index abce9d7acbb240b6c2d6e0e49a0c273d4683c9b3..65c3fe93c7ecb285227e30b2c9991802932c46f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,14 @@ set_property(CACHE PROPERTY STRINGS "none" "cuda" "cuda-clang" "hip") option(ARB_USE_BUNDLED_LIBS "Use bundled 3rd party libraries" OFF) +#---------------------------------------------------------- +# Debug support +#---------------------------------------------------------- + +# Print builtin catalogue configuration while building +option(ARB_CAT_VERBOSE "Print catalogue build information" OFF) +mark_as_advanced(ARB_CAT_VERBOSE) + #---------------------------------------------------------- # Configure-time features for Arbor: #---------------------------------------------------------- diff --git a/mechanisms/BuildModules.cmake b/mechanisms/BuildModules.cmake index d35a361b2c64314d5c4730d2281c01d8c845ff6e..94c494ae3d80e8a0caf8053c74ec6eec962391b3 100644 --- a/mechanisms/BuildModules.cmake +++ b/mechanisms/BuildModules.cmake @@ -58,7 +58,7 @@ function(build_modules) endfunction() function("make_catalogue") - cmake_parse_arguments(MK_CAT "" "NAME;SOURCES;OUTPUT;ARBOR;STANDALONE" "MECHS" ${ARGN}) + cmake_parse_arguments(MK_CAT "" "NAME;SOURCES;OUTPUT;ARBOR;STANDALONE;VERBOSE" "MECHS" ${ARGN}) set(MK_CAT_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/${MK_CAT_NAME}") # Need to set ARB_WITH_EXTERNAL_MODCC *and* modcc @@ -67,14 +67,15 @@ function("make_catalogue") set(external_modcc MODCC ${modcc}) endif() - message("Catalogue name: ${MK_CAT_NAME}") - message("Catalogue mechanisms: ${MK_CAT_MECHS}") - message("Catalogue sources: ${MK_CAT_SOURCES}") - message("Catalogue output: ${MK_CAT_OUT_DIR}") - message("Arbor source tree: ${MK_CAT_ARBOR}") - message("Build as standalone: ${MK_CAT_STANDALONE}") - message("Source directory: ${PROJECT_SOURCE_DIR}") - message("Arbor arch: ${ARB_CXXOPT_ARCH}") + if(MK_CAT_VERBOSE) + message("Catalogue name: ${MK_CAT_NAME}") + message("Catalogue mechanisms: ${MK_CAT_MECHS}") + message("Catalogue sources: ${MK_CAT_SOURCES}") + message("Catalogue output: ${MK_CAT_OUT_DIR}") + message("Arbor source tree: ${MK_CAT_ARBOR}") + message("Build as standalone: ${MK_CAT_STANDALONE}") + message("Arbor arch: ${ARB_CXXOPT_ARCH}") + endif() file(MAKE_DIRECTORY "${MK_CAT_OUT_DIR}") @@ -99,9 +100,9 @@ function("make_catalogue") add_custom_command( OUTPUT ${catalogue_${MK_CAT_NAME}_source} - COMMAND ${PROJECT_SOURCE_DIR}/mechanisms/generate_catalogue ${catalogue_${MK_CAT_NAME}_options} ${MK_CAT_MECHS} + COMMAND ${MK_CAT_ARBOR}/mechanisms/generate_catalogue ${catalogue_${MK_CAT_NAME}_options} ${MK_CAT_MECHS} COMMENT "Building catalogue ${MK_CAT_NAME}" - DEPENDS ${PROJECT_SOURCE_DIR}/mechanisms/generate_catalogue) + DEPENDS ${MK_CAT_ARBOR}/mechanisms/generate_catalogue) add_custom_target(${MK_CAT_NAME}_catalogue_cpp_target DEPENDS ${catalogue_${MK_CAT_NAME}_source}) add_dependencies(build_catalogue_${MK_CAT_NAME}_mods ${MK_CAT_NAME}_catalogue_cpp_target) diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt index 5e8f3eab9a578804bce5570de79d93ab03819793..5d57d32784caad4e3a10406541aeb5f1bcd303c5 100644 --- a/mechanisms/CMakeLists.txt +++ b/mechanisms/CMakeLists.txt @@ -7,7 +7,8 @@ make_catalogue( OUTPUT "CAT_BBP_SOURCES" MECHS CaDynamics_E2 Ca_HVA Ca_LVAst Ih Im K_Pst K_Tst Nap_Et2 NaTa_t NaTs2_t SK_E2 SKv3_1 ARBOR "${PROJECT_SOURCE_DIR}" - STANDALONE FALSE) + STANDALONE FALSE + VERBOSE ${ARB_CAT_VERBOSE}) make_catalogue( NAME allen @@ -15,7 +16,8 @@ make_catalogue( OUTPUT "CAT_ALLEN_SOURCES" MECHS CaDynamics Ca_HVA Ca_LVA Ih Im Im_v2 K_P K_T Kd Kv2like Kv3_1 NaTa NaTs NaV Nap SK ARBOR "${PROJECT_SOURCE_DIR}" - STANDALONE FALSE) + STANDALONE FALSE + VERBOSE ${ARB_CAT_VERBOSE}) make_catalogue( NAME default @@ -23,7 +25,8 @@ make_catalogue( OUTPUT "CAT_DEFAULT_SOURCES" MECHS exp2syn expsyn expsyn_stdp hh kamt kdrmt nax nernst pas ARBOR "${PROJECT_SOURCE_DIR}" - STANDALONE FALSE) + STANDALONE FALSE + VERBOSE ${ARB_CAT_VERBOSE}) # Join sources set(arbor_mechanism_sources diff --git a/scripts/build-catalogue b/scripts/build-catalogue index 034b2079d571c39fa9cf90986dfbd9bf2659dbcf..5c905eac38b010f49f17e51e558d6494ef7d5ab9 100755 --- a/scripts/build-catalogue +++ b/scripts/build-catalogue @@ -43,7 +43,7 @@ def parse_arguments(): metavar='source', type=str, default=Path(__file__).parents[1].resolve(), - help='Path to arbor sources; defaults to parent of this script\'s directory') + help='Path to arbor sources; defaults to parent of this script\'s directory.') parser.add_argument('modpfx', metavar='modpfx', @@ -54,10 +54,13 @@ def parse_arguments(): action='store_true', help='Verbose.') + parser.add_argument('-q', '--quiet', + action='store_true', + help='Less output.') parser.add_argument('-h', '--help', action='help', - help='display this help and exit') + help='Display this help and exit.') return vars(parser.parse_args()) @@ -66,46 +69,50 @@ pwd = Path.cwd() name = args['name'] mod_dir = pwd / Path(args['modpfx']) mods = [ f[:-4] for f in os.listdir(mod_dir) if f.endswith('.mod') ] -verbose = args['verbose'] +verbose = args['verbose'] and not args['quiet'] +quiet = args['quiet'] arb = args['source'] -cmake = """ +cmake = f""" cmake_minimum_required(VERSION 3.9) -project({catalogue}-cat LANGUAGES CXX) +project({name}-cat LANGUAGES CXX) find_package(arbor REQUIRED) +set(CMAKE_CXX_COMPILER ${{ARB_CXX}}) +set(CMAKE_CXX_FLAGS ${{ARB_CXX_FLAGS}}) + include(BuildModules.cmake) set(ARB_WITH_EXTERNAL_MODCC true) find_program(modcc NAMES modcc) make_catalogue( - NAME {catalogue} + NAME {name} SOURCES "${{CMAKE_CURRENT_SOURCE_DIR}}/mod" - OUTPUT "CAT_{catalogue}_SOURCES" - MECHS {mods} - ARBOR {arb}) + OUTPUT "CAT_{name.upper()}_SOURCES" + MECHS {' '.join(mods)} + ARBOR {arb} + STANDALONE ON + VERBOSE {"ON" if verbose else "OFF"}) """ -print(f"Building catalogue '{name}' from mechanisms in {mod_dir}") -for m in mods: - print(" *", m) +if not quiet: + print(f"Building catalogue '{name}' from mechanisms in {mod_dir}") + for m in mods: + print(" *", m) with TemporaryDirectory() as tmp: - print(f"Setting up temporary build directory: {tmp}") tmp = Path(tmp) shutil.copytree(mod_dir, tmp / 'mod') os.mkdir(tmp / 'build') os.chdir(tmp / 'build') with open(tmp / 'CMakeLists.txt', 'w') as fd: - fd.write(cmake.format(catalogue=name, mods=' '.join(mods), arb=arb)) + fd.write(cmake) shutil.copy2(f'{arb}/mechanisms/BuildModules.cmake', tmp) shutil.copy2(f'{arb}/mechanisms/generate_catalogue', tmp) - print("Configuring...") sp.run('cmake ..', shell=True, check=True, capture_output=not verbose) - print("Building...") sp.run('make', shell=True, capture_output=not verbose) - print("Cleaning-up...") shutil.copy2(f'{name}-catalogue.so', pwd) - print(f'Catalogue has been built and copied to {pwd}/{name}-catalogue.so') + if not quiet: + print(f'Catalogue has been built and copied to {pwd}/{name}-catalogue.so')