cmvr-es/dependency/arm/third_party/jrl-cmakemodules/v1.1.2/share/jrl-cmakemodules/distcheck.cmake

170 lines
7.1 KiB
CMake

# Copyright (C) 2008-2014 LAAS-CNRS, JRL AIST-CNRS.
# Copyright (C) 2025 INRIA.
#
# 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 3 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 <http://www.gnu.org/licenses/>.
# .rst: .. command:: DISTCHECK_SETUP
#
# .. _target-distcheck:
#
# Add a *distcheck* target to check the generated tarball.
#
# This step calls ``make distdir`` to generate a copy of the project without the
# git history and with the ``.version`` file (as it will be when an user will
# retrieve a stable version). Then:
#
# * create ``_build`` and ``_inst`` to respectively create a build and an
# installation directory.
# * copy the ``CMakeCache.txt`` file.
# * run ``cmake`` with ``_inst`` as the installation prefix
# * run ``make``, ``make check``, ``make install`` and ``make uninstall``
# * remove ``_build`` and ``_inst``.
#
# During the compilation phase, all files in the source tree are modified to
# *not* be writeable to detect bad compilation steps which tries to modify the
# source tree. Permissions are reverted at the end of the check.
#
macro(DISTCHECK_SETUP)
if(UNIX)
find_program(SED sed)
set(
SRCDIR
${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}
)
set(BUILDDIR ${SRCDIR}/_build)
set(INSTDIR ${SRCDIR}/_inst)
set(TEST_RESULTS_DIR ${BUILDDIR}/test_results)
set(DISTCHECK_MAKEFLAGS "" CACHE PATH "MAKEFLAGS used for distcheck's make")
# The -i argument of sed command differs according on APPLE systems
if(APPLE)
set(SED_I_OPTION "-i'.old' ")
else(APPLE)
set(SED_I_OPTION "-i ")
endif(APPLE)
# Set LD_LIBRARY_PATH
if(APPLE)
set(LD_LIBRARY_PATH_VARIABLE_NAME "DYLD_LIBRARY_PATH")
else(APPLE)
set(LD_LIBRARY_PATH_VARIABLE_NAME "LD_LIBRARY_PATH")
endif(APPLE)
string(
REPLACE
"${CMAKE_SOURCE_DIR}"
"${SRCDIR}"
NEW_CMAKE_BINARY_DIR
"${CMAKE_BINARY_DIR}"
)
set(BUILD_CMD ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR} --target)
if(NOT TARGET distcheck)
add_custom_target(distcheck COMMENT "Checking generated tarball...")
endif()
# gersemi: off
add_custom_target(
${PROJECT_NAME}-distcheck
COMMAND
export LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} &&
export ${LD_LIBRARY_PATH_VARIABLE_NAME}=$ENV{${LD_LIBRARY_PATH_VARIABLE_NAME}} &&
export PYTHONPATH=$ENV{PYTHONPATH} &&
find . -type d -print0 | xargs -0 chmod a-w &&
chmod u+w . &&
rm -rf _build _inst &&
mkdir -p _build &&
mkdir -p _inst &&
chmod u+rwx _build _inst &&
chmod a-w . &&
# Link xpixi directory into new source dir to avoid issue when replacing path in CMakeCache.txt
if [ -d ${CMAKE_SOURCE_DIR}/.pixi ]; then ( ln -s ${CMAKE_SOURCE_DIR}/.pixi ${SRCDIR}/.pixi ) ; fi &&
cp ${CMAKE_BINARY_DIR}/CMakeCache.txt _build/ &&
# Change previous source dir to the source one
${SED} ${SED_I_OPTION} -e "'s|${CMAKE_SOURCE_DIR}|${SRCDIR}|g'" _build/CMakeCache.txt &&
# Change previous binary dir by the current _build one
${SED} ${SED_I_OPTION} -e "'s|${NEW_CMAKE_BINARY_DIR}|${BUILDDIR}|g'" _build/CMakeCache.txt &&
${SED} ${SED_I_OPTION}
-e "'s|CMAKE_CXX_COMPILER:FILEPATH=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS:STRING=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_DEBUG:STRING=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_MINSIZEREL:STRING=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_RELEASE:STRING=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=.\\+||g'"
-e "'s|CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_COMPILER_WORKS:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_COMPILER:FILEPATH=.\\+||g'"
-e "'s|CMAKE_C_FLAGS:STRING=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_DEBUG:STRING=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_MINSIZEREL:STRING=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_RELEASE:STRING=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=.\\+||g'"
-e "'s|CMAKE_C_COMPILER-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_FLAGS-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=.\\+||g'"
-e "'s|CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=.\\+||g'"
_build/CMakeCache.txt &&
cd _build &&
cmake -DCMAKE_INSTALL_PREFIX=${INSTDIR} -DCATKIN_TEST_RESULTS_DIR=${TEST_RESULTS_DIR} .. ||
cmake .. ||
(echo "ERROR: the cmake configuration failed." && false)
&&
${BUILD_CMD} ${DISTCHECK_MAKEFLAGS} all ||
(echo "ERROR: the compilation failed." && false)
&&
${BUILD_CMD} test ||
(echo "ERROR: the test suite failed." && false)
&&
${BUILD_CMD} install ||
(echo "ERROR: the install target failed." && false)
&&
${BUILD_CMD} uninstall ||
(echo "ERROR: the uninstall target failed." && false)
&&
test `find ${INSTDIR} -type f | wc -l` -eq 0 ||
(echo "ERROR: the uninstall target does not work." && false)
&&
${BUILD_CMD} clean || (echo "ERROR: the clean target failed." && false)
&&
cd ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION} &&
chmod -R u+w . _build _inst &&
rm -rf _build _inst &&
find . -type d -print0 | xargs -0 chmod u+w &&
echo "==============================================================" &&
echo "${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION} is ready for distribution." &&
echo "=============================================================="
WORKING_DIRECTORY
${CMAKE_BINARY_DIR}/${PROJECT_NAME}${PROJECT_SUFFIX}-${PROJECT_VERSION}
COMMENT "Checking generated tarball..."
)
# gersemi: on
add_dependencies(distcheck ${PROJECT_NAME}-distcheck)
add_dependencies(${PROJECT_NAME}-distcheck ${PROJECT_NAME}-distdir)
unset(NEW_CMAKE_BINARY_DIR)
unset(SRCDIR)
unset(BUILDIR)
else()
# FIXME: what to do here?
endif()
endmacro()