Skip to content
Commits on Source (5)
......@@ -7,6 +7,7 @@
*.dylib
*.real
*.cplx
*.bak
inc/
*.d
!CMakeLists.txt
......@@ -24,3 +25,6 @@ external/
test/integration/test_cases.txt
*.h5
tags
test/integration/*.xprot
test/integration/*.xml
.atom-build.json
cmake_minimum_required(VERSION 2.8)
cmake_minimum_required(VERSION 2.8.7) #Currently targeting to TRAVIS CI cmake version from 2011
foreach(p
CMP0025 # CMake 3.0 Compiler id for Apple Clang is now ``AppleClang``.
CMP0042 # CMake 3.0 ``MACOSX_RPATH`` is enabled by default.
CMP0046 # CMake 3.0 Error on non-existent dependency in add_dependencies.
CMP0054 # CMake 3.1 Only interpret ``if()`` arguments as variables or keywords when unquoted.
CMP0056 # CMake 3.2 Honor link flags in ``try_compile()`` source-file signature.
CMP0058 # CMake 3.3 Ninja requires custom command byproducts to be explicit.
)
if(POLICY ${p})
cmake_policy(SET ${p} NEW)
endif()
endforeach()
project(GADGETRON)
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
# --- Provide good defaults for searching for packages (i.e. ismrmrd)
set(CMAKE_PREFIX_PATH "")
if(CMAKE_PREFIX_PATH)
list(APPEND CMAKE_PREFIX_PATH "/usr/local")
endif()
if(EXISTS $ENV{CMAKE_PREFIX_PATH})
list(APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
endif()
if(EXISTS $ENV{ISMRMRD_HOME})
list(APPEND CMAKE_PREFIX_PATH $ENV{ISMRMRD_HOME})
endif()
list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
message(STATUS "Looking for packages in : ${CMAKE_PREFIX_PATH}")
# ---
# check the compiler version
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if (NOT CMAKE_CXX_COMPILER_VERSION) #Compiler version is not set on Ubuntu 12.02 (gcc 4.6)
......@@ -10,7 +42,7 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
message("CXX COMPILER VERSION: ${CMAKE_CXX_COMPILER_ID} : ${CMAKE_CXX_COMPILER_VERSION}")
message(FATAL_ERROR "Gadgetron requires GCC version >= 4.8")
endif()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
message(FATAL_ERROR "Gadgetron requires Clang version >= 3.5")
endif()
......@@ -24,8 +56,8 @@ endif()
#VERSIONING AND INSTALL PATHS
set(GADGETRON_VERSION_MAJOR 3)
set(GADGETRON_VERSION_MINOR 7)
set(GADGETRON_VERSION_PATCH 5)
set(GADGETRON_VERSION_MINOR 17)
set(GADGETRON_VERSION_PATCH 0)
set(GADGETRON_VERSION_STRING ${GADGETRON_VERSION_MAJOR}.${GADGETRON_VERSION_MINOR}.${GADGETRON_VERSION_PATCH})
set(GADGETRON_SOVERSION ${GADGETRON_VERSION_MAJOR}.${GADGETRON_VERSION_MINOR})
find_package(Git)
......@@ -37,7 +69,7 @@ if (GIT_FOUND)
if(${GADGETRON_GIT_SHA1_LEN} LESS 40)
message(WARNING "Could not determine SHA-1 hash: ${GADGETRON_GIT_STDERR}")
set(GADGETRON_GIT_SHA1 "NA")
endif(${GADGETRON_GIT_SHA1_LEN} LESS 40)
endif()
else()
set(GADGETRON_GIT_SHA1 "NA")
endif()
......@@ -51,83 +83,109 @@ set(GADGETRON_INSTALL_CHROOT_SCRIPTS_PATH share/gadgetron/chroot)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
#Set the build type to Release if not specified
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release CACHE STRING
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
endif()
# build options for 64 bits system
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
message("64bit system is found")
set( HAS_64_BIT On CACHE BOOL "64bit build")
else( CMAKE_SIZEOF_VOID_P EQUAL 8 )
else()
message("32bit system is found")
set( HAS_64_BIT Off CACHE BOOL "64bit build")
endif( CMAKE_SIZEOF_VOID_P EQUAL 8 )
endif()
# whether to install dependencies
OPTION(GADGETRON_INSTALL_DEPENDENCIES "Install gadgetron dependencies" Off)
option(GADGETRON_INSTALL_DEPENDENCIES "Install gadgetron dependencies" Off)
# build options for OpenMP support
find_package(OpenMP)
OPTION(USE_OPENMP "Use OpenMP" On)
option(USE_OPENMP "Use OpenMP" On)
if (OPENMP_FOUND)
if(USE_OPENMP)
message("OpenMP multithreading enabled")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
ADD_DEFINITIONS(-DUSE_OMP)
else (USE_OPENMP)
add_definitions(-DUSE_OMP)
else ()
message("OpenMP multithreading is supported, but disabled")
endif(USE_OPENMP)
else (OPENMP_FOUND)
endif()
else ()
message("OpenMP multithreading not supported")
endif (OPENMP_FOUND)
endif ()
if (WIN32)
ADD_DEFINITIONS(-DWIN32 -D_WIN32 -D_WINDOWS)
# ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ADD_DEFINITIONS(-D_VARIADIC_MAX=10) #to fix compiler limitations in Visual Studio Express
ADD_DEFINITIONS("/wd4251") #disable warnings, 4251: needs to have dll-interface to be used by clients
ADD_DEFINITIONS("/wd4344") #disable warnings, 4344: behavior change: use of explicit template arguments
ADD_DEFINITIONS("/wd4996") #disable warnings, 4996: the POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name
add_definitions(-DWIN32 -D_WIN32 -D_WINDOWS)
#add_definitions(-DUNICODE -D_UNICODE)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
add_definitions(-D_VARIADIC_MAX=10) #to fix compiler limitations in Visual Studio Express
add_definitions("/wd4251") #disable warnings, 4251: needs to have dll-interface to be used by clients
add_definitions("/wd4344") #disable warnings, 4344: behavior change: use of explicit template arguments
add_definitions("/wd4996") #disable warnings, 4996: the POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name
if ( HAS_64_BIT )
ADD_DEFINITIONS(-DWIN64 -D_WIN64)
endif ( HAS_64_BIT )
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP")
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
SET (CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} /INCREMENTAL:NO")
SET (CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} /INCREMENTAL:NO")
SET (CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
SET (CMAKE_SHARED_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
SET (CMAKE_STATIC_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
SET (CMAKE_MODULE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
add_definitions(-DWIN64 -D_WIN64)
endif ()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /bigobj")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
set (CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} /INCREMENTAL:NO")
set (CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} /INCREMENTAL:NO")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
set (CMAKE_STATIC_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
set (CMAKE_MODULE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
# The two flags below is to fix Windows problems in relation to multiple defined operators new/delete and some constructors that are defined in our headers
# SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /FORCE:MULTIPLE")
# SET (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE")
else (WIN32)
if (UNIX)
# set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /FORCE:MULTIPLE")
# set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE")
else ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
include(CheckCXXCompilerFlag)
set(CXX_STANDARDS 20 17 14 11)
set(CXX_STANDARD_FOUND 0)
foreach(year ${CXX_STANDARDS})
check_cxx_compiler_flag(-std=c++${year} COMPILER_SUPPORTS_CXX${year})
if(COMPILER_SUPPORTS_CXX${year})
set(CXX_STANDARD_FOUND 1)
message(STATUS "Compiling using C++${year} standard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${year}")
break()
endif()
endforeach()
if(APPLE)
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
else (APPLE)
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11")
endif (APPLE)
endif (UNIX)
endif (WIN32)
if(NOT CXX_STANDARD_FOUND)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
endif()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CXX_STANDARD_FOUND 1)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-type")
check_cxx_compiler_flag(-Werror=terminate COMPILER_SUPPORTS_WTERMINATE)
if(COMPILER_SUPPORTS_WTERMINATE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=terminate")
endif()
endif()
if(NOT CXX_STANDARD_FOUND)
message(FATAL_ERROR "The compiler does not support the most recent C++ standards. Please change compiler")
endif()
endif ()
include_directories(${CMAKE_SOURCE_DIR}/toolboxes/log)
# whether to suppress compilation warnings
OPTION(BUILD_SUPPRESS_WARNINGS "Build package while suppressing warnings" Off)
option(BUILD_SUPPRESS_WARNINGS "Build package while suppressing warnings" Off)
if (BUILD_SUPPRESS_WARNINGS)
if (WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0")
elseif (WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -w")
endif (WIN32)
endif (BUILD_SUPPRESS_WARNINGS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -w")
endif ()
endif ()
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
......@@ -138,34 +196,34 @@ set(Boost_NO_BOOST_CMAKE ON)
if(WIN32)
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
endif(WIN32)
endif()
if(WIN32)
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
endif(WIN32)
endif()
# We actually only use system and thread explicitly, but they require linking in date_time and chrono
if (WIN32)
find_package(Boost COMPONENTS system thread date_time chrono program_options filesystem REQUIRED)
else(WIN32)
find_package(Boost COMPONENTS system thread program_options filesystem REQUIRED)
endif(WIN32)
find_package(Boost COMPONENTS system thread date_time chrono program_options filesystem timer REQUIRED)
else()
find_package(Boost COMPONENTS system thread program_options filesystem timer REQUIRED)
endif()
find_package(ACE)
if(NOT ACE_FOUND)
MESSAGE("ACE not found. Only toolboxes and standalone applications are compiled. The streaming framework will NOT be compiled.")
endif(NOT ACE_FOUND)
find_package(ACE REQUIRED)
find_package(CUDA_advanced)
option(USE_CUDA "Build with CUDA support" On)
if (CUDA_FOUND)
ADD_DEFINITIONS(-DUSE_CUDA)
SET( GADGETRON_CUDA_FOUND_BOOL 1 )
if (USE_CUDA)
find_package(CUDA_advanced)
endif()
if (CUDA_FOUND AND USE_CUDA)
add_definitions(-DUSE_CUDA)
set( GADGETRON_CUDA_FOUND_BOOL 1 )
include_directories( ${CUDA_INCLUDE_DIRS} )
if (NOT WIN32)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
endif (NOT WIN32)
# if (NOT WIN32)
# set(CUDA_PROPAGATE_HOST_FLAGS OFF)
# endif ()
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} )
set(CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
#set(CUDA_VERBOSE_BUILD ON)
......@@ -174,20 +232,23 @@ if (CUDA_FOUND)
# Support compute model 3.0 from Cuda 4.2 and up
# Support compute model 3.5 from Cuda 5 and up
OPTION(GADGETRON_CUDA_ALL_COMPUTE_MODEL "Build CUDA components for all computing models" Off)
option(GADGETRON_CUDA_ALL_COMPUTE_MODEL "Build CUDA components for all computing models" OFF)
if (GADGETRON_CUDA_ALL_COMPUTE_MODEL)
MESSAGE("Compiling CUDA components to support compute model 2.0, 3.0 and 3.5")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_20,code=sm_20")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_30,code=sm_30")
message("Compiling CUDA components to support all compute model 3.5, 5.0, 5.2, 6.0, 6.1, 7.0")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_35,code=sm_35")
endif (GADGETRON_CUDA_ALL_COMPUTE_MODEL)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_50,code=sm_50")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_52,code=sm_52")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_60,code=sm_60")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_61,code=sm_61")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-gencode arch=compute_70,code=sm_70")
endif ()
MESSAGE("Compiling with ${CUDA_NVCC_FLAGS}")
else (CUDA_FOUND)
MESSAGE("CUDA not found. CUDA components will not be compiled.")
SET( GADGETRON_CUDA_FOUND_BOOL 0 )
SET( CUDA_NVCC_FLAGS "NA")
endif (CUDA_FOUND)
message("Compiling with ${CUDA_NVCC_FLAGS}")
else ()
message("CUDA not found. CUDA components will not be compiled.")
set( GADGETRON_CUDA_FOUND_BOOL 0 )
set( CUDA_NVCC_FLAGS "NA")
endif ()
find_package(GTest)
#Add support for the default ubuntu package of gtest (which is not compiled
......@@ -195,80 +256,106 @@ if (NOT GTEST_FOUND)
find_path(GTEST_SRC_DIR src/gtest.cc HINTS /usr/src/gtest)
find_path(GTEST_INCLUDE_DIRS gtest.h HINTS /usr/include/gtest)
if (GTEST_SRC_DIR AND GTEST_INCLUDE_DIRS)
MESSAGE("GTest src package found. Compiling as part of Gadgetron.")
message("GTest src package found. Compiling as part of Gadgetron.")
add_subdirectory(${GTEST_SRC_DIR} ${CMAKE_BINARY_DIR}/gtest )
include_directories(${GTEST_INCLUDE_DIRS})
set(GTEST_FOUND 1)
set(GTEST_LIBRARIES gtest gtest_main)
endif (GTEST_SRC_DIR AND GTEST_INCLUDE_DIRS)
endif (NOT GTEST_FOUND)
endif ()
endif ()
find_package(Armadillo)
find_package(Armadillo 4.600 REQUIRED)
# check whether ILP64 MKL should is used
if(ARMADILLO_FOUND)
ADD_DEFINITIONS(-DUSE_ARMADILLO)
set(ARMADILLO_BLAS_LONG_LONG FALSE)
if(EXISTS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp")
# Read and parse armadillo config.hpp to find out whether BLAS uses long long
file(STRINGS "${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp" _armadillo_blas_long_long REGEX "// #define ARMA_BLAS_LONG_LONG")
if ( NOT _armadillo_blas_long_long )
set(ARMADILLO_BLAS_LONG_LONG TRUE)
MESSAGE("Armadillo is found to use long long for BLAS calls")
else ( NOT _armadillo_blas_long_long )
MESSAGE("Armadillo found. Note that ARMADILLO_BLAS_LONG_LONG _must_ be defined in ${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp to link against the MKL ILP64 interface.")
endif ( NOT _armadillo_blas_long_long )
unset(_armadillo_blas_long_long)
endif()
else()
message("Armadillo not found. This will disable many toolboxes and gadgets.")
endif()
find_package(HDF5 1.8 COMPONENTS C CXX HL)
if (HDF5_FOUND)
message("HDF5 Found")
message("Armadillo is found to use long long for BLAS calls")
else ()
message("HDF5 not found")
message("Armadillo found. Note that ARMADILLO_BLAS_LONG_LONG _must_ be defined in ${ARMADILLO_INCLUDE_DIR}/armadillo_bits/config.hpp to link against the MKL ILP64 interface.")
endif ()
find_package(FFTW3 COMPONENTS single double)
if (FFTW3_FOUND)
message("FFTW3 Found")
else()
message("FFTW3 not found")
unset(_armadillo_blas_long_long)
endif()
find_package(Ismrmrd)
if (ISMRMRD_FOUND)
message("ISMRMRD Found")
else()
message("ISMRMRD not found")
endif()
find_package(HDF5 1.8 COMPONENTS C CXX HL REQUIRED)
find_package(FFTW3 COMPONENTS single double REQUIRED)
find_package(ISMRMRD REQUIRED)
link_directories(${ISMRMRD_LIBRARY_DIRS})
find_package(MKL)
if (MKL_FOUND)
if ( MKL_VERSION_STRING VERSION_LESS 11.2.0 )
message(FATAL_ERROR "Gadgetron requires Intel MKL version >= 11.2.0")
endif ()
endif (MKL_FOUND)
endif ()
find_package(BLAS)
find_package(LAPACK)
if (LAPACK_FOUND)
message("LAPACK Found")
ADD_DEFINITIONS(-DUSE_LAPACK)
endif (LAPACK_FOUND)
add_definitions(-DUSE_LAPACK)
endif ()
find_package(Eigen3)
find_package(Ceres)
option(BUILD_PYTHON_SUPPORT "Build Python gadgets etc" On)
if (BUILD_PYTHON_SUPPORT)
option(BUILD_WITH_PYTHON3 "Build with Python 3.x" Off)
if (BUILD_WITH_PYTHON3)
find_package(Python3)
else()
find_package(PythonLibs 2)
endif ()
string(REPLACE "." ";" PYTHON_VERSION_MAJOR ${PYTHONLIBS_VERSION_STRING})
list(GET PYTHON_VERSION_MAJOR 0 PYVER)
add_definitions(-DPYVER=${PYVER})
find_package(NumPy)
if(NOT PYTHONLIBS_FOUND)
message(STATUS "Python Libraries/Headers NOT found, NOT compiling Python Gadgets")
set(BUILD_PYTHON_SUPPORT OFF)
endif()
if(NOT NUMPY_FOUND)
message("NumPy NOT found, NOT compiling Python Gadgets")
set(BUILD_PYTHON_SUPPORT OFF)
else()
message("Found numpy : ${NUMPY_INCLUDE_DIRS} ${NUMPY_LIBRARIES}")
endif()
endif()
option(BUILD_MATLAB_SUPPORT "Build of MATLAB gadgets etc" On)
if (BUILD_MATLAB_SUPPORT)
find_package(GMatlab)
if (MATLAB_FOUND)
ADD_DEFINITIONS(-DUSE_MATLAB)
endif (MATLAB_FOUND)
add_definitions(-DUSE_MATLAB)
else()
set(BUILD_MATLAB_SUPPORT OFF)
endif ()
else()
# explicitly set it, just in case BUILD_MATLAB_SUPPORT was set to OFF
# after Matlab was already found.
set(MATLAB_FOUND OFF)
endif ()
message("Searching for OpenGL, GLEW, GLUT, and Qt. These libraries are only used in a single standalone application and are thus non-essential.")
if(WIN32)
message("For Windows users in particular, for ease of installation we do not reccomend installing these libraries.")
endif(WIN32)
endif()
find_package(OpenGL)
find_package(GLEW)
find_package(GLUT)
find_package(Qt4 4.6)
find_package(PLplot)
add_subdirectory(toolboxes)
add_subdirectory(apps)
......@@ -279,6 +366,12 @@ else()
message("Required dependencies for gadget compilation not found (ACE, ISMRMRD, FFTW3, HDF5).")
endif()
option(BUILD_WITH_GPERFTOOLS_PROFILER "Build with the gperftools profiler." Off)
if (BUILD_WITH_GPERFTOOLS_PROFILER)
message("Adding gpertools to build.")
find_package(Gperftools REQUIRED)
endif()
add_subdirectory(test)
add_subdirectory(cmake)
add_subdirectory(doc)
......@@ -288,16 +381,16 @@ add_subdirectory(chroot)
if (WIN32)
if (GADGETRON_INSTALL_DEPENDENCIES)
include(${CMAKE_SOURCE_DIR}/cmake/InstallWinDependencies.cmake)
endif (GADGETRON_INSTALL_DEPENDENCIES)
endif (WIN32)
endif ()
endif ()
if (UNIX)
if (NOT APPLE)
if (GADGETRON_INSTALL_DEPENDENCIES)
include(${CMAKE_SOURCE_DIR}/cmake/InstallLinuxDependencies.cmake)
endif (GADGETRON_INSTALL_DEPENDENCIES)
endif (NOT APPLE)
endif (UNIX)
endif ()
endif ()
endif ()
# --- Main Library (end) ----
......@@ -309,4 +402,4 @@ if(CPACK_GENERATOR)
configure_file("${CMAKE_SOURCE_DIR}/cmake/cpack_options.cmake.in" ${GADGETRON_CPACK_CFG_FILE} @ONLY)
set(CPACK_PROJECT_CONFIG_FILE ${GADGETRON_CPACK_CFG_FILE})
include(CPack)
endif(CPACK_GENERATOR)
endif()
GADGETRON IMAGE RECONSTRUCTION FRAMEWORK
=========================================
Please read LICENSE file for licensing details.
......@@ -6,14 +7,16 @@ Detailed installation instructions and manual is available at:
http://gadgetron.github.io
-------------------------------------
General Building Instructions (on Unix platforms)
-------------------------------------------------
```
mkdir build
cd build
cmake ../
make
sudo make install
```
Please check manual for detailed instructions for your platform.
IF (ACE_FOUND )
if (ACE_FOUND )
add_subdirectory(gadgetron)
ENDIF (ACE_FOUND )
endif ()
add_subdirectory(clients)
add_subdirectory(standalone)
if (MATLAB_FOUND )
add_subdirectory(matlab)
endif ()
IF(ACE_FOUND)
if(ACE_FOUND)
add_subdirectory(utilities)
ENDIF()
endif()
IF(ISMRMRD_FOUND AND HDF5_FOUND)
if(ISMRMRD_FOUND AND HDF5_FOUND)
add_subdirectory(gadgetron_ismrmrd_client)
ENDIF()
\ No newline at end of file
endif()
\ No newline at end of file
find_package(Ismrmrd REQUIRED)
find_package(ZFP)
find_package(HDF5 1.8 REQUIRED COMPONENTS C)
include_directories(${HDF5_C_INCLUDE_DIR})
if (ZFP_FOUND)
add_definitions(-DGADGETRON_COMPRESSION_ZFP)
endif()
set(Boost_NO_BOOST_CMAKE ON)
if(WIN32)
find_package(Boost COMPONENTS program_options thread system date_time chrono REQUIRED)
else(WIN32)
else()
find_package(Boost COMPONENTS program_options thread system REQUIRED)
endif(WIN32)
endif()
if(WIN32)
link_directories(${Boost_LIBRARY_DIRS})
endif(WIN32)
endif()
include_directories(
${Boost_INCLUDE_DIR}
${ISMRMRD_INCLUDE_DIR}
${CMAKE_SOURCE_DIR}/gadgets/mri_core
)
if (ZFP_FOUND)
include_directories(${ZFP_INCLUDE_DIR})
endif()
add_executable(gadgetron_ismrmrd_client gadgetron_ismrmrd_client.cpp)
target_link_libraries(gadgetron_ismrmrd_client ${ISMRMRD_LIBRARIES} ${Boost_LIBRARIES})
if (ZFP_FOUND)
target_link_libraries(gadgetron_ismrmrd_client ${ZFP_LIBRARIES})
endif ()
install(TARGETS gadgetron_ismrmrd_client DESTINATION bin COMPONENT main)
......@@ -2,13 +2,13 @@ set(Boost_NO_BOOST_CMAKE ON)
if(WIN32)
find_package(Boost COMPONENTS thread system date_time chrono REQUIRED)
else(WIN32)
else()
find_package(Boost COMPONENTS thread system REQUIRED)
endif(WIN32)
endif()
if(WIN32)
link_directories(${Boost_LIBRARY_DIRS})
endif(WIN32)
endif()
include_directories(
${CMAKE_SOURCE_DIR}/apps/gadgetron
......@@ -28,7 +28,7 @@ include_directories(
)
add_executable(gt_alive gt_alive.cpp)
add_executable(gtdependencyquery gt_query.cpp DependencyQueryReader.h gtquery.xml)
add_executable(gtdependencyquery gt_query.cpp DependencyQueryReader.h)
target_link_libraries(gt_alive gadgetron_toolbox_cpucore
gadgetron_toolbox_gadgettools
......@@ -46,4 +46,3 @@ target_link_libraries(gtdependencyquery gadgetron_toolbox_cpucore
install(TARGETS gt_alive gtdependencyquery DESTINATION bin COMPONENT main)
install(FILES DependencyQueryReader.h DESTINATION ${GADGETRON_INSTALL_INCLUDE_PATH} COMPONENT main)
install(FILES isalive.xml gtquery.xml DESTINATION ${GADGETRON_INSTALL_CONFIG_PATH} COMPONENT main)
#include "GadgetronConnector.h"
#include "GadgetMRIHeaders.h"
#include "GadgetContainerMessage.h"
#include "FileInfo.h"
#include <ace/SOCK_Acceptor.h>
#include <ace/Addr.h>
......
<?xml version="1.0" encoding="UTF-8"?>
<gadgetronStreamConfiguration xsi:schemaLocation="http://gadgetron.sf.net/gadgetron gadgetron.xsd"
xmlns="http://gadgetron.sf.net/gadgetron"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
<reader>
<slot>1008</slot>
<dll>gadgetroncore</dll>
<classname>GadgetIsmrmrdAcquisitionMessageReader</classname>
</reader>
<writer>
<slot>1004</slot>
<dll>gadgetroncore</dll>
<classname>MRIImageWriterCPLX</classname>
</writer>
<writer>
<slot>1005</slot>
<dll>gadgetroncore</dll>
<classname>MRIImageWriterFLOAT</classname>
</writer>
<writer>
<slot>1006</slot>
<dll>gadgetroncore</dll>
<classname>MRIImageWriterUSHORT</classname>
</writer>
<gadget>
<name>Acc</name>
<dll>gadgetroncore</dll>
<classname>AccumulatorGadget</classname>
</gadget>
<gadget>
<name>FFT</name>
<dll>gadgetroncore</dll>
<classname>FFTGadget</classname>
</gadget>
<gadget>
<name>CropCombine</name>
<dll>gadgetroncore</dll>
<classname>CropAndCombineGadget</classname>
</gadget>
<gadget>
<name>Extract</name>
<dll>gadgetroncore</dll>
<classname>ExtractGadget</classname>
</gadget>
<gadget>
<name>ImageFinishFLOAT</name>
<dll>gadgetroncore</dll>
<classname>ImageFinishGadgetFLOAT</classname>
</gadget>
-->
</gadgetronStreamConfiguration>
configure_file(gadgetron_config.in gadgetron_config.h)
if (WIN32)
add_definitions(-DCROW_MSVC_WORKAROUND)
endif()
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/apps/gadgetron
${CMAKE_SOURCE_DIR}/toolboxes/cloudbus
${CMAKE_SOURCE_DIR}/toolboxes/rest
${CMAKE_SOURCE_DIR}/toolboxes/gadgettools
${CMAKE_SOURCE_DIR}/toolboxes/core
${CMAKE_SOURCE_DIR}/toolboxes/core/cpu/hostutils
......@@ -15,14 +20,16 @@ include_directories(
if (CUDA_FOUND)
include_directories(${CUDA_INCLUDE_DIRS})
endif(CUDA_FOUND)
endif()
add_executable(gadgetron
main.cpp
GadgetServerAcceptor.h
GadgetServerAcceptor.cpp
GadgetStreamController.h
EndGadget.h
# EndGadget.h
# EndGadget.cpp
# GadgetStreamInterface.cpp
Gadget.h
GadgetContainerMessage.h
GadgetMessageInterface.h
......@@ -33,10 +40,12 @@ add_executable(gadgetron
target_link_libraries(gadgetron
gadgetron_gadgetbase
gadgetron_toolbox_log
gadgetron_toolbox_rest
gadgetron_toolbox_gadgettools gadgetron_toolbox_cloudbus
optimized ${ACE_LIBRARIES} debug ${ACE_DEBUG_LIBRARY}
)
if (BUILD_PYTHON_SUPPORT)
find_package(PythonLibs)
find_package(NumPy)
find_package(Boost COMPONENTS python)
......@@ -44,9 +53,12 @@ find_package(Boost COMPONENTS python)
if (Boost_PYTHON_FOUND AND PYTHONLIBS_FOUND AND NUMPY_FOUND)
add_definitions("-DCOMPILING_WITH_PYTHON_SUPPORT")
endif()
endif()
add_executable(gadgetron_info
gadgetron_info.cpp
EndGadget.cpp
GadgetStreamInterface.cpp
)
target_link_libraries(gadgetron_info
......@@ -57,21 +69,38 @@ target_link_libraries(gadgetron_info
if (CUDA_FOUND)
target_link_libraries(gadgetron_info ${CUDA_LIBRARIES})
endif(CUDA_FOUND)
target_link_libraries(gadgetron ${CUDA_LIBRARIES})
endif()
add_library(gadgetron_gadgetbase SHARED
Gadget.h
Gadget.cpp
GadgetStreamController.h
GadgetStreamController.cpp
gadgetron_xml.h
gadgetron_xml.cpp
gadgetron_home.h
gadgetron_home.cpp
pugixml.cpp
GadgetStreamInterface.h
GadgetStreamInterface.cpp
EndGadget.h
EndGadget.cpp
)
target_link_libraries(gadgetron_gadgetbase
optimized ${ACE_LIBRARIES} debug ${ACE_DEBUG_LIBRARY}
gadgetron_toolbox_gadgettools
gadgetron_toolbox_cloudbus
gadgetron_toolbox_log
)
if (GPERFTOOLS_PROFILER)
message("Adding gperftools cpu profiler to gadgetron link assemblage.")
target_link_libraries(gadgetron ${GPERFTOOLS_PROFILER} ${GPERFTOOLS_TCMALLOC})
endif()
set_target_properties(gadgetron_gadgetbase PROPERTIES VERSION ${GADGETRON_VERSION_STRING} SOVERSION ${GADGETRON_SOVERSION})
set_target_properties (gadgetron_gadgetbase PROPERTIES COMPILE_DEFINITIONS "__BUILD_GADGETRON_GADGETBASE__")
......@@ -85,11 +114,12 @@ install(FILES
GadgetContainerMessage.h
GadgetMessageInterface.h
GadgetronExport.h
gadgetron_paths.h
gadgetron_home.h
gadgetron_xml.h
GadgetServerAcceptor.h
GadgetStreamController.h
GadgetStreamInterface.h
gadgetron_home.h
${CMAKE_CURRENT_BINARY_DIR}/gadgetron_config.h
DESTINATION ${GADGETRON_INSTALL_INCLUDE_PATH} COMPONENT main)
......@@ -100,5 +130,3 @@ install(FILES
install(FILES
schema/gadgetron.xsd
DESTINATION ${GADGETRON_INSTALL_SCHEMA_PATH} COMPONENT main)
add_subdirectory(webapp)
#include "Gadget.h"
#include "GadgetMessageInterface.h"
#include "GadgetStreamInterface.h"
#include "EndGadget.h"
namespace Gadgetron {
int EndGadget::close(unsigned long flags)
{
GDEBUG("Close called in EndGadget with flags %d\n", flags);
GadgetContainerMessage<GadgetMessageIdentifier>* mb =
new GadgetContainerMessage<GadgetMessageIdentifier>();
mb->getObjectPtr()->id = GADGET_MESSAGE_CLOSE;
if (controller_->output_ready(mb) < 0) {
return GADGET_FAIL;
}
GDEBUG("Calling close in base class with flags %d\n", flags);
return Gadget::close(flags);
}
int EndGadget::process(ACE_Message_Block *m)
{
m->release();
return 0;
}
int EndGadget::next_step(ACE_Message_Block *m)
{
m->release();
return 0;
}
int EndGadget::process_config(ACE_Message_Block * m) {
m->release();
return 0;
}
}
/*
* EndGadget.h
*
* Created on: Nov 3, 2011
* Author: hansenms
*/
#ifndef ENDGADGET_H_
#define ENDGADGET_H_
......@@ -12,43 +5,14 @@
#include "GadgetMessageInterface.h"
namespace Gadgetron{
class EndGadget : public Gadget
{
virtual int close(unsigned long flags)
class EXPORTGADGETBASE EndGadget : public Gadget
{
GDEBUG("Close called in EndGadget with flags %d\n", flags);
GadgetContainerMessage<GadgetMessageIdentifier>* mb =
new GadgetContainerMessage<GadgetMessageIdentifier>();
mb->getObjectPtr()->id = GADGET_MESSAGE_CLOSE;
if (controller_->output_ready(mb) < 0) {
return GADGET_FAIL;
}
GDEBUG("Calling close in base class with flags %d\n", flags);
return Gadget::close(flags);
}
virtual int close(unsigned long flags);
protected:
virtual int process(ACE_Message_Block *m)
{
m->release();
return 0;
}
virtual int next_step(ACE_Message_Block *m)
{
m->release();
return 0;
}
virtual int process_config(ACE_Message_Block * m) {
m->release();
return 0;
}
virtual int process(ACE_Message_Block *m);
virtual int next_step(ACE_Message_Block *m);
virtual int process_config(ACE_Message_Block * m);
};
}
......
......@@ -12,21 +12,11 @@ namespace Gadgetron
std::string str_val;
GadgetPropertyBase* p = find_property(name);
if (using_properties_) {
if (!p) {
GERROR("Property %s\n", name);
throw std::runtime_error("Attempting to access non existent property on Gadget");
}
str_val = std::string(p->string_value());
} else {
std::map<std::string,std::string>::iterator it;
parameter_mutex_.acquire();
it = parameters_.find(std::string(name));
parameter_mutex_.release();
if (it != parameters_.end()) {
str_val = it->second;
}
}
//If string contains an @ sign, we should look for this parameter on another gadget
size_t at_pos = str_val.find('@');
......
......@@ -19,6 +19,7 @@
#include "GadgetronExport.h"
#include "gadgetron_config.h"
#include "log.h"
#include <initializer_list>
#include <stdexcept>
......@@ -42,7 +43,7 @@ namespace Gadgetron{
}
virtual const char* name()
virtual const char* name() const
{
return name_.c_str();
}
......@@ -105,7 +106,6 @@ namespace Gadgetron{
Gadget()
: inherited()
, using_properties_(false)
, desired_threads_(1)
, pass_on_undesired_data_(false)
, controller_(0)
......@@ -132,17 +132,7 @@ namespace Gadgetron{
virtual int open(void* = 0)
{
int t = this->get_int_value("threads");
if (t > 0) {
GDEBUG("Setting number of threads of gadget %s to %d\n", this->module()->name(), t);
this->desired_threads(t);
}
this->pass_on_undesired_data(this->get_bool_value("pass_on_undesired_data"));
return this->activate( THR_NEW_LWP | THR_JOINABLE,
this->desired_threads() );
return this->activate( THR_NEW_LWP | THR_JOINABLE, this->desired_threads() );
}
int put(ACE_Message_Block *m, ACE_Time_Value* timeout = 0)
......@@ -251,19 +241,25 @@ namespace Gadgetron{
continue;
}
int success;
#ifdef NDEBUG //We actually want a full stack trace in debug mode, so only catch in release.
try{ success = this->process(m); }
catch (std::runtime_error& err){
GEXCEPTION(err,"Gadget::process() failed\n");
success = -1;
}
#else
success = this->process(m);
#endif
if (success == -1){
m->release();
this->flush();
GDEBUG("Gadget (%s) process failed\n", this->module()->name());
GERROR("Gadget (%s) process failed\n", this->module()->name());
return GADGET_FAIL;
}
}
return 0;
}
......@@ -275,9 +271,7 @@ namespace Gadgetron{
if (p) {
p->string_value(val);
} else {
if (using_properties_) {
throw std::runtime_error("Attempting to set non-registered property while operaying in forced using_properties mode");
}
throw std::runtime_error("Attempting to set non-registered property");
}
parameter_mutex_.acquire();
......@@ -291,6 +285,7 @@ namespace Gadgetron{
return 0;
}
/*
virtual int get_bool_value(const char* name) {
return (0 == ACE_OS::strcmp(get_string_value(name)->c_str(), "true"));
}
......@@ -302,6 +297,7 @@ namespace Gadgetron{
virtual double get_double_value(const char* name) {
return ACE_OS::atof(get_string_value(name)->c_str());
}
*/
boost::shared_ptr<std::string> get_string_value(const char* name, unsigned int recursive = 0);
......@@ -347,11 +343,10 @@ namespace Gadgetron{
parameter_mutex_.release();
return p;
}
void register_property(GadgetPropertyBase* p, bool using_properties = true)
void register_property(GadgetPropertyBase* p)
{
parameter_mutex_.acquire();
properties_.push_back(p);
using_properties_ = using_properties;
parameter_mutex_.release();
}
......@@ -361,7 +356,6 @@ namespace Gadgetron{
protected:
std::vector<GadgetPropertyBase*> properties_;
bool using_properties_;
virtual int next_step(ACE_Message_Block *m)
{
......@@ -375,6 +369,7 @@ namespace Gadgetron{
}
unsigned int desired_threads_;
unsigned int threads_;
bool pass_on_undesired_data_;
GadgetStreamInterface* controller_;
ACE_Thread_Mutex parameter_mutex_;
......@@ -476,21 +471,35 @@ namespace Gadgetron{
T max_;
std::string limits_desc_;
};
template<typename T> inline void GadgetProperty_extract_value(const char* val, T& tmp)
{
std::stringstream(val) >> std::boolalpha >> tmp;
}
template<> inline void GadgetProperty_extract_value(const char* val, std::string& tmp)
{
tmp = std::string(val);
}
template <typename T, typename L> class GadgetProperty
: public GadgetPropertyBase
{
public:
GadgetProperty(const char* name, const char* type_string, const char* description,
Gadget* g, T default_value, L limits, bool force_using_properties = true)
Gadget* g, T default_value, L limits)
: GadgetPropertyBase(name,type_string,description)
, g_(g)
, limits_(limits)
{
g_->register_property(this, force_using_properties);
g_->register_property(this);
this->value(default_value);
}
T value()
T value() const
{
if (is_reference_) {
boost::shared_ptr<std::string> val = this->g_->get_string_value(this->name());
......@@ -519,43 +528,129 @@ namespace Gadgetron{
if (!is_reference_)
{
T tmp;
std::stringstream(val) >> std::boolalpha >> tmp;
// std::stringstream(val) >> std::boolalpha >> tmp;
GadgetProperty_extract_value(val,tmp);
this->value(tmp);
}
}
bool operator==(const T &v) const
{
return this->value() == v;
}
operator T() const { return this->value(); }
virtual const char* limits_description()
{
return limits_.limits_description();
}
protected:
T value_;
mutable T value_;
Gadget* g_;
L limits_;
};
template <typename T, typename L> class GadgetProperty<std::vector<T>,L >
: public GadgetPropertyBase
{
public:
GadgetProperty(const char* name, const char* type_string, const char* description,
Gadget* g, std::initializer_list<T> default_value, L limits)
: GadgetPropertyBase(name,type_string,description)
, g_(g)
, limits_(limits)
{
g_->register_property(this);
this->value(default_value);
}
std::vector<T> value() const
{
if (is_reference_) {
boost::shared_ptr<std::string> val = this->g_->get_string_value(this->name());
std::stringstream ss(*val);
T chunk;
values_ = std::vector<T>();
while (ss >> std::boolalpha >> chunk)
values_.push_back(chunk);
}
return values_;
}
operator std::vector<T>() const { return this->value();}
void value(std::vector<T> v)
{
values_ = v;
std::stringstream strstream;
for (T val : values_)
strstream << std::boolalpha << val << " ";
strstream >> str_value_;
is_reference_ = false;
if (!limits_.within_limits(v)) {
GERROR("Property: %s, value: %s, limits:%s\n", this->name(), str_value_.c_str(), this->limits_.limits_description());
throw std::runtime_error("Value assigned outside limit range");
}
}
virtual void string_value(const char* val)
{
GadgetPropertyBase::string_value(val);
if (!is_reference_)
{
std::vector<T> tmp;
T chunk;
std::stringstream ss(val);
while (ss >> std::boolalpha >> chunk )
tmp.push_back(chunk);
this->value(tmp);
}
}
bool operator==(const std::vector<T> &v) const
{
return this->value() == v;
}
virtual const char* limits_description()
{
return limits_.limits_description();
}
protected:
mutable std::vector<T> values_;
L limits_;
Gadget* g_;
};
#define GADGET_PROPERTY(varname, vartype, description, defaultvalue) GadgetProperty<vartype, GadgetPropertyLimitsNoLimits<vartype> > varname{#varname,#vartype, description, this, defaultvalue, GadgetPropertyLimitsNoLimits<vartype>()}
#define GADGET_PROPERTY_NO_FORCE(varname, vartype, description, defaultvalue) GadgetProperty<vartype, GadgetPropertyLimitsNoLimits<vartype> > varname{#varname,#vartype, description, this, defaultvalue, GadgetPropertyLimitsNoLimits<vartype>(), false}
#define GADGET_PROPERTY_LIMITS(varname, vartype, description, defaultvalue, limitstype, ...) GadgetProperty<vartype, limitstype<vartype> > varname{#varname,#vartype, description, this, defaultvalue, limitstype<vartype>{ __VA_ARGS__ }}
class BasicPropertyGadget : public Gadget
{
public:
BasicPropertyGadget()
: Gadget()
{
desired_threads_ = threads.value();
pass_on_undesired_data_ = pass_on_undesired_data.value();
}
virtual ~BasicPropertyGadget() {}
protected:
GADGET_PROPERTY_NO_FORCE(using_cloudbus,bool,"Indicates whether the cloudbus is in use and available", false);
GADGET_PROPERTY_NO_FORCE(pass_on_undesired_data,bool, "If true, data not matching the process function will be passed to next Gadget", false);
GADGET_PROPERTY_NO_FORCE(threads,int, "Number of threads to run in this Gadget", 1);
GADGET_PROPERTY(using_cloudbus,bool,"Indicates whether the cloudbus is in use and available", false);
GADGET_PROPERTY(pass_on_undesired_data,bool, "If true, data not matching the process function will be passed to next Gadget", true);
GADGET_PROPERTY(threads,int, "Number of threads to run in this Gadget", 1);
#ifdef _WIN32
GADGET_PROPERTY_NO_FORCE(workingDirectory, std::string, "Where to store temporary files", "c:\\temp\\gadgetron\\");
GADGET_PROPERTY(workingDirectory, std::string, "Where to store temporary files", "c:\\temp\\gadgetron\\");
#else
GADGET_PROPERTY_NO_FORCE(workingDirectory, std::string, "Where to store temporary files", "/tmp/gadgetron/");
GADGET_PROPERTY(workingDirectory, std::string, "Where to store temporary files", "/tmp/gadgetron/");
#endif // _WIN32
};
......@@ -671,6 +766,48 @@ namespace Gadgetron{
};
template <class P1, class P2> class Gadget1Of2 : public BasicPropertyGadget
{
protected:
int process(ACE_Message_Block* mb)
{
GadgetContainerMessage<P1>* m1 = nullptr;
GadgetContainerMessage<P2>* m2 = nullptr;
if ((m1 = AsContainerMessage<P1>(mb)))
{
return this->process(m1);
}
else if ( (m2 = AsContainerMessage<P2>(mb))){
return this->process(m2);
} else {
if (!pass_on_undesired_data_)
{
GERROR("%s -> %s, (%s, %s, %p, %p), (%s, %s, %p, %p)\n",
this->module()->name(),
"Gadget1Of2::process, Conversion of Message Block Failed, must be one of two types",
typeid(GadgetContainerMessage<P1>*).name(),
typeid(m1).name(),
mb,
m1,
typeid(GadgetContainerMessage<P2>*).name(),
typeid(m2).name(),
mb->cont(),
m2);
return -1;
}
else
{
return (this->next()->putq(mb));
}
}
}
virtual int process(GadgetContainerMessage<P1>* m1) = 0;
virtual int process(GadgetContainerMessage<P2>* m1) = 0;
};
/* Macros for handling dyamic linking */
// #define GADGET_DECLARE(GADGET) GADGETRON_LOADABLE_DECLARE(GADGET)
// #define GADGET_FACTORY_DECLARE(GADGET) GADGETRON_LOADABLE_FACTORY_DECLARE(Gadget,GADGET)
......
......@@ -76,7 +76,7 @@ public:
:base(sizeof(T)), content_(0)
{
//Using placement new to put the new object at the ACE_Message_Block location
content_ = new (this->wr_ptr()) T{xs...};
content_ = new (this->wr_ptr()) T(xs...);
//Advance the write pointer appropriately.
this->wr_ptr(sizeof(T));
......
......@@ -18,6 +18,7 @@ enum GadgetronMessageID {
GADGET_MESSAGE_CONFIG_SCRIPT = 2,
GADGET_MESSAGE_PARAMETER_SCRIPT = 3,
GADGET_MESSAGE_CLOSE = 4,
GADGET_MESSAGE_TEXT = 5,
GADGET_MESSAGE_INT_ID_MAX = 999
};
......@@ -215,16 +216,18 @@ class GadgetMessageScriptReader : public GadgetMessageReader
/* Macros for handling dyamic linking */
//#define GADGETRON_READER_DECLARE(READER) \
// GADGETRON_LOADABLE_DECLARE(READER)
/*#define GADGETRON_READER_DECLARE(READER) \
GADGETRON_LOADABLE_DECLARE(READER)
*/
#define GADGETRON_READER_DECLARE(READER)
#define GADGETRON_READER_FACTORY_DECLARE(READER) \
GADGETRON_LOADABLE_FACTORY_DECLARE(GadgetMessageReader, READER)
//#define GADGETRON_WRITER_DECLARE(WRITER) \
// GADGETRON_LOADABLE_DECLARE(WRITER)
/*#define GADGETRON_WRITER_DECLARE(WRITER) \
GADGETRON_LOADABLE_DECLARE(WRITER)
*/
#define GADGETRON_WRITER_DECLARE(WRITER)
......