diff --git a/CMakeLists.txt b/CMakeLists.txt
index c73626929..f93a73b79 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -185,6 +185,8 @@ SD_SETUP_SETTINGS_VERSION()
# Setup empty GLOBAL lists for robots and modules
SET_PROPERTY(GLOBAL PROPERTY SD_MODULE_LIST "")
+SET_PROPERTY(GLOBAL PROPERTY SD_CAR_LIST "")
+SET_PROPERTY(GLOBAL PROPERTY SD_TRACK_LIST "")
SET_PROPERTY(GLOBAL PROPERTY SD_ROBOT_LIST "")
SET_PROPERTY(GLOBAL PROPERTY SD_OSG_PLUGIN_LIST "")
SET_PROPERTY(GLOBAL PROPERTY SD_EXE_LIST "")
@@ -229,6 +231,10 @@ ELSE(MSVC)
ENDIF(MSVC)
ADD_CUSTOM_TARGET(${_UNINST_TGT_NAME} "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake" )
+IF(OPTION_CHECK_CONTENTS)
+ INCLUDE(cmake/prerelease.cmake)
+ENDIF(OPTION_CHECK_CONTENTS)
+
IF(OPTION_PACKAGING)
INCLUDE(cmake/packagemaker.cmake)
IF(MSVC)
diff --git a/cmake/install.cmake b/cmake/install.cmake
index bbb3a2149..48cd28cc4 100644
--- a/cmake/install.cmake
+++ b/cmake/install.cmake
@@ -504,6 +504,7 @@ MACRO(SD_INSTALL_CAR CARNAME)
${RGB_FILES} ${PNG_FILES} ${DDS_FILES} ${JPG_FILES} ${WAV_FILES})
SD_INSTALL_FILES(DATA cars/models/${CARNAME} FILES ${SDIC_FILES})
+ SET_PROPERTY(GLOBAL APPEND PROPERTY SD_CAR_LIST "${CARNAME}")
ENDMACRO(SD_INSTALL_CAR CARNAME)
@@ -535,5 +536,6 @@ MACRO(SD_INSTALL_TRACK TRACKNAME CATEGORY)
${RGB_FILES} ${PNG_FILES} ${JPG_FILES} ${DDS_FILES})
SD_INSTALL_FILES(DATA tracks/${CATEGORY}/${TRACKNAME} FILES ${SDIT_FILES})
+ SET_PROPERTY(GLOBAL APPEND PROPERTY SD_TRACK_LIST "${CATEGORY}/${TRACKNAME}")
ENDMACRO(SD_INSTALL_TRACK TRACKNAME CATEGORY)
diff --git a/cmake/macros.cmake b/cmake/macros.cmake
index e86d147cc..4d22e5d26 100644
--- a/cmake/macros.cmake
+++ b/cmake/macros.cmake
@@ -254,7 +254,7 @@ MACRO(SD_ADD_LIBRARY TARGET_NAME TARGET_TYPE)
ELSEIF(${TARGET_TYPE} STREQUAL "ROBOT")
SET(_TGT_DIR "${CMAKE_BINARY_DIR}/${SD_LIBDIR}/drivers/${TARGET_NAME}")
- SET_PROPERTY(GLOBAL APPEND PROPERTY SD_ROBOT_LIST "${SD_LIBDIR}/drivers/${TARGET_NAME}/${TARGET_NAME}${CMAKE_SHARED_MODULE_SUFFIX}")
+ SET_PROPERTY(GLOBAL APPEND PROPERTY SD_ROBOT_LIST "${TARGET_NAME}")
ELSEIF(NOT ${TARGET_TYPE} STREQUAL "STATIC")
diff --git a/cmake/options.cmake b/cmake/options.cmake
index a2332dfd7..b7a0c5264 100644
--- a/cmake/options.cmake
+++ b/cmake/options.cmake
@@ -59,7 +59,7 @@ MACRO(ADD_SD_COMPILE_OPTIONS)
ENDIF(NOT MSVC)
# CMake options.
- SET(OPTION_CHECK_CONTENTS false CACHE BOOL "Set to On if you don't want the build to be stopped by missing optional contents folders")
+ SET(OPTION_CHECK_CONTENTS false CACHE BOOL "Set to off if you don't want the build to be stopped by missing optional contents folders")
MARK_AS_ADVANCED(OPTION_CHECK_CONTENTS)
SET(OPTION_OFFICIAL_ONLY false CACHE BOOL "Build / install only officially released contents")
diff --git a/cmake/prerelease.cmake b/cmake/prerelease.cmake
new file mode 100644
index 000000000..a6faa85eb
--- /dev/null
+++ b/cmake/prerelease.cmake
@@ -0,0 +1,71 @@
+#==============================================================================
+#
+# file : prerelease.cmake
+# copyright : (C) 2021 Joe Thompson
+# email : beaglejoe@users.sourceforge.net
+# web : www.speed-dreams.org
+# version : $Id:$
+#
+#==============================================================================
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+#==============================================================================
+INCLUDE(cmake/prereleaseutils.cmake)
+
+GET_PROPERTY(SD_TRACK_LIST_ITEMS GLOBAL PROPERTY SD_TRACK_LIST)
+GET_PROPERTY(SD_CAR_LIST_ITEMS GLOBAL PROPERTY SD_CAR_LIST)
+GET_PROPERTY(SD_ROBOT_LIST_ITEMS GLOBAL PROPERTY SD_ROBOT_LIST)
+
+string(REGEX REPLACE ";" "\n" _tracks_contents "${SD_TRACK_LIST_ITEMS}")
+string(REGEX REPLACE ";" "\n" _cars_contents "${SD_CAR_LIST_ITEMS}")
+string(REGEX REPLACE ";" "\n" _robots_contents "${SD_ROBOT_LIST_ITEMS}")
+
+
+message("\n")
+message("======= Pre-Release checks =======")
+#message("\n")
+
+if(OPTION_OFFICIAL_ONLY)
+ set(PRE "official")
+else()
+ set(PRE "unofficial")
+ message("OPTION_OFFICIAL_ONLY NOT set")
+endif()
+
+IF(VERSION_IS_TAG)
+ message(STATUS "VERSION_IS_TAG = ${VERSION_IS_TAG}")
+else()
+ message("working copy is NOT from a tag")
+endif()
+
+
+message(STATUS "SVN_REV = ${SVN_REV}")
+message(STATUS "VERSION = ${VERSION}")
+#message(STATUS "NSIS_MAKE_EXE = ${NSIS_MAKE_EXE}")
+
+
+FILE(WRITE "${PROJECT_BINARY_DIR}/${PRE}-tracklist.txt" ${_tracks_contents})
+FILE(WRITE "${PROJECT_BINARY_DIR}/${PRE}-carlist.txt" ${_cars_contents})
+FILE(WRITE "${PROJECT_BINARY_DIR}/${PRE}-robotlist.txt" ${_robots_contents})
+
+message("==== Checking cars ====")
+check_cars("${SD_CAR_LIST_ITEMS}")
+
+message("==== Checking tracks ====")
+check_tracks("${SD_TRACK_LIST_ITEMS}")
+
+message("==== Checking robots ====")
+check_robots("${SD_ROBOT_LIST_ITEMS}")
+
diff --git a/cmake/prereleaseutils.cmake b/cmake/prereleaseutils.cmake
new file mode 100644
index 000000000..554ebe3a1
--- /dev/null
+++ b/cmake/prereleaseutils.cmake
@@ -0,0 +1,361 @@
+
+#==============================================================================
+#
+# file : prereleaseutils.cmake
+# copyright : (C) 2021 Joe Thompson
+# email : beaglejoe@users.sourceforge.net
+# web : www.speed-dreams.org
+# version : $Id:$
+#
+#==============================================================================
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# ================================================
+function(check_cars carlist)
+
+ #file(STRINGS carlist.txt _installed_cars)
+ set(_installed_cars ${carlist})
+ list(TRANSFORM _installed_cars STRIP)
+
+ cars_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-base.lst" base_car_lst)
+ cars_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-hq-cars-and-tracks.lst" hq_car_lst)
+ cars_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-more-hq-cars-and-tracks.lst" more_hq_car_lst)
+ cars_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-wip-cars-and-tracks.lst" wip_car_lst)
+ cars_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-unmaintained.lst" unmaintained_car_lst)
+
+ set(_packaged_cars )
+ list(APPEND _packaged_cars ${base_car_lst} ${hq_car_lst} ${more_hq_car_lst} ${wip_car_lst} ${unmaintained_car_lst})
+
+ # Verify that a car is only in one package
+
+ #message(STATUS "Checking for duplicate entries...")
+
+ list_get_duplicates(_packaged_cars _ret_duplicates)
+ list(LENGTH _ret_duplicates _length)
+ if(_length)
+ message("Duplicate car(s) in .lst file(s)")
+ dump_list("${_ret_duplicates}")
+ else()
+ message(STATUS "No duplicate car(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that all installed cars are in a package
+ #message(STATUS "Checking for installed cars that are NOT packaged...")
+
+ compare_lists(_installed_cars _packaged_cars _ret_installed _ret_packaged)
+ list(LENGTH _ret_installed _length)
+ if(_length)
+ message("${_length} Installed car(s) missing from .lst file(s)")
+ dump_list("${_ret_installed}")
+ else()
+ message(STATUS "No installed car(s) missing from .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that packages contain no uninstalled cars
+ #message(STATUS "Checking packing lists for cars that are NOT installed...")
+
+ list(LENGTH _ret_packaged _length)
+ if(_length)
+ message(".lst file(s) have car(s) that are NOT installed")
+ dump_list("${_ret_packaged}")
+ else()
+ message(STATUS "No missing car(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+endfunction()
+# ================================================
+function(check_tracks tracklist)
+
+ set(_installed ${tracklist})
+ list(TRANSFORM _installed STRIP)
+
+ tracks_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-base.lst" base_track_lst)
+ tracks_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-hq-cars-and-tracks.lst" hq_track_lst)
+ tracks_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-more-hq-cars-and-tracks.lst" more_hq_track_lst)
+ tracks_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-wip-cars-and-tracks.lst" wip_track_lst)
+ tracks_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-unmaintained.lst" unmaintained_track_lst)
+
+ #dump_list("${base_track_lst}")
+ #dump_list("${_installed}")
+
+ set(_packaged )
+ list(APPEND _packaged ${base_track_lst} ${hq_track_lst} ${more_hq_track_lst} ${wip_track_lst} ${unmaintained_track_lst})
+
+ # Verify that a track is only in one package
+
+ #message(STATUS "Checking for duplicate entries...")
+
+ list_get_duplicates(_packaged _ret_duplicates)
+ list(LENGTH _ret_duplicates _length)
+ if(_length)
+ message("Duplicate track(s) in .lst file(s)")
+ dump_list("${_ret_duplicates}")
+ else()
+ message(STATUS "No duplicate track(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that all installed tracks are in a package
+ #message(STATUS "Checking for installed tracks that are NOT packaged...")
+
+ compare_lists(_installed _packaged _ret_installed _ret_packaged)
+ list(LENGTH _ret_installed _length)
+ if(_length)
+ message( "${_length} Installed track(s) missing from .lst file(s)")
+ dump_list("${_ret_installed}")
+ else()
+ message(STATUS "No installed track(s) missing from .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that packages contain no uninstalled tracks
+ #message(STATUS "Checking packing lists for tracks that are NOT installed...")
+
+ list(LENGTH _ret_packaged _length)
+ if(_length)
+ message(".lst file(s) have track(s) that are NOT installed")
+ dump_list("${_ret_packaged}")
+ else()
+ message(STATUS "No missing track(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+
+endfunction()
+# ================================================
+function(check_robots robotlist)
+
+ set(_installed ${robotlist})
+ list(TRANSFORM _installed STRIP)
+
+ robots_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-base.lst" base_lst)
+ robots_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-hq-cars-and-tracks.lst" hq_lst)
+ robots_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-more-hq-cars-and-tracks.lst" more_hq_lst)
+ robots_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-wip-cars-and-tracks.lst" wip_lst)
+ robots_from_lst_file("${CMAKE_SOURCE_DIR}/packaging/sources/sd-src-unmaintained.lst" unmaintained_lst)
+
+ #dump_list("${base_lst}")
+ #dump_list("${_installed}")
+
+ set(_packaged )
+ list(APPEND _packaged ${base_lst} ${hq_lst} ${more_hq_lst} ${wip_lst} ${unmaintained_lst})
+
+ # Verify that a robot is only in one package
+
+ #message(STATUS "Checking for duplicate entries...")
+
+ list_get_duplicates(_packaged _ret_duplicates)
+ list(LENGTH _ret_duplicates _length)
+ if(_length)
+ message("Duplicate robot(s) in .lst file(s)")
+ dump_list("${_ret_duplicates}")
+ else()
+ message(STATUS "No duplicate robot(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that all installed robots are in a package
+ #message(STATUS "Checking for installed robots that are NOT packaged...")
+
+ compare_lists(_installed _packaged _ret_installed _ret_packaged)
+ list(LENGTH _ret_installed _length)
+ if(_length)
+ message("${_length} Installed robot(s) missing from .lst file(s)")
+ dump_list("${_ret_installed}")
+ else()
+ message(STATUS "No installed robot(s) missing from .lst file(s)")
+ endif()
+ #message("\n")
+
+ # Verify that packages contain no uninstalled robots
+ #message(STATUS "Checking packing lists for robots that are NOT installed...")
+
+ list(LENGTH _ret_packaged _length)
+ if(_length)
+ message(".lst file(s) have robot(s) that are NOT installed")
+ dump_list("${_ret_packaged}")
+ else()
+ message(STATUS "No missing robot(s) in .lst file(s)")
+ endif()
+ #message("\n")
+
+
+endfunction()
+# ================================================
+function(cars_from_lst_file lst_file outlist)
+ file(STRINGS ${lst_file} _file_content)
+ foreach(_line ${_file_content})
+ #message(STATUS "${_line}")
+ string(STRIP "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(TOLOWER "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(FIND "${_line}" "data/cars/models/" _index)
+ if(NOT ${_index} EQUAL -1)
+ string(REPLACE "data/cars/models/" "" _car "${_line}")
+ list(APPEND _car_list "${_car}")
+ #message(STATUS "${_car}")
+ endif()
+ #message(STATUS "${_line}")
+ endforeach()
+ list(REMOVE_ITEM _car_list "cmakelists.txt")
+
+ set(${outlist} ${_car_list} PARENT_SCOPE)
+ #foreach(_car ${_car_list})
+ # message(STATUS "${_car}")
+ #endforeach()
+
+endfunction()
+# ================================================
+function(tracks_from_lst_file lst_file outlist)
+ file(STRINGS ${lst_file} _file_content)
+ foreach(_line ${_file_content})
+ #message(STATUS "${_line}")
+ string(STRIP "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(TOLOWER "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(FIND "${_line}" "data/tracks/" _index)
+ if(NOT ${_index} EQUAL -1)
+ string(REPLACE "data/tracks/" "" _track "${_line}")
+ string(FIND "${_line}" "cmakelists.txt" _index)
+ if(${_index} EQUAL -1)
+ list(APPEND _track_list "${_track}")
+ #message(STATUS "${_track}")
+ endif()
+ endif()
+ #message(STATUS "${_line}")
+ endforeach()
+ list(REMOVE_ITEM _track_list "cmakelists.txt")
+
+ set(${outlist} ${_track_list} PARENT_SCOPE)
+ #foreach(_track ${_track_list})
+ # message(STATUS "${_track}")
+ #endforeach()
+
+endfunction()
+# ================================================
+function(robots_from_lst_file lst_file outlist)
+ file(STRINGS ${lst_file} _file_content)
+ foreach(_line ${_file_content})
+ #message(STATUS "${_line}")
+ string(STRIP "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(TOLOWER "${_line}" _line)
+ #message(STATUS "${_line}")
+ string(FIND "${_line}" "src/drivers/" _index)
+ if(NOT ${_index} EQUAL -1)
+ string(REPLACE "src/drivers/" "" _robot "${_line}")
+ string(FIND "${_robot}" "/" _index)
+ if(${_index} EQUAL -1)
+ list(APPEND _robot_list "${_robot}")
+ #message(STATUS "\t${_robot}")
+ endif()
+ string(FIND "${_robot}" "/src" _index)
+ if(NOT ${_index} EQUAL -1)
+ # TODO These need to go to Customizable robots binaries (Section /o "Basic mod Tools" SEC02)
+ string(REPLACE "/src" "" _robot "${_robot}")
+ list(APPEND _robot_list "${_robot}")
+ #message(STATUS "\t\t${_robot}")
+ endif()
+ endif()
+
+ string(FIND "${_line}" "data/drivers/" _index)
+ if(NOT ${_index} EQUAL -1)
+ string(REPLACE "data/drivers/" "" _robot "${_line}")
+ string(FIND "${_line}" "cmakelists.txt" _index)
+ if(${_index} EQUAL -1)
+ list(APPEND _robot_list "${_robot}")
+ #message(STATUS "\t\t\t${_robot}")
+ endif()
+ endif()
+ #message(STATUS "${_line}")
+ endforeach()
+ list(REMOVE_ITEM _robot_list "cmakelists.txt")
+#[[
+ foreach(_robot ${_robot_list})
+ message(STATUS "${_robot}")
+ endforeach()
+ message("\n")
+]]
+ list(REMOVE_DUPLICATES _robot_list)
+ #message("\n")
+ set(${outlist} ${_robot_list} PARENT_SCOPE)
+#[[
+ foreach(_robot ${_robot_list})
+ message(STATUS "${_robot}")
+ endforeach()
+ message("\n")
+]]
+
+endfunction()
+# ================================================
+function(list_get_duplicates list_in ret_list_duplicates)
+ set(_duplicates )
+ list(TRANSFORM ${list_in} TOLOWER OUTPUT_VARIABLE _lc_list)
+ list(SORT _lc_list)
+
+ set(_prev_item "???")
+ foreach(_item ${_lc_list})
+ string(COMPARE EQUAL ${_item} ${_prev_item} _result)
+ if(_result)
+ list(APPEND _duplicates "${_item}")
+ endif()
+ set(_prev_item ${_item})
+ endforeach()
+
+set(${ret_list_duplicates} ${_duplicates} PARENT_SCOPE)
+
+endfunction()
+# ================================================
+# compares 2 lists and returns Lists with ONLY the
+# the unique items from each list
+#
+# example:
+# compare_lists(list_installed_cars list_packaged_cars _ret_installed _ret_packaged)
+#
+# ${_ret_installed} will contain the cars that were in ${list_installed_cars}
+# AND NOT in ${list_packaged_cars}
+# ${_ret_packaged} will contain the cars that were in ${list_packaged_cars}
+# AND NOT in ${list_installed_cars}
+#
+# If both ${_ret_installed} and ${_ret_packaged} are empty
+# the list were identical
+# ================================================
+function(compare_lists list_a list_b ret_list_a ret_list_b)
+
+ list(TRANSFORM ${list_a} TOLOWER OUTPUT_VARIABLE _lc_a)
+ list(TRANSFORM ${list_a} TOLOWER OUTPUT_VARIABLE _lc_a_2)
+ list(TRANSFORM ${list_b} TOLOWER OUTPUT_VARIABLE _lc_b)
+
+ list(REMOVE_ITEM _lc_a ${_lc_b})
+ list(REMOVE_ITEM _lc_b ${_lc_a_2})
+
+ #dump_list("${_lc_a}")
+ #dump_list("${_lc_b}")
+
+ set(${ret_list_a} ${_lc_a} PARENT_SCOPE)
+ set(${ret_list_b} ${_lc_b} PARENT_SCOPE)
+
+endfunction()
+# ================================================
+function(dump_list _list)
+ foreach(_item ${_list})
+ message("${_item}")
+ endforeach()
+endfunction()
\ No newline at end of file
diff --git a/cmake/robot.cmake b/cmake/robot.cmake
index 78ac81e3a..1e6b270c3 100644
--- a/cmake/robot.cmake
+++ b/cmake/robot.cmake
@@ -185,7 +185,7 @@ MACRO(ROBOT_MODULE)
SET(CLONE_MODDIR "${CMAKE_BINARY_DIR}/${SD_LIBDIR}/drivers/${CLONENAME}")
SET(CLONE_MODLOC "${CLONE_MODDIR}/${CLONENAME}${CMAKE_SHARED_MODULE_SUFFIX}")
- SET_PROPERTY(GLOBAL APPEND PROPERTY SD_ROBOT_LIST "${SD_LIBDIR}/drivers/${CLONENAME}/${CLONENAME}${CMAKE_SHARED_MODULE_SUFFIX}")
+ SET_PROPERTY(GLOBAL APPEND PROPERTY SD_ROBOT_LIST "${CLONENAME}")
IF(FALSE) #IF(UNIX)
# Might not work with GCC 4.5 or + (see above)
ADD_CUSTOM_COMMAND(TARGET ${RBM_NAME} POST_BUILD
diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt
index c0fcc83ff..7230d7e8e 100644
--- a/packaging/CMakeLists.txt
+++ b/packaging/CMakeLists.txt
@@ -65,7 +65,7 @@ IF((APPLE) AND ("${CMAKE_INSTALL_PREFIX}" MATCHES "\\.app$"))
endforeach()
foreach(_ROBOT ${SD_ROBOT_LIST_ITEMS})
- LIST(APPEND _loadables "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}/${_ROBOT}")
+ LIST(APPEND _loadables "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}/${SD_LIBDIR}/drivers/${_ROBOT}/${_ROBOT}${CMAKE_SHARED_MODULE_SUFFIX}")
endforeach()
foreach(_PLUGIN ${SD_OSG_PLUGIN_LIST_ITEMS})