cmake_minimum_required (VERSION 3.7.2 FATAL_ERROR) if (APPLE) # # The following variables define the portability and compatability attributes of the Mac macOS build # they are choosen with care and should not be changed without good cause. # # Among other things these options are chosen to match the portability and compatability options of the # Qt framework dylibs which can be checked as follows: # # otool -l | grep -A3 LC_VERSION_MIN_MACOSX # set (CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "Earliest version of macOS supported Earliest version we can support with Qt 5.12, C++11 & libc++ is 10.12. Do not override this if you intend to build an official deployable installer.") endif (APPLE) # # CMake policies # if (POLICY CMP0020) cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows endif () if (POLICY CMP0043) cmake_policy (SET CMP0043 NEW) # ignore COMPILE_DEFINITIONS_ endif () if (POLICY CMP0048) cmake_policy (SET CMP0048 NEW) # clear PROJECT_Version_* variables if not set in project() command endif () if (POLICY CMP0063) cmake_policy (SET CMP0063 NEW) # honour visibility properties for all library types endif () if (POLICY CMP0071) cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources endif () if (POLICY CMP0075) cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks endif () project (wsjtx VERSION 2.6.0.0 LANGUAGES C CXX Fortran ) set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") set (CMAKE_PROJECT_DESCRIPTION ${PROJECT_DESCRIPTION}) # # Local CMake modules and support files # set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) set (PROJECT_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") if (NOT PROJECT_ARCHITECTURE) # This is supposed to happen already on Windows if (CMAKE_SIZEOF_VOID_P MATCHES 8) set (PROJECT_ARCHITECTURE "x64") else () set (PROJECT_ARCHITECTURE "$ENV{PROCESSOR_ARCHITECTURE}") endif () endif () message (STATUS "******************************************************") message (STATUS "Building for for: ${CMAKE_SYSTEM_NAME}-${PROJECT_ARCHITECTURE}") message (STATUS "******************************************************") include (set_build_type) # RC 0 or omitted is a development build, GA is a General Availability release build set_build_type (RC 2) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # # project information # set (PROJECT_BUNDLE_NAME "WSJT-X") set (PROJECT_VENDOR "Joe Taylor, K1JT") set (PROJECT_CONTACT "Joe Taylor ") set (PROJECT_COPYRIGHT "Copyright (C) 2001-2021 by Joe Taylor, K1JT") set (PROJECT_HOMEPAGE https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html) set (PROJECT_MANUAL wsjtx-main) set (PROJECT_MANUAL_DIRECTORY_URL https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/) set (PROJECT_SAMPLES_URL http://downloads.sourceforge.net/project/wsjt/) set (PROJECT_SAMPLES_UPLOAD_DEST frs.sourceforge.net:/home/frs/project/wsjt/) # make sure that the default configuration 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) if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") set (is_debug_build 1) endif () # # Options & features # # Some of these directly effect compilation by being defined in # wsjtx_config.h.in which makes them available to the C/C++ # pre-processor. # include (CMakeDependentOption) # Allow the developer to select if Dynamic or Static libraries are built OPTION (BUILD_SHARED_LIBS "Build Shared Libraries" OFF) # Set the LIB_TYPE variable to STATIC SET (LIB_TYPE STATIC) if (BUILD_SHARED_LIBS) # User wants to build Dynamic Libraries, so change the LIB_TYPE variable to CMake keyword 'SHARED' set (LIB_TYPE SHARED) endif (BUILD_SHARED_LIBS) option (UPDATE_TRANSLATIONS "Update source translation translations/*.ts files (WARNING: make clean will delete the source .ts files! Danger!)") option (WSJT_SHARED_RUNTIME "Debugging option that allows running from a shared Cloud directory.") option (WSJT_QDEBUG_TO_FILE "Redirect Qt debuging messages to a trace file.") option (WSJT_SOFT_KEYING "Apply a ramp to CW keying envelope to reduce transients." ON) option (WSJT_SKIP_MANPAGES "Skip *nix manpage generation.") option (WSJT_GENERATE_DOCS "Generate documentation files." ON) option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.") option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.") option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON) CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in Release configuration." OFF "NOT is_debug_build" OFF) CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON is_debug_build OFF) CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN "The wsjtx target is normally built as GUI executable with a WinMain entry point on Windows, if you want a console application instead then set this option to OFF. If you just want to see the debug output from the application then the easiest way is to attach a debugger which will then receive the console output inside its console." ON "WIN32" OFF) # # install locations # if (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_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 # set (fort_qt_CXXSRCS lib/shmem.cpp ) set (wsjt_qt_CXXSRCS helper_functions.cpp qt_helpers.cpp widgets/MessageBox.cpp MetaDataRegistry.cpp Network/NetworkServerLookup.cpp revision_utils.cpp L10nLoader.cpp WFPalette.cpp Radio.cpp RadioMetaType.cpp NonInheritingProcess.cpp models/IARURegions.cpp models/Bands.cpp models/Modes.cpp models/FrequencyList.cpp models/StationList.cpp widgets/FrequencyLineEdit.cpp widgets/FrequencyDeltaLineEdit.cpp item_delegates/CandidateKeyFilter.cpp item_delegates/ForeignKeyDelegate.cpp validators/LiveFrequencyValidator.cpp GetUserId.cpp Audio/AudioDevice.cpp Transceiver/Transceiver.cpp Transceiver/TransceiverBase.cpp Transceiver/EmulateSplitTransceiver.cpp Transceiver/TransceiverFactory.cpp Transceiver/PollingTransceiver.cpp Transceiver/HamlibTransceiver.cpp Transceiver/HRDTransceiver.cpp Transceiver/DXLabSuiteCommanderTransceiver.cpp Network/NetworkMessage.cpp Network/MessageClient.cpp widgets/LettersSpinBox.cpp widgets/HintedSpinBox.cpp widgets/RestrictedSpinBox.cpp widgets/HelpTextWindow.cpp SampleDownloader.cpp SampleDownloader/DirectoryDelegate.cpp SampleDownloader/Directory.cpp SampleDownloader/FileNode.cpp SampleDownloader/RemoteFile.cpp DisplayManual.cpp MultiSettings.cpp validators/MaidenheadLocatorValidator.cpp validators/CallsignValidator.cpp widgets/SplashScreen.cpp EqualizationToolsDialog.cpp widgets/DoubleClickablePushButton.cpp widgets/DoubleClickableRadioButton.cpp Network/LotWUsers.cpp models/DecodeHighlightingModel.cpp widgets/DecodeHighlightingListView.cpp models/FoxLog.cpp widgets/AbstractLogWindow.cpp widgets/FoxLogWindow.cpp widgets/CabrilloLogWindow.cpp item_delegates/CallsignDelegate.cpp item_delegates/MaidenheadLocatorDelegate.cpp item_delegates/FrequencyDelegate.cpp item_delegates/FrequencyDeltaDelegate.cpp item_delegates/SQLiteDateTimeDelegate.cpp models/CabrilloLog.cpp logbook/AD1CCty.cpp logbook/WorkedBefore.cpp logbook/Multiplier.cpp Network/NetworkAccessManager.cpp widgets/LazyFillComboBox.cpp widgets/CheckableItemComboBox.cpp widgets/BandComboBox.cpp ) set (wsjt_qtmm_CXXSRCS Audio/BWFFile.cpp ) set (jt9_FSRCS lib/jt9.f90 lib/jt9a.f90 ) set (wsjtx_CXXSRCS WSJTXLogging.cpp logbook/logbook.cpp Network/PSKReporter.cpp Modulator/Modulator.cpp Detector/Detector.cpp widgets/logqso.cpp widgets/displaytext.cpp Decoder/decodedtext.cpp getfile.cpp Audio/soundout.cpp Audio/soundin.cpp widgets/meterwidget.cpp widgets/signalmeter.cpp widgets/plotter.cpp widgets/widegraph.cpp widgets/echograph.cpp widgets/echoplot.cpp widgets/fastgraph.cpp widgets/fastplot.cpp widgets/about.cpp widgets/astro.cpp widgets/messageaveraging.cpp widgets/activeStations.cpp widgets/colorhighlighting.cpp WSPR/WsprTxScheduler.cpp widgets/mainwindow.cpp Configuration.cpp main.cpp Network/wsprnet.cpp WSPR/WSPRBandHopping.cpp widgets/ExportCabrillo.cpp ) set (wsjt_CXXSRCS Logger.cpp lib/crc10.cpp lib/crc13.cpp lib/crc14.cpp ) # deal with a GCC v6 UB error message set_source_files_properties ( lib/crc10.cpp lib/crc13.cpp lib/crc14.cpp PROPERTIES COMPILE_FLAGS -fpermissive) if (WIN32) set (wsjt_CXXSRCS ${wsjt_CXXSRCS} killbyname.cpp ) set (wsjt_qt_CXXSRCS ${wsjt_qt_CXXSRCS} Transceiver/OmniRigTransceiver.cpp ) endif (WIN32) set (wsjt_FSRCS # put module sources first in the hope that they get rebuilt before use lib/types.f90 lib/C_interface_module.f90 lib/shmem.f90 lib/crc.f90 lib/fftw3mod.f90 lib/hashing.f90 lib/iso_c_utilities.f90 lib/jt4.f90 lib/jt4_decode.f90 lib/jt65_decode.f90 lib/jt65_mod.f90 lib/ft8_decode.f90 lib/ft4_decode.f90 lib/fst4_decode.f90 lib/jt9_decode.f90 lib/options.f90 lib/packjt.f90 lib/77bit/packjt77.f90 lib/qra/q65/q65.f90 lib/q65_decode.f90 lib/readwav.f90 lib/timer_C_wrapper.f90 lib/timer_impl.f90 lib/timer_module.f90 lib/wavhdr.f90 lib/qra/q65/q65_encoding_modules.f90 lib/ft8/ft8_a7.f90 # remaining non-module sources lib/addit.f90 lib/afc65b.f90 lib/afc9.f90 lib/ana64.f90 lib/ana932.f90 lib/analytic.f90 lib/astro.f90 lib/astrosub.f90 lib/astro0.f90 lib/avecho.f90 lib/averms.f90 lib/azdist.f90 lib/ft8/baseline.f90 lib/ft4/ft4_baseline.f90 lib/blanker.f90 lib/bpdecode40.f90 lib/bpdecode128_90.f90 lib/ft8/bpdecode174_91.f90 lib/baddata.f90 lib/calibrate.f90 lib/ccf2.f90 lib/ccf65.f90 lib/ft8/chkcrc13a.f90 lib/ft8/chkcrc14a.f90 lib/chkcall.f90 lib/chkhist.f90 lib/chkmsg.f90 lib/chkss2.f90 lib/ft4/clockit.f90 lib/ft8/compress.f90 lib/coord.f90 lib/db.f90 lib/decode4.f90 lib/decode65a.f90 lib/decode65b.f90 lib/decode9w.f90 lib/ft8/decode174_91.f90 lib/decoder.f90 lib/deep4.f90 lib/deg2grid.f90 lib/degrade_snr.f90 lib/demod64a.f90 lib/determ.f90 lib/downsam9.f90 lib/echo_snr.f90 lib/encode232.f90 lib/encode4.f90 lib/encode_msk40.f90 lib/encode_128_90.f90 lib/ft8/encode174_91.f90 lib/ft8/encode174_91_nocrc.f90 lib/entail.f90 lib/ephem.f90 lib/extract.f90 lib/extract4.f90 lib/extractmessage77.f90 lib/fano232.f90 lib/fast9.f90 lib/fast_decode.f90 lib/fchisq.f90 lib/fchisq0.f90 lib/fchisq65.f90 lib/fil3.f90 lib/fil3c.f90 lib/fil4.f90 lib/fil6521.f90 lib/filbig.f90 lib/ft8/filt8.f90 lib/fitcal.f90 lib/flat1.f90 lib/flat1a.f90 lib/flat1b.f90 lib/flat2.f90 lib/flat4.f90 lib/flat65.f90 lib/fmtmsg.f90 lib/foldspec9f.f90 lib/four2a.f90 lib/ft8/foxfilt.f90 lib/ft8/foxgen.f90 lib/ft8/foxgen_wrap.f90 lib/freqcal.f90 lib/ft8/ft8apset.f90 lib/ft8/ft8b.f90 lib/ft8/ft8code.f90 lib/ft8/ft8_downsample.f90 lib/ft8/ft8sim.f90 lib/gen4.f90 lib/gen65.f90 lib/gen9.f90 lib/genwave.f90 lib/ft8/genft8.f90 lib/qra/q65/genq65.f90 lib/genmsk_128_90.f90 lib/genmsk40.f90 lib/ft4/ft4code.f90 lib/ft4/genft4.f90 lib/ft4/gen_ft4wave.f90 lib/ft8/gen_ft8wave.f90 lib/ft8/genft8refsig.f90 lib/genwspr.f90 lib/geodist.f90 lib/ft8/get_crc14.f90 lib/getlags.f90 lib/getmet4.f90 lib/ft8/get_spectrum_baseline.f90 lib/ft2/gfsk_pulse.f90 lib/graycode.f90 lib/graycode65.f90 lib/grayline.f90 lib/grid2deg.f90 lib/ft8/h1.f90 lib/hash.f90 lib/hint65.f90 lib/hspec.f90 lib/indexx.f90 lib/init_random_seed.f90 lib/interleave4.f90 lib/interleave63.f90 lib/interleave9.f90 lib/inter_wspr.f90 lib/jplsubs.f lib/jt9fano.f90 lib/libration.f90 lib/lorentzian.f90 lib/fst4/lorentzian_fading.f90 lib/lpf1.f90 lib/map65_mmdec.f90 lib/mixlpf.f90 lib/makepings.f90 lib/moondopjpl.f90 lib/morse.f90 lib/move.f90 lib/msk40decodeframe.f90 lib/msk144decodeframe.f90 lib/msk40spd.f90 lib/msk144spd.f90 lib/msk40sync.f90 lib/msk144sync.f90 lib/msk40_freq_search.f90 lib/msk144_freq_search.f90 lib/mskrtd.f90 lib/msk144signalquality.f90 lib/msk144sim.f90 lib/mskrtd.f90 lib/nuttal_window.f90 lib/ft4/ft4sim.f90 lib/ft4/ft4sim_mult.f90 lib/ft4/ft4_downsample.f90 lib/77bit/my_hash.f90 lib/wsprd/osdwspr.f90 lib/ft8/osd174_91.f90 lib/osd128_90.f90 lib/pctile.f90 lib/peakdt9.f90 lib/peakup.f90 lib/plotsave.f90 lib/platanh.f90 lib/pltanh.f90 lib/polyfit.f90 lib/prog_args.f90 lib/ps4.f90 lib/qra/q65/q65_ap.f90 lib/qra/q65/q65_loops.f90 lib/qra/q65/q65_set_list.f90 lib/refspectrum.f90 lib/savec2.f90 lib/save_dxbase.f90 lib/sec0.f90 lib/sec_midn.f90 lib/setup65.f90 lib/sh65.f90 lib/sh65snr.f90 lib/slasubs.f lib/sleep_msec.f90 lib/slope.f90 lib/smo.f90 lib/smo121.f90 lib/softsym.f90 lib/softsym9f.f90 lib/softsym9w.f90 lib/shell.f90 lib/spec64.f90 lib/spec9f.f90 lib/stdmsg.f90 lib/subtract65.f90 lib/ft8/subtractft8.f90 lib/ft4/subtractft4.f90 lib/sun.f90 lib/symspec.f90 lib/symspec2.f90 lib/symspec65.f90 lib/sync4.f90 lib/sync65.f90 lib/ft4/getcandidates4.f90 lib/ft4/get_ft4_bitmetrics.f90 lib/ft8/sync8.f90 lib/ft8/sync8d.f90 lib/ft4/sync4d.f90 lib/sync9.f90 lib/sync9f.f90 lib/sync9w.f90 lib/test_snr.f90 lib/timf2.f90 lib/tweak1.f90 lib/twkfreq.f90 lib/ft8/twkfreq1.f90 lib/twkfreq65.f90 lib/update_recent_calls.f90 lib/update_msk40_hasharray.f90 lib/ft8/watterson.f90 lib/wav11.f90 lib/wav12.f90 lib/xcor.f90 lib/xcor4.f90 lib/wqdecode.f90 lib/wqencode.f90 lib/wspr_downsample.f90 lib/zplot9.f90 lib/fst4/decode240_101.f90 lib/fst4/decode240_74.f90 lib/fst4/encode240_101.f90 lib/fst4/encode240_74.f90 lib/fst4/fst4sim.f90 lib/fst4/gen_fst4wave.f90 lib/fst4/genfst4.f90 lib/fst4/get_fst4_bitmetrics.f90 lib/fst4/get_fst4_bitmetrics2.f90 lib/fst4/ldpcsim240_101.f90 lib/fst4/ldpcsim240_74.f90 lib/fst4/osd240_101.f90 lib/fst4/osd240_74.f90 lib/fst4/fastosd240_74.f90 lib/fst4/get_crc24.f90 lib/fst4/fst4_baseline.f90 ) # temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit set_source_files_properties (lib/slasubs.f PROPERTIES COMPILE_FLAGS -O2) set (ka9q_CSRCS lib/ftrsd/decode_rs.c lib/ftrsd/encode_rs.c lib/ftrsd/init_rs.c ) set_source_files_properties (${ka9q_CSRCS} PROPERTIES COMPILE_FLAGS -Wno-sign-compare) set (qra_CSRCS lib/qra/qracodes/qra12_63_64_irr_b.c lib/qra/qracodes/qra13_64_64_irr_e.c lib/qra/q65/npfwht.c lib/qra/q65/pdmath.c lib/qra/q65/qracodes.c lib/qra/q65/normrnd.c lib/qra/q65/qra15_65_64_irr_e23.c lib/qra/q65/q65.c lib/qra/q65/q65_subs.c ) set (wsjt_CSRCS ${ka9q_CSRCS} lib/ftrsd/ftrsdap.c lib/sgran.c lib/golay24_table.c lib/gran.c lib/igray.c lib/init_random_seed.c lib/ldpc32_table.c lib/wsprd/nhash.c lib/tab.c lib/tmoonsub.c lib/usleep.c lib/vit213.c lib/wisdom.c lib/wrapkarn.c ${ldpc_CSRCS} ${qra_CSRCS} ) set (wsjt_qt_UISRCS wf_palette_design_dialog.ui widgets/FoxLogWindow.ui widgets/CabrilloLogWindow.ui ) set (wsprsim_CSRCS lib/wsprd/wsprsim.c lib/wsprd/wsprsim_utils.c lib/wsprd/wsprd_utils.c lib/wsprd/fano.c lib/wsprd/tab.c lib/wsprd/nhash.c ) set (wsprd_CSRCS lib/wsprd/wsprd.c lib/wsprd/wsprsim_utils.c lib/wsprd/wsprd_utils.c lib/wsprd/fano.c lib/wsprd/jelinek.c lib/wsprd/tab.c lib/wsprd/nhash.c lib/init_random_seed.c ) set (wsjtx_UISRCS widgets/mainwindow.ui widgets/about.ui widgets/astro.ui widgets/colorhighlighting.ui widgets/echograph.ui widgets/fastgraph.ui widgets/messageaveraging.ui widgets/activeStations.ui widgets/widegraph.ui widgets/logqso.ui Configuration.ui widgets/ExportCabrillo.ui ) set (UDP_library_CXXSRCS Radio.cpp RadioMetaType.cpp Network/NetworkMessage.cpp UDPExamples/MessageServer.cpp ) set (UDP_library_HEADERS Radio.hpp UDPExamples/MessageServer.hpp ${PROJECT_BINARY_DIR}/udp_export.h ) set (message_aggregator_CXXSRCS UDPExamples/MessageAggregator.cpp UDPExamples/MessageAggregatorMainWindow.cpp UDPExamples/DecodesModel.cpp UDPExamples/BeaconsModel.cpp UDPExamples/ClientWidget.cpp validators/MaidenheadLocatorValidator.cpp ) set (message_aggregator_STYLESHEETS UDPExamples/qss/default.qss ) set (qcp_CXXSRCS qcustomplot-source/qcustomplot.cpp ) set (all_CXXSRCS ${wsjt_CXXSRCS} ${fort_qt_CXXSRCS} ${wsjt_qt_CXXSRCS} ${wsjt_qtmm_CXXSRCS} ${wsjtx_CXXSRCS} ${qcp_CXXSRCS} ) set (all_C_and_CXXSRCS ${wsjt_CSRCS} ${wsprsim_CSRCS} ${wsprd_CSRCS} ${all_CXXSRCS} ) set (TOP_LEVEL_RESOURCES icons/Darwin/wsjtx.iconset/icon_128x128.png contrib/gpl-v3-logo.svg artwork/splash.png ) set (PALETTE_FILES Palettes/Banana.pal Palettes/Blue1.pal Palettes/Blue2.pal Palettes/Blue3.pal Palettes/Brown.pal Palettes/Cyan1.pal Palettes/Cyan2.pal Palettes/Cyan3.pal Palettes/Default.pal Palettes/Digipan.pal Palettes/Fldigi.pal Palettes/Gray1.pal Palettes/Gray2.pal Palettes/Green1.pal Palettes/Green2.pal Palettes/Jungle.pal Palettes/Linrad.pal Palettes/Negative.pal Palettes/Orange.pal Palettes/Pink.pal Palettes/Rainbow.pal Palettes/Scope.pal Palettes/Sunburst.pal Palettes/VK4BDJ.pal Palettes/YL2KF.pal Palettes/Yellow1.pal Palettes/Yellow2.pal Palettes/ZL1FZ.pal ) if (APPLE) set (WSJTX_ICON_FILE ${CMAKE_PROJECT_NAME}.icns) set (ICONSRCS icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16@2x.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32@2x.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128@2x.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256@2x.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512.png icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512@2x.png ) add_custom_command ( OUTPUT ${WSJTX_ICON_FILE} COMMAND iconutil -c icns --output "${CMAKE_BINARY_DIR}/${WSJTX_ICON_FILE}" "${CMAKE_SOURCE_DIR}/icons/Darwin/${CMAKE_PROJECT_NAME}.iconset" DEPENDS ${ICONSRCS} COMMENT "Building Icons" ) else () set (WSJTX_ICON_FILE icons/windows-icons/wsjtx.ico) endif (APPLE) set_source_files_properties (${WSJTX_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) # suppress intransigent compiler diagnostics set_source_files_properties (lib/decoder.f90 PROPERTIES COMPILE_FLAGS "-Wno-unused-dummy-argument") set_source_files_properties (lib/filbig.f90 PROPERTIES COMPILE_FLAGS "-Wno-aliasing") ## disable Qt trace and warning messages from release configurations #set_property (DIRECTORY APPEND PROPERTY # COMPILE_DEFINITIONS $<$>:QT_NO_DEBUG_OUTPUT;QT_NO_WARNING_OUTPUT> # ) set_property (SOURCE ${all_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") set_property (SOURCE ${all_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h) if (WIN32) # generate the OmniRig COM interface source find_program (DUMPCPP dumpcpp) if (DUMPCPP-NOTFOUND) message (FATAL_ERROR "dumpcpp tool not found") endif (DUMPCPP-NOTFOUND) execute_process ( COMMAND ${DUMPCPP} -getfile {4FE359C5-A58F-459D-BE95-CA559FB4F270} OUTPUT_VARIABLE AXSERVER OUTPUT_STRIP_TRAILING_WHITESPACE ) string (STRIP "${AXSERVER}" AXSERVER) if (NOT AXSERVER) message (FATAL_ERROR "You need to install OmniRig on this computer") endif (NOT AXSERVER) string (REPLACE "\"" "" AXSERVER ${AXSERVER}) file (TO_CMAKE_PATH ${AXSERVER} AXSERVERSRCS) endif () # # decide on platform specifc packing and fixing up # if (APPLE) set (WSJTX_BUNDLE_VERSION ${wsjtx_VERSION}) # make sure CMAKE_INSTALL_PREFIX ends in / string (LENGTH "${CMAKE_INSTALL_PREFIX}" LEN) math (EXPR LEN "${LEN} -1" ) string (SUBSTRING "${CMAKE_INSTALL_PREFIX}" ${LEN} 1 ENDCH) if (NOT "${ENDCH}" STREQUAL "/") set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/") endif () endif (APPLE) # # find some useful tools # include (CheckTypeSize) include (CheckCSourceCompiles) include (CheckIncludeFiles) include (CheckSymbolExists) include (generate_version_info) find_program(CTAGS ctags) find_program(ETAGS etags) # # Platform checks # check_include_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) check_include_files (stdio.h HAVE_STDIO_H) check_include_files (stdlib.h HAVE_STDLIB_H) check_include_files (unistd.h HAVE_UNISTD_H) check_include_files (sys/ioctl.h HAVE_SYS_IOCTL_H) check_include_files (sys/types.h HAVE_SYS_TYPES_H) check_include_files (fcntl.h HAVE_FCNTL_H) check_include_files (sys/stat.h HAVE_SYS_STAT_H) check_include_files ("linux/ppdev.h;linux/parport.h" HAVE_LINUX_PPDEV_H) check_include_files ("dev/ppbus/ppi.h;dev/ppbus/ppbconf.h" HAVE_DEV_PPBUS_PPI_H) # # Standard C Math Library # set (LIBM_TEST_SOURCE "#include\nfloat f; int main(){sqrt(f);return 0;}") check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_MATH) if (HAVE_MATH) set (LIBM_LIBRARIES) else () set (CMAKE_REQUIRED_LIBRARIES m) check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_LIBM_MATH) unset (CMAKE_REQUIRED_LIBRARIES) if (NOT HAVE_LIBM_MATH) message (FATAL_ERROR "Unable to use C math library functions") endif () set (LIBM_LIBRARIES m) endif () # # Boost # if (WIN32) set (Boost_USE_STATIC_LIBS OFF) endif () find_package (Boost 1.62 REQUIRED COMPONENTS log_setup log) # # OpenMP # find_package (OpenMP) # # fftw3 single precision library # find_package (FFTW3 COMPONENTS single threads REQUIRED) # # hamlib setup # find_package (Hamlib REQUIRED) find_program (RIGCTL_EXE rigctl) find_program (RIGCTLD_EXE rigctld) find_program (RIGCTLCOM_EXE rigctlcom) check_type_size (CACHE_ALL HAMLIB_OLD_CACHING) check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING) find_package (Usb REQUIRED) # # Qt5 setup # # Widgets finds its own dependencies. find_package (Qt5 COMPONENTS Widgets SerialPort Multimedia PrintSupport Sql LinguistTools REQUIRED) if (WIN32) add_definitions (-DQT_NEEDS_QTMAIN) find_package (Qt5AxContainer REQUIRED) endif (WIN32) # # Library building setup # include (GenerateExportHeader) set (CMAKE_CXX_VISIBILITY_PRESET hidden) set (CMAKE_C_VISIBILITY_PRESET hidden) set (CMAKE_Fortran_VISIBILITY_PRESET hidden) set (CMAKE_VISIBILITY_INLINES_HIDDEN ON) #set (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) # # C & C++ setup # set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra -fexceptions -frtti") if (NOT APPLE) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pragmas") if (${OPENMP_FOUND}) if (OpenMP_C_FLAGS) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") endif () endif () set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fdata-sections -ffunction-sections") set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fdata-sections -ffunction-sections") set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") endif (NOT APPLE) if (WIN32) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") endif (WIN32) if (APPLE AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") else () set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=gnu++11 -pthread") endif () # # Fortran setup # set (General_FFLAGS "-Wall -Wno-conversion -fno-second-underscore") # FFLAGS depend on the compiler get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) if (Fortran_COMPILER_NAME MATCHES "gfortran.*") # gfortran # CMake compiler test is supposed to do this but doesn't yet if (CMAKE_OSX_DEPLOYMENT_TARGET) set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") endif (CMAKE_OSX_DEPLOYMENT_TARGET) if (CMAKE_OSX_SYSROOT) set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") endif (CMAKE_OSX_SYSROOT) set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") # FPE traps currently disabled in Debug configuration builds until # we decide if they are meaningful, without these FP instructions # run in nonstop mode and do not trap #set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${CMAKE_Fortran_FLAGS_DEBUG} -ffpe-trap=invalid,zero,overflow") elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") # ifort (untested) set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -f77rtl ${General_FFLAGS}") set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -f77rtl ${General_FFLAGS}") elseif (Fortran_COMPILER_NAME MATCHES "g77") # g77 set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -funroll-all-loops -fno-f2c -m32 ${General_FFLAGS}") set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check -fno-f2c -m32 ${General_FFLAGS}") 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 -O3...") set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -O3 ${General_FFLAGS}") set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check ${General_FFLAGS}") endif (Fortran_COMPILER_NAME MATCHES "gfortran.*") # # Linker setup # if (NOT APPLE) set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections") set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -Wl,--gc-sections") endif (NOT APPLE) # # setup and test Fortran C/C++ interaction # include (FortranCInterface) FortranCInterface_VERIFY (CXX) FortranCInterface_HEADER (FC.h MACRO_NAMESPACE "FC_" SYMBOL_NAMESPACE "FC_" SYMBOLS grayline ) # # sort out pre-requisites # # # Setup RPATH so that built executable targets will run in both the # build tree and the install location without having to set a # (DYLD|LD)_LIBRARY_PATH override. # # use the full RPATH of the build tree set (CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH, it will still be used # later on in the install phase set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # 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 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}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) # if ("${isSystemDir}" STREQUAL "-1") # set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") # endif ("${isSystemDir}" STREQUAL "-1") set (QT_NEED_RPATH FALSE) if (NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib64" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib64") set (QT_NEED_RPATH TRUE) endif () # # stuff only qmake can tell us # get_target_property (QMAKE_EXECUTABLE Qt5::qmake LOCATION) get_target_property (LCONVERT_EXECUTABLE Qt5::lconvert LOCATION) function (QUERY_QMAKE VAR RESULT) exec_program (${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output) if (NOT return_code) file (TO_CMAKE_PATH "${output}" output) set (${RESULT} ${output} PARENT_SCOPE) endif (NOT return_code) message (STATUS "Asking qmake for ${RESULT} and got ${output}") endfunction (QUERY_QMAKE) query_qmake (QT_INSTALL_PLUGINS QT_PLUGINS_DIR) query_qmake (QT_INSTALL_TRANSLATIONS QT_TRANSLATIONS_DIR) query_qmake (QT_INSTALL_IMPORTS QT_IMPORTS_DIR) query_qmake (QT_HOST_DATA QT_DATA_DIR) set (QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) # project definitions add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1 -DBOOST_ALL_DYN_LINK) if (CMAKE_HOST_UNIX) add_definitions (-DUNIX) elseif (CMAKE_HOST_WIN32) add_definitions (-DWIN32) endif () # # sub-directories # if (EXISTS ${CMAKE_SOURCE_DIR}/samples AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/samples) add_subdirectory (samples) endif () if (WSJT_GENERATE_DOCS) add_subdirectory (doc) endif (WSJT_GENERATE_DOCS) if (EXISTS ${CMAKE_SOURCE_DIR}/tests AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) add_subdirectory (tests) endif () # build a library of package functionality (without and optionally with OpenMP support) add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES} Boost::log_setup ${LIBM_LIBRARIES}) # build an OpenMP variant of the Fortran library routines add_library (wsjt_fort STATIC ${wsjt_FSRCS}) target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES}) if (${OPENMP_FOUND} OR APPLE) add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS}) target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES}) if (OpenMP_C_FLAGS AND NOT APPLE) set_target_properties (wsjt_fort_omp PROPERTIES COMPILE_FLAGS "${OpenMP_C_FLAGS}" ) endif () set_target_properties (wsjt_fort_omp PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp ) file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp) if (APPLE) # On Mac we don't have working OpenMP support in the C/C++ # compilers so we have to manually set the correct flags to get # OpenMP support in jt9. target_compile_options (wsjt_fort_omp PRIVATE $<$:-fopenmp> # assumes GNU style Fortran compiler ) endif (APPLE) endif (${OPENMP_FOUND} OR APPLE) if(WSJT_BUILD_UTILS) add_executable (jt4sim lib/jt4sim.f90) target_link_libraries (jt4sim wsjt_fort wsjt_cxx) add_executable (jt65sim lib/jt65sim.f90) target_link_libraries (jt65sim wsjt_fort wsjt_cxx) add_executable (sumsim lib/sumsim.f90) target_link_libraries (sumsim wsjt_fort wsjt_cxx) add_executable (test_snr lib/test_snr.f90) target_link_libraries (test_snr wsjt_fort) add_executable (q65sim lib/qra/q65/q65sim.f90) target_link_libraries (q65sim wsjt_fort wsjt_cxx) add_executable (q65code lib/qra/q65/q65code.f90) target_link_libraries (q65code wsjt_fort wsjt_cxx) add_executable (test_q65 lib/test_q65.f90) target_link_libraries (test_q65 wsjt_fort wsjt_cxx) add_executable (q65_ftn_test lib/qra/q65/q65_ftn_test.f90) target_link_libraries (q65_ftn_test wsjt_fort wsjt_cxx) add_executable (jt49sim lib/jt49sim.f90) target_link_libraries (jt49sim wsjt_fort wsjt_cxx) #add_executable (allsim lib/allsim.f90) #target_link_libraries (allsim wsjt_fort wsjt_cxx) add_executable (rtty_spec lib/rtty_spec.f90) target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) add_executable (jt65code lib/jt65code.f90) target_link_libraries (jt65code wsjt_fort wsjt_cxx) add_executable (jt9code lib/jt9code.f90) target_link_libraries (jt9code wsjt_fort wsjt_cxx) add_executable (wsprcode lib/wsprcode/wsprcode.f90 lib/wsprcode/nhash.c) target_link_libraries (wsprcode wsjt_fort wsjt_cxx) add_executable (encode77 lib/77bit/encode77.f90) target_link_libraries (encode77 wsjt_fort wsjt_cxx) add_executable (wsprsim ${wsprsim_CSRCS}) target_link_libraries (wsprsim ${LIBM_LIBRARIES}) add_executable (jt4code lib/jt4code.f90) target_link_libraries (jt4code wsjt_fort wsjt_cxx) add_executable (msk144code lib/msk144code.f90) target_link_libraries (msk144code wsjt_fort wsjt_cxx) add_executable (ft8code lib/ft8/ft8code.f90) target_link_libraries (ft8code wsjt_fort wsjt_cxx) add_executable (ft4code lib/ft4/ft4code.f90) target_link_libraries (ft4code wsjt_fort wsjt_cxx) add_executable (ft8sim lib/ft8/ft8sim.f90) target_link_libraries (ft8sim wsjt_fort wsjt_cxx) add_executable (msk144sim lib/msk144sim.f90) target_link_libraries (msk144sim wsjt_fort wsjt_cxx) add_executable (ft4sim lib/ft4/ft4sim.f90) target_link_libraries (ft4sim wsjt_fort wsjt_cxx) add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90) target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) add_executable (fst4sim lib/fst4/fst4sim.f90) target_link_libraries (fst4sim wsjt_fort wsjt_cxx) if (WIN32) set_target_properties (fst4sim PROPERTIES LINK_FLAGS -Wl,--stack,0x4000000,--heap,0x6000000 ) endif () add_executable (ldpcsim240_101 lib/fst4/ldpcsim240_101.f90) target_link_libraries (ldpcsim240_101 wsjt_fort wsjt_cxx) add_executable (ldpcsim240_74 lib/fst4/ldpcsim240_74.f90) target_link_libraries (ldpcsim240_74 wsjt_fort wsjt_cxx) endif(WSJT_BUILD_UTILS) add_executable (fmtave lib/fmtave.f90) add_executable (fcal lib/fcal.f90) add_executable (fmeasure lib/fmeasure.f90) # build the wsprd WSPR mode decoder driver generate_version_info (wsprd_VERSION_RESOURCES NAME wsprd BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} FILE_DESCRIPTION "WSPR mode decoder" ) add_executable (wsprd ${wsprd_CSRCS} lib/indexx.f90 lib/wsprd/osdwspr.f90 ${wsprd_VERSION_RESOURCES}) target_include_directories (wsprd PRIVATE ${FFTW3_INCLUDE_DIRS}) target_link_libraries (wsprd ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) # Tell CMake to run moc when necessary set (CMAKE_AUTOMOC ON) include_directories (${CMAKE_CURRENT_BINARY_DIR}) # don't use Qt "keywords" signal, slot, emit in generated files to # avoid compatability issue with other libraries # ADD_DEFINITIONS (-DQT_NO_KEYWORDS) # ADD_DEFINITIONS (-DUNICODE) #as per qmake # As moc files are generated in the binary dir, tell CMake to always # look for includes there: set (CMAKE_INCLUDE_CURRENT_DIR ON) # # source navigation # set (sources ${CMAKE_SOURCE_DIR}/* ${CMAKE_SOURCE_DIR}/logbook/* ${CMAKE_SOURCE_DIR}/lib/* ) add_custom_target (ctags COMMAND ${CTAGS} -o ${CMAKE_SOURCE_DIR}/tags -R ${sources}) add_custom_target (etags COMMAND ${ETAGS} -o ${CMAKE_SOURCE_DIR}/TAGS -R ${sources}) # Qt i18n - always include the country generic if any regional variant is included set (LANGUAGES ca # Catalan da # Danish en # English (we need this to stop # translation loaders loading the # second preference UI languge, it # doesn't need to be populated) en_GB # English UK es # Spanish it # Italian ja # Japanese #no # Norwegian #pt # Portuguese ru # Russian #sv # Swedish zh # Chinese zh_HK # Chinese per Hong Kong zh_TW # Chinese traditional it # Italian ) foreach (lang_ ${LANGUAGES}) file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/translations/wsjtx_${lang_}.ts ts_) list (APPEND TS_FILES ${ts_}) set (qt_translations_ "${QT_TRANSLATIONS_DIR}/qtbase_${lang_}.qm") if (EXISTS "${qt_translations_}") add_custom_command ( OUTPUT "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" COMMAND ${LCONVERT_EXECUTABLE} -o "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" ${qt_translations_} COMMENT "Building required Qt translations for language ${lang_}" ) list (APPEND QM_FILES "${CMAKE_BINARY_DIR}/qt_${lang_}.qm") endif () endforeach () if (UPDATE_TRANSLATIONS) message (STATUS "UPDATE_TRANSLATIONS option is set.") qt5_create_translation ( QM_FILES ${wsjt_qt_UISRCS} ${wsjtx_UISRCS} ${wsjt_qt_CXXSRCS} ${wsjtx_CXXSRCS} ${TS_FILES} OPTIONS -I${CMAKE_CURRENT_SOURCE_DIR} ) else () qt5_add_translation (QM_FILES ${TS_FILES}) endif () add_custom_target (translations DEPENDS ${QM_FILES}) set_property (DIRECTORY PROPERTY CLEAN_NO_CUSTOM TRUE) # embedded resources function (add_resources resources path) foreach (resource_file_ ${ARGN}) get_filename_component (name_ ${resource_file_} NAME) if (IS_ABSOLUTE "${resource_file_}") file (TO_NATIVE_PATH ${resource_file_} source_) else () file (TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${resource_file_} source_) endif () file (TO_NATIVE_PATH ${path}/${name_} dest_) set (resources_ "${resources_}\n ${source_}") set (${resources} ${${resources}}${resources_} PARENT_SCOPE) endforeach (resource_file_ ${ARGN}) endfunction (add_resources resources path) add_resources (wsjtx_RESOURCES "" ${TOP_LEVEL_RESOURCES}) add_resources (wsjtx_RESOURCES /Palettes ${PALETTE_FILES}) add_resources (wsjtx_RESOURCES /Translations ${QM_FILES}) configure_file (wsjtx.qrc.in wsjtx.qrc @ONLY) # UI generation qt5_wrap_ui (wsjt_qt_GENUISRCS ${wsjt_qt_UISRCS}) qt5_wrap_ui (wsjtx_GENUISRCS ${wsjtx_UISRCS}) # Resource generation qt5_add_resources (wsjtx_RESOURCES_RCC ${CMAKE_BINARY_DIR}/wsjtx.qrc contrib/QDarkStyleSheet/qdarkstyle/style.qrc ) # AX COM servers if (WIN32) include (QtAxMacros) wrap_ax_server (GENAXSRCS ${AXSERVERSRCS}) endif (WIN32) # # targets dependent on Qt # # build a library for the QCustomPlot widget add_library (qcp STATIC ${qcp_CXXSRCS}) target_include_directories (qcp PUBLIC $) target_link_libraries (qcp Qt5::Widgets Qt5::PrintSupport) # build a library of package Qt functionality add_library (wsjt_qt STATIC ${wsjt_qt_CXXSRCS} ${wsjt_qt_GENUISRCS} ${GENAXSRCS}) # set wsjtx_udp exports to static variants target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE) target_link_libraries (wsjt_qt Hamlib::Hamlib Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql) if (WIN32) target_link_libraries (wsjt_qt Qt5::AxContainer Qt5::AxBase) endif (WIN32) # build a library of package Qt functionality used in Fortran utilities add_library (fort_qt STATIC ${fort_qt_CXXSRCS}) target_link_libraries (fort_qt Qt5::Core) # build a library of WSJT Qt multimedia components add_library (wsjt_qtmm STATIC ${wsjt_qtmm_CXXSRCS} ${wsjt_qtmm_GENUISRCS}) target_link_libraries (wsjt_qtmm Qt5::Multimedia) # build the jt9 slow mode decoder driver generate_version_info (jt9_VERSION_RESOURCES NAME jt9 BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} FILE_DESCRIPTION "jt9 - WSJT-X slow mode decoder" ) add_executable (record_time_signal Audio/tools/record_time_signal.cpp) target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) add_executable (jt9 ${jt9_FSRCS} ${jt9_VERSION_RESOURCES}) if (${OPENMP_FOUND} OR APPLE) if (APPLE) # On Mac we don't have working OpenMP support in the C/C++ # compilers so we have to manually set the correct linking flags # and libraries to get OpenMP support in jt9. set_target_properties (jt9 PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp LINK_LIBRARIES "gomp;gcc_s.1" # assume GNU libgcc OpenMP ) target_compile_options (jt9 PRIVATE $<$:-fopenmp> # assumes GNU style Fortran compiler ) else (APPLE) if (OpenMP_C_FLAGS) set_target_properties (jt9 PROPERTIES COMPILE_FLAGS "${OpenMP_C_FLAGS}" LINK_FLAGS "${OpenMP_C_FLAGS}" ) endif () set_target_properties (jt9 PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp ) endif (APPLE) if (WIN32) set_target_properties (jt9 PROPERTIES LINK_FLAGS -Wl,--stack,16777216 ) endif () target_link_libraries (jt9 wsjt_fort_omp wsjt_cxx fort_qt) else (${OPENMP_FOUND} OR APPLE) target_link_libraries (jt9 wsjt_fort wsjt_cxx fort_qt) endif (${OPENMP_FOUND} OR APPLE) if (WIN32) # build map65 find_package (Portaudio REQUIRED) add_subdirectory (map65) endif () # build the main application generate_version_info (wsjtx_VERSION_RESOURCES NAME wsjtx BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} ) add_executable (wsjtx MACOSX_BUNDLE ${wsjtx_CXXSRCS} ${wsjtx_GENUISRCS} ${WSJTX_ICON_FILE} ${wsjtx_RESOURCES_RCC} ${wsjtx_VERSION_RESOURCES} ) if (WSJT_CREATE_WINMAIN) set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON) endif (WSJT_CREATE_WINMAIN) set_target_properties (wsjtx PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" MACOSX_BUNDLE_INFO_STRING "${PROJECT_DESCRIPTION}" MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} MACOSX_BUNDLE_SHORT_VERSION_STRING "v${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${SCS_VERSION_STR}" MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_BUNDLE_NAME}" MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx" ) target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) if ((NOT ${OPENMP_FOUND}) OR APPLE) target_link_libraries (wsjtx wsjt_fort) else () target_link_libraries (wsjtx wsjt_fort_omp) if (OpenMP_C_FLAGS) set_target_properties (wsjtx PROPERTIES COMPILE_FLAGS "${OpenMP_C_FLAGS}" LINK_FLAGS "${OpenMP_C_FLAGS}" ) endif () set_target_properties (wsjtx PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp ) if (WIN32) set_target_properties (wsjtx PROPERTIES LINK_FLAGS -Wl,--stack,0x1000000,--heap,0x20000000 ) endif () endif () target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) # make a library for WSJT-X UDP servers # add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) add_library (wsjtx_udp-static STATIC ${UDP_library_CXXSRCS}) #target_include_directories (wsjtx_udp # INTERFACE # $ # ) target_include_directories (wsjtx_udp-static INTERFACE $ ) #set_target_properties (wsjtx_udp PROPERTIES # PUBLIC_HEADER "${UDP_library_HEADERS}" # ) set_target_properties (wsjtx_udp-static PROPERTIES OUTPUT_NAME wsjtx_udp ) target_compile_definitions (wsjtx_udp-static PUBLIC UDP_STATIC_DEFINE) target_link_libraries (wsjtx_udp-static Qt5::Network Qt5::Gui) generate_export_header (wsjtx_udp-static BASE_NAME udp) generate_version_info (udp_daemon_VERSION_RESOURCES NAME udp_daemon BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol daemon" ) add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) target_link_libraries (udp_daemon wsjtx_udp-static) generate_version_info (wsjtx_app_version_VERSION_RESOURCES NAME wsjtx_app_version BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} FILE_DESCRIPTION "Display WSJT-X Application Version on console" ) add_executable (wsjtx_app_version AppVersion/AppVersion.cpp ${wsjtx_app_version_VERSION_RESOURCES}) target_link_libraries (wsjtx_app_version wsjt_qt) generate_version_info (message_aggregator_VERSION_RESOURCES NAME message_aggregator BUNDLE ${PROJECT_BUNDLE_NAME} ICON ${WSJTX_ICON_FILE} FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol application" ) add_resources (message_aggregator_RESOURCES /qss ${message_aggregator_STYLESHEETS}) configure_file (UDPExamples/message_aggregator.qrc.in message_aggregator.qrc @ONLY) qt5_add_resources (message_aggregator_RESOURCES_RCC ${CMAKE_CURRENT_BINARY_DIR}/message_aggregator.qrc contrib/QDarkStyleSheet/qdarkstyle/style.qrc ) add_executable (message_aggregator ${message_aggregator_CXXSRCS} ${message_aggregator_RESOURCES_RCC} ${message_aggregator_VERSION_RESOURCES} ) target_link_libraries (message_aggregator wsjt_qt Qt5::Widgets wsjtx_udp-static) if (WSJT_CREATE_WINMAIN) set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON) endif (WSJT_CREATE_WINMAIN) if (UNIX) if (NOT WSJT_SKIP_MANPAGES) add_subdirectory (manpages) add_dependencies (wsjtx manpages) endif (NOT WSJT_SKIP_MANPAGES) if (NOT APPLE) add_subdirectory (debian) add_dependencies (wsjtx debian) endif (NOT APPLE) endif (UNIX) # # installation # install (TARGETS wsjtx RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION . COMPONENT runtime ) # install (TARGETS wsjtx_udp EXPORT udp # 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 ${CMAKE_INSTALL_LIBDIR} # ) # install (EXPORT udp NAMESPACE wsjtx:: # DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx # ) # install (EXPORT udp-static NAMESPACE wsjtx:: # DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx # ) install (TARGETS udp_daemon message_aggregator wsjtx_app_version RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) install (TARGETS jt9 wsprd fmtave fcal fmeasure RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) if(WSJT_BUILD_UTILS) install (TARGETS ft8code jt65code jt9code jt4code msk144code q65code fst4sim q65sim RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) endif(WSJT_BUILD_UTILS) install (PROGRAMS ${RIGCTL_EXE} DESTINATION ${CMAKE_INSTALL_BINDIR} #COMPONENT runtime RENAME rigctl-wsjtx${CMAKE_EXECUTABLE_SUFFIX} ) install (PROGRAMS ${RIGCTLD_EXE} DESTINATION ${CMAKE_INSTALL_BINDIR} #COMPONENT runtime RENAME rigctld-wsjtx${CMAKE_EXECUTABLE_SUFFIX} ) install (PROGRAMS ${RIGCTLCOM_EXE} DESTINATION ${CMAKE_INSTALL_BINDIR} #COMPONENT runtime RENAME rigctlcom-wsjtx${CMAKE_EXECUTABLE_SUFFIX} ) install (FILES README COPYING AUTHORS THANKS NEWS BUGS DESTINATION ${CMAKE_INSTALL_DOCDIR} #COMPONENT runtime ) install (FILES cty.dat cty.dat_copyright.txt contrib/Ephemeris/JPLEPH DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} #COMPONENT runtime ) install (DIRECTORY example_log_configurations DESTINATION ${CMAKE_INSTALL_DOCDIR} FILES_MATCHING REGEX "^.*[^~]$" #COMPONENT runtime ) # # Mac installer files # if (APPLE) install (FILES Darwin/ReadMe.txt Darwin/com.wsjtx.sysctl.plist DESTINATION . #COMPONENT runtime ) endif (APPLE) # # uninstall support # configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" @ONLY) add_custom_target (uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") # creates or updates ${PROJECT_BINARY_DIR}/scs_version.h using cmake script add_custom_target (revisiontag COMMAND ${CMAKE_COMMAND} -D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -D OUTPUT_DIR=${PROJECT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake VERBATIM BYPRODUCTS scs_version.h COMMENT "Getting source control system revision information" ) # explicitly say that the wsjt_qt depends on custom target, this is # done indirectly so that the revisiontag target gets built exactly # once per build add_dependencies (wsjt_qt revisiontag) add_dependencies (jt9 revisiontag) add_dependencies (wsprd revisiontag) # # versioning and configuration # configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/wsjtx_config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h" ) if (NOT WIN32 AND NOT APPLE) # install a desktop file so wsjtx appears in the application start # menu with an icon install ( FILES wsjtx.desktop message_aggregator.desktop DESTINATION share/applications #COMPONENT runtime ) install ( FILES icons/Unix/wsjtx_icon.png DESTINATION share/pixmaps #COMPONENT runtime ) endif (NOT WIN32 AND NOT APPLE) if (APPLE) set (CMAKE_POSTFLIGHT_SCRIPT "${wsjtx_BINARY_DIR}/postflight.sh") set (CMAKE_POSTUPGRADE_SCRIPT "${wsjtx_BINARY_DIR}/postupgrade.sh") configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postflight.sh.in" "${CMAKE_POSTFLIGHT_SCRIPT}") configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postupgrade.sh.in" "${CMAKE_POSTUPGRADE_SCRIPT}") endif () # # bundle fixup only done in non-Debug configurations # if (NOT is_debug_build) # add this sub-sirectory after all install steps and other # sub-directories to ensure that all executables are in-place before # any fixup is done add_subdirectory (bundle_fixup) endif () # # packaging # set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/package_description.txt") set (CPACK_MONOLITHIC_INSTALL 1) set (CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set (CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") if (WIN32) set (CPACK_GENERATOR "NSIS") elseif (APPLE) set (CPACK_GENERATOR "DragNDrop") else () find_program (DPKG_BUILDER dpkg-buildpackage DOC "Debian package builder") if (DPKG_BUILDER) # # Derive the correct filename for a Debian package because the DEB # generator doesn't do this correctly at present. # find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") if (DPKG_PROGRAM) execute_process ( COMMAND ${DPKG_PROGRAM} --print-architecture OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE ) else (DPKG_PROGRAM) set (CPACK_DEBIAN_PACKAGE_ARCHITECTURE noarch) endif (DPKG_PROGRAM) list (APPEND CPACK_GENERATOR "DEB") endif (DPKG_BUILDER) find_program (RPMBUILDER rpmbuild DOC "RPM package builder") if (RPMBUILDER) list (APPEND CPACK_GENERATOR "RPM") endif (RPMBUILDER) endif () set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8.3) | libgfortran4 (>=7.3) | libgfortran3 (>=6.3), libfftw3-single3 (>=3.3), libgomp1 (>=6), libqt5serialport5 (>=5.7), libqt5multimedia5-plugins (>=5.7), libqt5widgets5 (>=5.7), libqt5network5 (>=5.7), libqt5printsupport5 (>=5.7), libqt5sql5-sqlite (>=5.7), libusb-1.0-0 (>=1.0.21), libboost-log1.62.0 (>=1.62.0) | libboost-log1.65.1 (>=1.65.1) | libboost-log1.67.0 (>=1.67.0) | libboost-log1.71.0 (>=1.71.0) | libboost-log1.74.0 (>=1.74.0)") set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 7, libgomp >= 7, fftw-libs-single >= 3.3, boost-log >= 1.62") set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake") include (CPack)