Rework install locations for better flexibility

Using the  CMake module  GNUInstallDirs to  set up  standard locations
which allows  better customisation for packagers  building for various
distributions.

The change does change some internal package file paths and will leave
some  files  in  old   locations  in  Windows  installations.  Running
uninstall  is probably  wise  on Windows  before  installing this  new
package layout if future clean uninstalls are desired.

Linux and other  *nix package maintainers can use  the CMake variables
CMAKE_INSTALL_xxx to vary the install paths of various components. See
the  CMake GNUInstallDirs  module documentation  for more  details. An
example might be for Slackware where package documents are expected to
be                            installed                           into
<install-prefix>/doc/<package-name>-<package-version>/ whereas the GNU
default         is         to        install         them         into
<install-prefix>/share/doc/<package-name>/.  To achieve  this set  the
CMake variable CMAKE_INSTALL_DOCDIR as follows when configuring:

cmake -D CMAKE_INSTALL_DOCDIR:PATH=doc/wsjtx-1.7.1 -D CMAKE_INSTALL_PREFIX= ...

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7623 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2017-03-28 13:03:48 +00:00
parent 38ab140ab6
commit 0e214efb9c
6 changed files with 87 additions and 116 deletions

View File

@ -150,43 +150,27 @@ message (STATUS "******************************************************")
#
# install locations
#
set (BIN_DESTINATION bin)
set (LIB_DESTINATION lib)
set (INCLUDE_DESTINATION include)
set (SHARE_DESTINATION share)
set (DOC_DESTINATION doc/${CMAKE_PROJECT_NAME})
set (DATA_DESTINATION ${CMAKE_PROJECT_NAME})
set (MANPAGE_DESTINATION ${SHARE_DESTINATION})
set (PLUGIN_DESTINATION lib/plugins)
set (QT_CONF_DESTINATION bin)
if (WIN32)
set (SHARE_DESTINATION bin)
set (DOC_DESTINATION doc)
set (DATA_DESTINATION data)
set (PLUGIN_DESTINATION plugins)
endif (WIN32)
if (APPLE)
set (BIN_DESTINATION ${CMAKE_PROJECT_NAME}.app/Contents/MacOS)
set (SHARE_DESTINATION ${CMAKE_PROJECT_NAME}.app/Contents/Resources)
set (MANPAGE_DESTINATION ${CMAKE_PROJECT_NAME}.app/Contents/Resources)
set (DOC_DESTINATION doc)
set (DATA_DESTINATION data)
set (PLUGIN_DESTINATION ${CMAKE_PROJECT_NAME}.app/Contents/PlugIns)
set (QT_CONF_DESTINATION ${CMAKE_PROJECT_NAME}.app/Contents/Resources)
endif (APPLE)
set (CMAKE_INSTALL_BINDIR ${CMAKE_PROJECT_NAME}.app/Contents/MacOS)
set (CMAKE_INSTALL_DATAROOTDIR ${CMAKE_PROJECT_NAME}.app/Contents/Resources)
endif ()
include (GNUInstallDirs)
set (PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins)
set (QT_CONF_DESTINATION ${CMAKE_INSTALL_BINDIR})
if (WIN32)
set (PLUGIN_DESTINATION plugins)
elseif (APPLE)
set (PLUGIN_DESTINATION ${CMAKE_INSTALL_BINDIR}/../PlugIns)
set (QT_CONF_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR})
endif ()
set (WSJT_BIN_DESTINATION ${BIN_DESTINATION} CACHE PATH "Path for executables")
set (WSJT_LIB_DESTINATION ${LIB_DESTINATION} CACHE PATH "Path for libraries")
set (WSJT_INCLUDE_DESTINATION ${INCLUDE_DESTINATION} CACHE PATH "Path for library headers")
set (WSJT_SHARE_DESTINATION ${SHARE_DESTINATION} CACHE PATH "Path for shared content")
set (WSJT_DOC_DESTINATION ${DOC_DESTINATION} CACHE PATH "Path for documentation")
set (WSJT_DATA_DESTINATION ${DATA_DESTINATION} CACHE PATH "Path for shared RO data")
set (WSJT_MANPAGE_DESTINATION ${MANPAGE_DESTINATION} CACHE PATH "Path for manpages")
set (WSJT_PLUGIN_DESTINATION ${PLUGIN_DESTINATION} CACHE PATH "Path for plugins")
set (WSJT_QT_CONF_DESTINATION ${QT_CONF_DESTINATION} CACHE PATH "Path for the qt.conf file")
#
# Project sources
#
@ -759,6 +743,7 @@ message (STATUS "hamlib_INCLUDE_DIRS: ${hamlib_INCLUDE_DIRS}")
message (STATUS "hamlib_LIBRARIES: ${hamlib_LIBRARIES}")
message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}")
#
# Qt5 setup
#
@ -899,7 +884,7 @@ set (CMAKE_SKIP_BUILD_RPATH FALSE)
# later on in the install phase
set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${WSJT_LIB_DESTINATION}")
# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
# add the automaticaly determined parts of the RPATH which point to
# directories outside of the build tree to the install RPATH
@ -907,9 +892,9 @@ set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
# the RPATH to be used when installing, but only if it's not a system
# directory
# list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${WSJT_LIB_DESTINATION}" isSystemDir)
# list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir)
# if ("${isSystemDir}" STREQUAL "-1")
# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${WSJT_LIB_DESTINATION}")
# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
# endif ("${isSystemDir}" STREQUAL "-1")
set (QT_NEED_RPATH FALSE)
@ -1186,11 +1171,11 @@ qt5_use_modules (wsjtx SerialPort) # not sure why the interface link library syn
add_library (wsjtx_udp-static STATIC ${UDP_library_CXXSRCS})
#target_include_directories (wsjtx_udp
# INTERFACE
# $<INSTALL_INTERFACE:${WSJT_INCLUDE_DESTINATION}/wsjtx>
# $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/wsjtx>
# )
target_include_directories (wsjtx_udp-static
INTERFACE
$<INSTALL_INTERFACE:${WSJT_INCLUDE_DESTINATION}/wsjtx>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/wsjtx>
)
#set_target_properties (wsjtx_udp PROPERTIES
# PUBLIC_HEADER "${UDP_library_HEADERS}"
@ -1236,48 +1221,48 @@ endif (UNIX)
# installation
#
install (TARGETS wsjtx
RUNTIME DESTINATION ${WSJT_BIN_DESTINATION} COMPONENT runtime
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION . COMPONENT runtime
)
# install (TARGETS wsjtx_udp EXPORT udp
# RUNTIME DESTINATION ${WSJT_BIN_DESTINATION}
# LIBRARY DESTINATION ${WSJT_LIB_DESTINATION}
# ARCHIVE DESTINATION ${WSJT_LIB_DESTINATION}
# PUBLIC_HEADER DESTINATION ${WSJT_INCLUDE_DESTINATION}/wsjtx
# RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
# LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
# ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
# PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wsjtx
# )
# install (TARGETS wsjtx_udp-static EXPORT udp-static
# DESTINATION ${WSJT_LIB_DESTINATION}
# DESTINATION ${CMAKE_INSTALL_LIBDIR}
# )
# install (EXPORT udp NAMESPACE wsjtx::
# DESTINATION ${WSJT_LIB_DESTINATION}/cmake/wsjtx
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx
# )
# install (EXPORT udp-static NAMESPACE wsjtx::
# DESTINATION ${WSJT_LIB_DESTINATION}/cmake/wsjtx
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx
# )
install (TARGETS udp_daemon message_aggregator
RUNTIME DESTINATION ${WSJT_BIN_DESTINATION} COMPONENT runtime
BUNDLE DESTINATION ${WSJT_BIN_DESTINATION} COMPONENT runtime
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
)
install (TARGETS jt9 jt65code qra64code qra64sim jt9code jt4code
msk144code wsprd fmtave fcal fmeasure
RUNTIME DESTINATION ${WSJT_BIN_DESTINATION} COMPONENT runtime
BUNDLE DESTINATION ${WSJT_BIN_DESTINATION} COMPONENT runtime
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
)
install (PROGRAMS
${RIGCTL_EXE}
DESTINATION ${WSJT_BIN_DESTINATION}
DESTINATION ${CMAKE_INSTALL_BINDIR}
#COMPONENT runtime
RENAME rigctl-wsjtx${CMAKE_EXECUTABLE_SUFFIX}
)
install (PROGRAMS
${RIGCTLD_EXE}
DESTINATION ${WSJT_BIN_DESTINATION}
DESTINATION ${CMAKE_INSTALL_BINDIR}
#COMPONENT runtime
RENAME rigctld-wsjtx${CMAKE_EXECUTABLE_SUFFIX}
)
@ -1290,13 +1275,13 @@ install (FILES
NEWS
INSTALL
BUGS
DESTINATION ${WSJT_SHARE_DESTINATION}/${WSJT_DOC_DESTINATION}
DESTINATION ${CMAKE_INSTALL_DOCDIR}
#COMPONENT runtime
)
install (FILES
contrib/Ephemeris/JPLEPH
DESTINATION ${WSJT_SHARE_DESTINATION}/${WSJT_DATA_DESTINATION}
DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}
#COMPONENT runtime
)
@ -1395,7 +1380,7 @@ if (NOT is_debug_build)
)
# if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation
set (fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_BIN_DESTINATION}/${CMAKE_PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
set (fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${CMAKE_PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
#get_filename_component (hamlib_lib_dir ${hamlib_LIBRARIES} PATH)

View File

@ -731,14 +731,48 @@ void Configuration::sync_transceiver (bool force_signal, bool enforce_mode_and_s
}
}
namespace
{
#if defined (Q_OS_MAC)
char const * app_root = "/../../../";
#else
char const * app_root = "/../";
#endif
QString doc_path ()
{
#if CMAKE_BUILD
if (QDir::isRelativePath (CMAKE_INSTALL_DOCDIR))
{
return QApplication::applicationDirPath () + app_root + CMAKE_INSTALL_DOCDIR;
}
return CMAKE_INSTALL_DOCDIR;
#else
return QApplication::applicationDirPath ();
#endif
}
QString data_path ()
{
#if CMAKE_BUILD
if (QDir::isRelativePath (CMAKE_INSTALL_DATADIR))
{
return QApplication::applicationDirPath () + app_root + CMAKE_INSTALL_DATADIR + QChar {'/'} + CMAKE_PROJECT_NAME;
}
return CMAKE_INSTALL_DATADIR;
#else
return QApplication::applicationDirPath ();
#endif
}
}
Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
QSettings * settings, QWidget * parent)
: QDialog {parent}
, self_ {self}
, ui_ {new Ui::configuration_dialog}
, settings_ {settings}
, doc_dir_ {QApplication::applicationDirPath ()}
, data_dir_ {QApplication::applicationDirPath ()}
, doc_dir_ {doc_path ()}
, data_dir_ {data_path ()}
, temp_dir_ {temp_directory}
, frequencies_ {&bands_}
, next_frequencies_ {&bands_}
@ -763,63 +797,20 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
ui_->setupUi (this);
// ui_->groupBox_6->setVisible(false); //### Temporary ??? ###
#if !defined (CMAKE_BUILD)
#define WSJT_SHARE_DESTINATION "."
#define WSJT_DOC_DESTINATION "."
#define WSJT_DATA_DESTINATION "."
#endif
#if !defined (Q_OS_WIN) || QT_VERSION >= 0x050300
auto doc_path = QStandardPaths::locate (QStandardPaths::DataLocation, WSJT_DOC_DESTINATION, QStandardPaths::LocateDirectory);
if (doc_path.isEmpty ())
{
doc_dir_.cdUp ();
#if defined (Q_OS_MAC)
doc_dir_.cdUp ();
doc_dir_.cdUp ();
#endif
doc_dir_.cd (WSJT_SHARE_DESTINATION);
doc_dir_.cd (WSJT_DOC_DESTINATION);
}
else
{
doc_dir_.cd (doc_path);
}
auto data_path = QStandardPaths::locate (QStandardPaths::DataLocation, WSJT_DATA_DESTINATION, QStandardPaths::LocateDirectory);
if (data_path.isEmpty ())
{
data_dir_.cdUp ();
#if defined (Q_OS_MAC)
data_dir_.cdUp ();
data_dir_.cdUp ();
#endif
data_dir_.cd (WSJT_SHARE_DESTINATION);
data_dir_.cd (WSJT_DATA_DESTINATION);
}
else
{
data_dir_.cd (data_path);
}
#else
doc_dir_.cd (WSJT_DOC_DESTINATION);
data_dir_.cd (WSJT_DATA_DESTINATION);
#endif
{
// Find a suitable data file location
QDir data_dir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)};
if (!data_dir.mkpath ("."))
QDir writeable_data_dir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)};
if (!writeable_data_dir.mkpath ("."))
{
MessageBox::critical_message (this, tr ("Failed to create data directory"),
tr ("path: \"%1\"").arg (data_dir.absolutePath ()));
tr ("path: \"%1\"").arg (writeable_data_dir.absolutePath ()));
throw std::runtime_error {"Failed to create data directory"};
}
// Make sure the default save directory exists
QString save_dir {"save"};
default_save_directory_ = data_dir;
default_azel_directory_ = data_dir;
default_save_directory_ = writeable_data_dir;
default_azel_directory_ = writeable_data_dir;
if (!default_save_directory_.mkpath (save_dir) || !default_save_directory_.cd (save_dir))
{
MessageBox::critical_message (this, tr ("Failed to create save directory"),

View File

@ -34,6 +34,6 @@ configure_file (
install (FILES
${CMAKE_CURRENT_BINARY_DIR}/${deb_changelog}.gz
${CMAKE_CURRENT_BINARY_DIR}/copyright
DESTINATION ${WSJT_SHARE_DESTINATION}/${WSJT_DOC_DESTINATION}
DESTINATION ${CMAKE_INSTALL_DOCDIR}
#COMPONENT Debian
)

View File

@ -223,7 +223,7 @@ foreach (_html ${htmls})
string (REGEX REPLACE "_en$" "" _nwe ${_nwe})
install (FILES
${_html}
DESTINATION ${WSJT_SHARE_DESTINATION}/${WSJT_DOC_DESTINATION}
DESTINATION ${CMAKE_INSTALL_DOCDIR}
RENAME ${_nwe}-${wsjtx_VERSION}${_ext}
#COMPONENT runtime
)

View File

@ -75,8 +75,8 @@ if (A2X_EXECUTABLE AND GZIP_EXECUTABLE AND SED_EXECUTABLE)
endforeach ()
install (
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man
DESTINATION ${WSJT_MANPAGE_DESTINATION}
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man/
DESTINATION ${CMAKE_INSTALL_MANDIR}
PATTERN "*.orig" EXCLUDE
#COMPONENT Runtime
)

View File

@ -5,15 +5,10 @@
#define WSJTX_VERSION_MINOR @WSJTX_VERSION_MINOR@
#define WSJTX_VERSION_PATCH @WSJTX_VERSION_PATCH@
#define CONFIG_TEST_VERSION_MAJOR @CONFIG_TEST_VERSION_MAJOR@
#define CONFIG_TEST_VERSION_MINOR @CONFIG_TEST_VERSION_MINOR@
#define CONFIG_TEST_VERSION_PATCH @CONFIG_TEST_VERSION_PATCH@
#cmakedefine WSJT_BIN_DESTINATION "@WSJT_BIN_DESTINATION@"
#cmakedefine WSJT_SHARE_DESTINATION "@WSJT_SHARE_DESTINATION@"
#cmakedefine WSJT_LIB_DESTINATION "@WSJT_LIB_DESTINATION@"
#cmakedefine WSJT_DOC_DESTINATION "@WSJT_DOC_DESTINATION@"
#cmakedefine WSJT_DATA_DESTINATION "@WSJT_DATA_DESTINATION@"
#cmakedefine CMAKE_INSTALL_DATAROOTDIR "@CMAKE_INSTALL_DATAROOTDIR@"
#cmakedefine CMAKE_INSTALL_DOCDIR "@CMAKE_INSTALL_DOCDIR@"
#cmakedefine CMAKE_INSTALL_DATADIR "@CMAKE_INSTALL_DATADIR@"
#cmakedefine CMAKE_PROJECT_NAME "@CMAKE_PROJECT_NAME@"
#cmakedefine PROJECT_MANUAL "@PROJECT_MANUAL@"
#cmakedefine PROJECT_HOMEPAGE "@PROJECT_HOMEPAGE@"
#cmakedefine PROJECT_MANUAL_DIRECTORY_URL "@PROJECT_MANUAL_DIRECTORY_URL@"