From 0bb1c125415a259aef4902349e52cdbda09f741a Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 21 Apr 2021 21:34:28 +0200
Subject: [PATCH] Win export symbol per lib

---
 Device/CMakeLists.txt     |  3 +++
 Device/Unit/AxisNames.cpp | 18 +++++++++---------
 Device/Unit/AxisNames.h   | 18 +++++++++---------
 Wrap/WinDllMacros.h       |  8 +++++++-
 4 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/Device/CMakeLists.txt b/Device/CMakeLists.txt
index 8a4f0b8931a..f68d827ab9e 100644
--- a/Device/CMakeLists.txt
+++ b/Device/CMakeLists.txt
@@ -34,6 +34,9 @@ target_link_libraries(${lib}
     ${tspectrum_LIBRARY}
     )
 
+if(WIN32)
+    target_compile_definitions(${lib} -DBA_DEVICE_BUILD_DLL)
+endif()
 if(BORNAGAIN_TIFF_SUPPORT)
     target_compile_definitions(${lib} PUBLIC -DBORNAGAIN_TIFF_SUPPORT)
     target_include_directories(${lib} PUBLIC ${TIFF_INCLUDE_DIR})
diff --git a/Device/Unit/AxisNames.cpp b/Device/Unit/AxisNames.cpp
index 8925a5c994f..d687f67b087 100644
--- a/Device/Unit/AxisNames.cpp
+++ b/Device/Unit/AxisNames.cpp
@@ -18,13 +18,13 @@
 namespace AxisNames {
 
 // For spherical detectors in GISAS simulations
-const std::map<Axes::Units, std::string> sphericalAxis0 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> sphericalAxis0 = {
         { Axes::Units::NBINS, "X [nbins]" },
         { Axes::Units::RADIANS, "phi_f [rad]" },
         { Axes::Units::DEGREES, "phi_f [deg]" },
         { Axes::Units::QSPACE, "Qy [1/nm]" },
         { Axes::Units::QXQY, "Qx [1/nm]" } };
-const std::map<Axes::Units, std::string> sphericalAxis1 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> sphericalAxis1 = {
         { Axes::Units::NBINS, "Y [nbins]" },
         { Axes::Units::RADIANS, "alpha_f [rad]" },
         { Axes::Units::DEGREES, "alpha_f [deg]" },
@@ -32,14 +32,14 @@ const std::map<Axes::Units, std::string> sphericalAxis1 = {
         { Axes::Units::QXQY, "Qy [1/nm]" } };
 
 // For rectangular detectors in GISAS simulations
-const std::map<Axes::Units, std::string> rectangularAxis0 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> rectangularAxis0 = {
         { Axes::Units::NBINS, "X [nbins]" },
         { Axes::Units::RADIANS, "phi_f [rad]" },
         { Axes::Units::DEGREES, "phi_f [deg]" },
         { Axes::Units::MM, "X [mm]" },
         { Axes::Units::QSPACE, "Qy [1/nm]" },
         { Axes::Units::QXQY, "Qx [1/nm]" } };
-const std::map<Axes::Units, std::string> rectangularAxis1 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> rectangularAxis1 = {
         { Axes::Units::NBINS, "Y [nbins]" },
         { Axes::Units::RADIANS, "alpha_f [rad]" },
         { Axes::Units::DEGREES, "alpha_f [deg]" },
@@ -49,23 +49,23 @@ const std::map<Axes::Units, std::string> rectangularAxis1 = {
 
 // For off-specular simulations (both spherical and rectangular detectors)
 // Currently 'mm' is not supported for the y-axis
-const std::map<Axes::Units, std::string> offSpecularAxis0 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> offSpecularAxis0 = {
     { Axes::Units::NBINS, "X [nbins]" },
     { Axes::Units::RADIANS, "alpha_i [rad]" },
     { Axes::Units::DEGREES, "alpha_i [deg]" }};
-const std::map<Axes::Units, std::string> offSpecularAxis1 = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> offSpecularAxis1 = {
     { Axes::Units::NBINS, "Y [nbins]" },
     { Axes::Units::RADIANS, "alpha_f [rad]" },
     { Axes::Units::DEGREES, "alpha_f [deg]" }};
 
-const std::map<Axes::Units, std::string> specAxis = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> specAxis = {
     { Axes::Units::NBINS, "X [nbins]" },
     { Axes::Units::RADIANS, "alpha_i [rad]" },
     { Axes::Units::DEGREES, "alpha_i [deg]" },
     { Axes::Units::QSPACE, "Q [1/nm]" },
     { Axes::Units::RQ4, "Q [1/nm]" } };
 
-const std::map<Axes::Units, std::string> specAxisQ = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> specAxisQ = {
     { Axes::Units::NBINS, "X [nbins]" },
     { Axes::Units::QSPACE, "Q [1/nm]" },
     { Axes::Units::RQ4, "Q [1/nm]" } };
@@ -77,7 +77,7 @@ const std::map<Axes::Units, std::string> specAxisQ = {
 // For this reason depth axis map returns always
 // nanometers except for bins.
 
-const std::map<Axes::Units, std::string> sampleDepthAxis = {
+BA_DEVICE_API_ const std::map<Axes::Units, std::string> sampleDepthAxis = {
     { Axes::Units::NBINS, "Y [nbins]" },
     { Axes::Units::RADIANS, "Position [nm]" },
     { Axes::Units::DEGREES, "Position [nm]" },
diff --git a/Device/Unit/AxisNames.h b/Device/Unit/AxisNames.h
index 4165dd5a740..005053269c3 100644
--- a/Device/Unit/AxisNames.h
+++ b/Device/Unit/AxisNames.h
@@ -35,15 +35,15 @@ const std::map<Axes::Units, const char*> axisUnitLabel = {
 //! @ingroup detector
 
 namespace AxisNames {
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> sphericalAxis0;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> sphericalAxis1;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> rectangularAxis0;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> rectangularAxis1;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> offSpecularAxis0;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> offSpecularAxis1;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> specAxis;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> specAxisQ;
-extern BA_CORE_API_ const std::map<Axes::Units, std::string> sampleDepthAxis;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> sphericalAxis0;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> sphericalAxis1;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> rectangularAxis0;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> rectangularAxis1;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> offSpecularAxis0;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> offSpecularAxis1;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> specAxis;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> specAxisQ;
+extern BA_DEVICE_API_ const std::map<Axes::Units, std::string> sampleDepthAxis;
 } // namespace AxisNames
 
 #endif // BORNAGAIN_DEVICE_UNIT_AXISNAMES_H
diff --git a/Wrap/WinDllMacros.h b/Wrap/WinDllMacros.h
index 28e2a90ae96..dbe12541915 100644
--- a/Wrap/WinDllMacros.h
+++ b/Wrap/WinDllMacros.h
@@ -18,8 +18,13 @@
 
 #ifdef _WIN32
 
-#ifdef BA_CORE_BUILD_DLL
+#ifdef BA_DEVICE_BUILD_DLL
+#define BA_DEVICE_API_ __declspec(dllexport)
+#else
+#define BA_DEVICE_API_ __declspec(dllimport)
+#endif // BA_DEVICE_BUILD_DLL
 
+#ifdef BA_CORE_BUILD_DLL
 #define BA_CORE_API_ __declspec(dllexport)
 #else
 #define BA_CORE_API_ __declspec(dllimport)
@@ -28,6 +33,7 @@
 #endif // _WIN32
 
 #ifndef BA_CORE_API_
+#define BA_DEVICE_API_
 #define BA_CORE_API_
 #endif
 
-- 
GitLab