From 97bc017ad9276e539bc783671bc3c86429d95905 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 14 Aug 2013 11:31:49 +0000 Subject: [PATCH] Initial commit of a CMake script to build wsjtx. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@3548 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- CMakeLists.txt | 179 +++++++++++++++++++++++++++++++++++++++++++ getsvn.cmake | 16 ++++ lib/CMakeLists.txt | 186 +++++++++++++++++++++++++++++++++++++++++++++ wsjtx_config.h.in | 4 + 4 files changed, 385 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 getsvn.cmake create mode 100644 lib/CMakeLists.txt create mode 100644 wsjtx_config.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..7bb7bd59d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,179 @@ +cmake_minimum_required (VERSION 2.8.9) + +project (wsjtx C CXX Fortran) + +set (wsjtx_VERSION_MAJOR 1) +set (wsjtx_VERSION_MINOR 2) + +if (POLICY CMP0020) + cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows +endif (POLICY CMP0020) + +# make sure that the default is a RELEASE +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are: None Debug Release." + FORCE) +endif (NOT CMAKE_BUILD_TYPE) + + +# +# C++ setup +# + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + + +set (CXXSRCS + logbook/adif.cpp + logbook/countrydat.cpp + logbook/countriesworked.cpp + logbook/logbook.cpp + rigclass.cpp + psk_reporter.cpp + Modulator.cpp + Detector.cpp + logqso.cpp + displaytext.cpp + getfile.cpp + soundout.cpp + soundin.cpp + meterwidget.cpp + signalmeter.cpp + plotter.cpp + widegraph.cpp + devsetup.cpp + about.cpp + mainwindow.cpp + main.cpp + ) + +if (WIN32) + set (CXXSRCS ${CXXSRCS} killbyname.cpp) +endif (WIN32) + +set_property (SOURCE ${CXXSRCS} APPEND PROPERTY COMPILE_FLAGS "-include wsjtx_config.h") + +set (UISRCS + mainwindow.ui + about.ui + devsetup.ui + widegraph.ui + logqso.ui +) + +# +# sort out pre-requisites +# + +# +# libfftw3 setup +# +find_path (fftw3f_INCLUDES fftw3.f) +find_library (fftw3f NAMES fftw3f fftw3f-3) +include_directories (${fftw3f_INCLUDES}) + +# +# libhamlib setup +# +find_path (hamlib_INCLUDES hamlib/rig.h) +find_library (hamlib NAMES hamlib hamlib-2) +find_library (usb NAMES usb0) +find_file (hamlib-runtime libhamlib-2.dll) +find_path (hamlib-runtime-path libhamlib-2.dll) +file (GLOB hamlib-backends ${hamlib-runtime-path}/hamlib*.dll) +include_directories (${hamlib_INCLUDES}) + + +# +# Qt5 setup +# + +# Widgets finds its own dependencies. +find_package (Qt5Widgets REQUIRED) +find_package (Qt5Multimedia REQUIRED) + +# Tell CMake to run moc when necessary +set (CMAKE_AUTOMOC ON) + +# don't use Qt "keywords" signal, slot, emit in generated files to +# avoid compatability issue with other libraries +#ADD_DEFINITIONS (-DQT_NO_KEYWORDS) + +# As moc files are generated in the binary dir, tell CMake to always +# look for includes there: +set (CMAKE_INCLUDE_CURRENT_DIR ON) + +# project definitions +add_definitions (-DQT5) +if (CMAKE_HOST_UNIX) + add_definitions (-DUNIX) +elseif (CMAKE_HOST_WIN32) + add_definitions (-DWIN32) +endif () + +add_definitions (-DWSJT_SOFT_KEYING) +set_property (DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT) + + +# +# build the subdirectories +# +add_subdirectory (lib) + + +# UI generation +qt5_wrap_ui (GENUISRCS ${UISRCS}) + +add_executable (wsjtx ${CXXSRCS} ${GENUISRCS} ${GENQRC}) +target_link_libraries (wsjtx jt9impl ${hamlib} ${fftw3f}) +if (WIN32) + target_link_libraries (wsjtx ${CMAKE_CURRENT_SOURCE_DIR}/libHRDInterface001.a) +endif (WIN32) +add_dependencies (wsjtx hamlib) +qt5_use_modules (wsjtx Widgets Multimedia OpenGL) + +file (DOWNLOAD http://physics.princeton.edu/pulsar/K1JT/kvasd contrib/kvasd) +add_custom_target (kvasd DEPENDS contrib/kvasd) + +install ( + TARGETS wsjtx + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ) + +install (DIRECTORY Palettes DESTINATION bin PATTERN *.pal) + +install ( + PROGRAMS ${CMAKE_BINARY_DIR}/contrib/kvasd + DESTINATION bin +) + +if (WIN32) + install ( + FILES ${hamlib-runtime} ${hamlib-backends} ${fftw3f} ${usb} ${Widgets} ${Multimedia} + DESTINATION bin COMPONENT Runtime + ) +endif (WIN32) + + +# a custom target that is always built +ADD_CUSTOM_TARGET (revisiontag ALL) + +# creates svnversion.h using cmake script +ADD_CUSTOM_COMMAND (TARGET revisiontag COMMAND ${CMAKE_COMMAND} + -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake) + +# explicitly say that the executable depends on custom target +add_dependencies(wsjtx revisiontag) + +# +# versioning +# +configure_file ( + "${PROJECT_SOURCE_DIR}/wsjtx_config.h.in" + "${PROJECT_BINARY_DIR}/wsjtx_config.h" + ) + +include_directories ("${PROJECT_BINARY_DIR}") diff --git a/getsvn.cmake b/getsvn.cmake new file mode 100644 index 000000000..d1007b2c4 --- /dev/null +++ b/getsvn.cmake @@ -0,0 +1,16 @@ +find_package (Subversion) +if (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + # the FindSubversion.cmake module is part of the standard distribution + include (FindSubversion) + # extract working copy information for SOURCE_DIR into MY_XXX variables + Subversion_WC_INFO (${SOURCE_DIR} MY) + # write a file with the SVNVERSION define + file (WRITE svnversion.h.txt "#define SVNVERSION ${MY_WC_REVISION}\n") +else (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + file (WRITE svnversion.h.txt "#define SVNVERSION local\n") +endif (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + +# copy the file to the final header only if the version changes +# reduces needless rebuilds +execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different + svnversion.h.txt svnversion.h) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt new file mode 100644 index 000000000..71d9e876a --- /dev/null +++ b/lib/CMakeLists.txt @@ -0,0 +1,186 @@ +cmake_minimum_required (VERSION 2.8.8) + +project (libjt9 C CXX Fortran) + +if (POLICY CMP0020) + cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows +endif (POLICY CMP0020) + +# make sure that the default is a RELEASE +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are: None Debug Release." + FORCE) +endif (NOT CMAKE_BUILD_TYPE) + +set (CMAKE_POSITION_INDEPENDENT_CODE ON) + + +# +# Fortran setup +# + +# FFLAGS depend on the compiler +get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) + +if (Fortran_COMPILER_NAME MATCHES "gfortran.*") + # gfortran + set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3") + set (CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g") +elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") + # ifort (untested) + set (CMAKE_Fortran_FLAGS_RELEASE "-f77rtl -O3") + set (CMAKE_Fortran_FLAGS_DEBUG "-f77rtl -O0 -g") +elseif (Fortran_COMPILER_NAME MATCHES "g77") + # g77 + set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3 -m32") + set (CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g -m32") +else (Fortran_COMPILER_NAME MATCHES "gfortran.*") + message ("CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER}) + message ("Fortran compiler: " ${Fortran_COMPILER_NAME}) + message ("No optimized Fortran compiler flags are known, we just try -O2...") + set (CMAKE_Fortran_FLAGS_RELEASE "-O2") + set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g") +endif (Fortran_COMPILER_NAME MATCHES "gfortran.*") + + +# +# C++ setup +# + +if (UNIX) + SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +endif (UNIX) + + +# +# setup and test Fortran C/C++ interaction +# + +include (FortranCInterface) +FortranCInterface_VERIFY (CXX QUIET) +FortranCInterface_HEADER (FC.h MACRO_NAMESPACE "FC_" SYMBOL_NAMESPACE "FC_" + SYMBOLS ) + + +set (FSRCS + afc65b.f90 + afc9.f90 + analytic.f90 + azdist.f90 + ccf2.f90 + ccf65.f90 + chkhist.f90 + chkss2.f90 + db.f90 + decode65a.f90 + decode65b.f90 + decode9.f90 + decoder.f90 + deg2grid.f90 + demod64a.f90 + downsam9.f90 + encode232.f90 + entail.f90 + extract.F90 + f77_wisdom.f90 + fano232.f90 + fchisq.f90 + fchisq65.f90 + fil3.f90 + fil6521.f90 + filbig.f90 + fillcom.f90 + flat2.f90 + flat65.f90 + four2a.f90 + gen65.f90 + genjt9.f90 + geodist.f90 + getlags.f90 + getpfx1.f90 + getpfx2.f90 + graycode.f90 + graycode65.f90 + grid2deg.f90 + grid2k.f90 + grid2n.f90 + indexx.f90 + interleave63.f90 + interleave9.f90 + jt65a.f90 + k2grid.f90 + morse.f90 + move.f90 + n2grid.f90 + nchar.f90 + packbits.f90 + packcall.f90 + packgrid.f90 + packmsg.f90 + packtext.f90 + pctile.f90 + peakdt9.f90 + pfxdump.f90 + sec_midn.f90 + setup65.f90 + sleep_msec.f90 + smo121.f90 + softsym.f90 + sort.f90 + ssort.f90 + stdmsg.f90 + symspec.f90 + symspec2.f90 + symspec65.f90 + sync9.f90 + timer.f90 + twkfreq.f90 + twkfreq65.f90 + unpackbits.f90 + unpackcall.f90 + unpackgrid.f90 + unpackmsg.f90 + unpacktext.f90 + zplot9.f90 + ) + +set (CSRCS + cutil.c + decode_rs.c + encode_rs.c + gran.c + igray.c + init_rs.c + wrapkarn.c +) + +set (CXXSRCS + ipcomm.cpp + ) + + +add_definitions (-DBIGSYM=1) + +# +# build our targets +# +add_library (jt9impl STATIC ${FSRCS} ${CSRCS} ${CXXSRCS}) +qt5_use_modules (jt9impl Core) + +add_executable (jt9sim jt9sim.f90) +target_link_libraries (jt9sim jt9impl) + +add_executable (jt9code jt9code.f90) +target_link_libraries (jt9code jt9impl) + +add_executable (jt9 jt9.f90 jt9a.f90 jt9b.f90 jt9c.f90) +target_link_libraries (jt9 jt9impl ${fftw3f}) +add_dependencies (jt9 fftw3f) +qt5_use_modules (jt9 Core) + +install ( + TARGETS jt9 + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ) diff --git a/wsjtx_config.h.in b/wsjtx_config.h.in new file mode 100644 index 000000000..fd95b6bd8 --- /dev/null +++ b/wsjtx_config.h.in @@ -0,0 +1,4 @@ +#include "svnversion.h" + +#define WSJTX_VERSION_MAJOR @WSJTX_VERSION_MAJOR@ +#define WSJTX_VERSION_MINOR @WSJTX_VERSION_MINOR@