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})