It verifies that the distribution tarball is created with all local changes, which requires them to be committed. If there are uncommitted changes, then it prints a warning on the console.
89 lines
3.4 KiB
CMake
89 lines
3.4 KiB
CMake
# DistTarget.cmake
|
|
#
|
|
# Defines custom targets related to distributing source code.
|
|
# It requires to have populated 'PROJECT_NAME' and 'PROJECT_VERSION' variables,
|
|
# possibly through the project() command. It also uses 'PROJECT_DISTCONFIGURE_PARAMS'
|
|
# variable when configuring the unpacked distribution.
|
|
#
|
|
# Added targets:
|
|
# dist - only creates a tarball
|
|
# disttest - creates a tarball and 'make && make install' it to a temporary prefix
|
|
# to verify that the code can be built and installed; it also verifies
|
|
# that the first line of the NEWS file contains the same version as
|
|
# the tarball and that it claims today's date.
|
|
# distcheck - similar to 'disttest', only runs also 'make check' before installing
|
|
|
|
# Filenames for tarball
|
|
set(ARCHIVE_BASE_NAME ${PROJECT_NAME}-${PROJECT_VERSION})
|
|
set(ARCHIVE_FULL_NAME ${ARCHIVE_BASE_NAME}.tar.xz)
|
|
|
|
add_custom_target(dist
|
|
COMMAND ${CMAKE_COMMAND} -E chdir . "${CMAKE_SOURCE_DIR}/cmake/verify-pre-dist.sh"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Creating '${ARCHIVE_FULL_NAME}'..."
|
|
COMMAND git archive --prefix=${ARCHIVE_BASE_NAME}/ HEAD | xz -z > ${CMAKE_BINARY_DIR}/${ARCHIVE_FULL_NAME}
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Distribution tarball '${ARCHIVE_FULL_NAME}' created at ${CMAKE_BINARY_DIR}"
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
)
|
|
|
|
set(disttest_extract_dir "${CMAKE_BINARY_DIR}/${ARCHIVE_BASE_NAME}")
|
|
set(disttest_build_dir "${disttest_extract_dir}/_build")
|
|
set(disttest_install_dir "${disttest_extract_dir}/_install")
|
|
|
|
add_custom_command(OUTPUT ${disttest_build_dir}/Makefile
|
|
# remove any left-over directory
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${disttest_extract_dir}
|
|
|
|
# extract the tarball
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} tar -xf ${ARCHIVE_FULL_NAME}
|
|
|
|
# verify the NEWS file contains what it should contain
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}
|
|
bash ${CMAKE_SOURCE_DIR}/cmake/verify-news-file.sh "${disttest_extract_dir}/NEWS" "${PROJECT_VERSION}"
|
|
|
|
# create a _build sub-directory
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${disttest_build_dir}"
|
|
|
|
# configure the project with PROJECT_DISTCHECK_PARAMS
|
|
COMMAND ${CMAKE_COMMAND} -E chdir "${disttest_build_dir}"
|
|
${CMAKE_COMMAND} -G "Unix Makefiles"
|
|
${PROJECT_DISTCONFIGURE_PARAMS}
|
|
-DCMAKE_BUILD_TYPE=Release
|
|
-DCMAKE_INSTALL_PREFIX="${disttest_install_dir}"
|
|
..
|
|
|
|
# 'make' the project
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${disttest_build_dir} make -j
|
|
|
|
DEPENDS dist
|
|
COMMENT "Building from distribution tarball ${ARCHIVE_FULL_NAME}..."
|
|
)
|
|
|
|
add_custom_target(distcheck
|
|
# 'make check' the project
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${disttest_build_dir} make -j check
|
|
|
|
# 'make install' the project
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${disttest_build_dir} make -j install
|
|
|
|
# if we get this far, then everything worked, thus clean up
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${disttest_extract_dir}
|
|
|
|
# and show the good news
|
|
COMMAND ${CMAKE_COMMAND} -E echo "distcheck of '${ARCHIVE_FULL_NAME}' succeeded"
|
|
|
|
DEPENDS ${disttest_build_dir}/Makefile
|
|
)
|
|
|
|
add_custom_target(disttest
|
|
# 'make install' the project
|
|
COMMAND ${CMAKE_COMMAND} -E chdir ${disttest_build_dir} make -j install
|
|
|
|
# if we get this far, then everything worked, thus clean up
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${disttest_extract_dir}
|
|
|
|
# and show the good news
|
|
COMMAND ${CMAKE_COMMAND} -E echo "disttest of '${ARCHIVE_FULL_NAME}' succeeded"
|
|
|
|
DEPENDS ${disttest_build_dir}/Makefile
|
|
)
|