diff options
Diffstat (limited to 'cmake')
27 files changed, 1110 insertions, 723 deletions
diff --git a/cmake/FindEigen3.cmake b/cmake/FindEigen3.cmake deleted file mode 100644 index 2206ce43..00000000 --- a/cmake/FindEigen3.cmake +++ /dev/null @@ -1,84 +0,0 @@ -# - Try to find Eigen3 lib -# -# This module supports requiring a minimum version, e.g. you can do -# find_package(Eigen3 3.1.2) -# to require version 3.1.2 or newer of Eigen3. -# -# Once done this will define -# -# EIGEN3_FOUND - system has eigen lib with correct version -# EIGEN3_INCLUDE_DIR - the eigen include directory -# EIGEN3_VERSION - eigen version - -# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org> -# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr> -# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> -# Redistribution and use is allowed according to the terms of the 2-clause BSD license. - -if(NOT Eigen3_FIND_VERSION) - if(NOT Eigen3_FIND_VERSION_MAJOR) - set(Eigen3_FIND_VERSION_MAJOR 2) - endif(NOT Eigen3_FIND_VERSION_MAJOR) - if(NOT Eigen3_FIND_VERSION_MINOR) - set(Eigen3_FIND_VERSION_MINOR 91) - endif(NOT Eigen3_FIND_VERSION_MINOR) - if(NOT Eigen3_FIND_VERSION_PATCH) - set(Eigen3_FIND_VERSION_PATCH 0) - endif(NOT Eigen3_FIND_VERSION_PATCH) - - set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") -endif(NOT Eigen3_FIND_VERSION) - -macro(_eigen3_check_version) - file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) - - string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") - set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") - set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") - set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") - - set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) - if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK FALSE) - else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK TRUE) - endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - - if(NOT EIGEN3_VERSION_OK) - - message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " - "but at least version ${Eigen3_FIND_VERSION} is required") - endif(NOT EIGEN3_VERSION_OK) -endmacro(_eigen3_check_version) - -if (EIGEN3_INCLUDE_DIR) - - # in cache already - _eigen3_check_version() - set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) - -else (EIGEN3_INCLUDE_DIR) - - find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library - PATHS - ${CMAKE_INSTALL_PREFIX}/include - ${KDE4_INCLUDE_DIR} - PATH_SUFFIXES eigen3 eigen - ) - - if(EIGEN3_INCLUDE_DIR) - _eigen3_check_version() - endif(EIGEN3_INCLUDE_DIR) - - #include(FindPackageHandleStandardArgs) - #find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) - - mark_as_advanced(EIGEN3_INCLUDE_DIR) - -endif(EIGEN3_INCLUDE_DIR) - -if(EIGEN3_FOUND) - add_definitions(-DEIGEN_MPL2_ONLY) -endif() diff --git a/cmake/FindONNXRuntime.cmake b/cmake/FindONNXRuntime.cmake new file mode 100644 index 00000000..60ddfc2b --- /dev/null +++ b/cmake/FindONNXRuntime.cmake @@ -0,0 +1,104 @@ +# FindONNXRuntime +# =============== +# +# Find an ONNX Runtime installation. +# ONNX Runtime is a cross-platform inference and training machine-learning +# accelerator. +# +# Input variables +# --------------- +# +# ONNXRuntime_ROOT Set root installation. This is an environment +# variable +# ONNXRuntime_DIR CMake variable to set the installation root. +# +# Output variable +# --------------- +# +# ONNXRuntime_FOUND True if headers and requested libraries were found +# ONNXRuntime_LIBRARIES Component libraries to be linked. +# ONNXRuntime_INCLUDE_DIRS Include directories. + +set(ONNXRuntime_DIR CACHE PATH "Root directory of the ONNX Runtime installation") + +# This script is mostly inspired by the guide there: +# https://gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/How-To-Find-Libraries +# Finding of the DLLs was added so we can install them with the application. +# We adhere to modern CMake standards and also define an import library. + +# Determine architecture string for subdir in nuget package +# This is only relevant when we point `ONNXRuntime_DIR` to the +# extracted nuget package content. +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + if (CMAKE_SIZEOF_VOID_P GREATER_EQUAL 8) + set(ONNXRuntime_Arch "linux-x64") + else() + message(FATAL_ERROR "32 Bit Linux builds are not supported") + endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") + if (CMAKE_SIZEOF_VOID_P GREATER_EQUAL 8) + set(ONNXRuntime_Arch "win-x64") + else() + set(ONNXRuntime_Arch "win-x86") + endif() +endif() + + +find_library(ONNXRuntime_LIBRARY onnxruntime + HINTS ${ONNXRuntime_DIR} + PATH_SUFFIXES + # For a "normal" installation + "lib" "lib64" "bin" + # For the nuget package + "runtimes/${ONNXRuntime_Arch}/native" + ) + +if(WIN32) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dll" ".DLL") + find_library(ONNXRuntime_RUNTIME onnxruntime + HINTS ${ONNXRuntime_DIR} + PATH_SUFFIXES + # For a "normal" installation + "lib" "lib64" "bin" + # For the nuget package + "runtimes/${ONNXRuntime_Arch}/native" + ) +else() + SET(ONNXRuntime_RUNTIME ${ONNXRuntime_LIBRARY}) +endif() + +find_path(ONNXRuntime_INCLUDE_DIR onnxruntime_cxx_api.h + HINTS ${ONNXRuntime_DIR} + PATH_SUFFIXES + # For .nuget packages + "build/native/include" + # For when the directory structure of the onnx source repo is preserved + "include/onnxruntime/core/session" + "include/onnxruntime" + # For when we copy the files somewhere + "include" + ) + + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set ONNXRuntime_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(ONNXRuntime DEFAULT_MSG + ONNXRuntime_LIBRARY ONNXRuntime_INCLUDE_DIR ONNXRuntime_RUNTIME) + +if(ONNXRuntime_FOUND) + if(NOT TARGET onnxruntime::onnxruntime) + # Following this quide: + # https://cmake.org/cmake/help/git-stage/guide/importing-exporting/index.html#importing-libraries + add_library(onnxruntime::onnxruntime SHARED IMPORTED) + set_target_properties(onnxruntime::onnxruntime PROPERTIES + IMPORTED_LOCATION "${ONNXRuntime_RUNTIME}" + INTERFACE_INCLUDE_DIRECTORIES "${ONNXRuntime_INCLUDE_DIR}" + IMPORTED_IMPLIB "${ONNXRuntime_LIBRARY}") + endif() +endif() + +mark_as_advanced(ONNXRuntime_INCLUDE_DIR ONNXRuntime_LIBRARY ONNXRuntime_RUNTIME) + +set(ONNXRuntime_INCLUDE_DIRS ${ONNXRuntime_INCLUDE_DIR}) +set(ONNXRuntime_LIBRARIES ${ONNXRuntime_LIBRARY})
\ No newline at end of file diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake index e4ac79c0..0c016cc0 100644 --- a/cmake/GetGitRevisionDescription.cmake +++ b/cmake/GetGitRevisionDescription.cmake @@ -30,6 +30,8 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +include_guard(GLOBAL) + if(__get_git_revision_description) return() endif() diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in index 888ce13a..032dda66 100644 --- a/cmake/GetGitRevisionDescription.cmake.in +++ b/cmake/GetGitRevisionDescription.cmake.in @@ -13,6 +13,8 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +include_guard(GLOBAL) + set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) diff --git a/cmake/apple.cmake b/cmake/apple.cmake index 627ef3c1..64e4d628 100644 --- a/cmake/apple.cmake +++ b/cmake/apple.cmake @@ -1,12 +1,19 @@ set(CMAKE_BUILD_TYPE_INIT RELEASE) -set(CMAKE_CXX_FLAGS "-arch x86_64 -stdlib=libc++" CACHE STRING "" FORCE) -set(CMAKE_C_FLAGS "-arch x86_64" CACHE STRING "" FORCE) +if("$ENV{OTR_OSX_ARCH}" STREQUAL "arm64") + set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "" FORCE) + set(opentrack-intel FALSE) +else() + set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "" FORCE) + set(opentrack-intel TRUE) +endif() -set(CMAKE_C_FLAGS_RELEASE "-ffast-math -O3 -flto -fvisibility=hidden -g" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS "-stdlib=libc++" CACHE STRING "" FORCE) + +set(CMAKE_C_FLAGS_RELEASE "-ffast-math -O3 -flto -g" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS_RELEASE " ${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE) -set(cmake-link-common "-stdlib=libc++ -arch x86_64") +set(cmake-link-common "-stdlib=libc++") set(CMAKE_EXE_LINKER_FLAGS "${cmake-link-common} -Wl,-stack_size,0x4000000" CACHE STRING "" FORCE) set(CMAKE_SHARED_LINKER_FLAGS ${cmake-link-common} CACHE STRING "" FORCE) set(CMAKE_MODULE_LINKER_FLAGS ${cmake-link-common} CACHE STRING "" FORCE) diff --git a/cmake/linux.cmake b/cmake/linux.cmake index 945f7e77..5513f511 100644 --- a/cmake/linux.cmake +++ b/cmake/linux.cmake @@ -1,13 +1,13 @@ set(CMAKE_BUILD_TYPE_INIT RELEASE) -set(CMAKE_CXX_FLAGS "-fPIC" CACHE STRING "" FORCE) -set(CMAKE_C_FLAGS "-fPIC" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS "" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "" CACHE STRING "" FORCE) set(CMAKE_AR "gcc-ar" CACHE STRING "" FORCE) set(CMAKE_NM "gcc-nm" CACHE STRING "" FORCE) set(CMAKE_RANLIB "gcc-ranlib" CACHE STRING "" FORCE) -set(CMAKE_C_FLAGS_RELEASE "-ffast-math -O3 -flto -fuse-linker-plugin -fvisibility=hidden -fPIC" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS_RELEASE "-ffast-math -O3 -flto -fuse-linker-plugin -fPIC" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS_RELEASE " ${CMAKE_C_FLAGS_RELEASE} " CACHE STRING "" FORCE) set(cmake-link-common "") diff --git a/cmake/mingw-w64.cmake b/cmake/mingw-w64.cmake index 01bf9209..e8c0f062 100644 --- a/cmake/mingw-w64.cmake +++ b/cmake/mingw-w64.cmake @@ -3,38 +3,43 @@ # mkdir build && cd build && cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/../cmake/mingw-w64.cmake # -sh 20140922 -SET(CMAKE_SYSTEM_NAME Windows) -SET(CMAKE_SYSTEM_VERSION 1) +include("${CMAKE_CURRENT_LIST_DIR}/opentrack-policy.cmake" NO_POLICY_SCOPE) + +string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) -set(CMAKE_BUILD_TYPE_INIT RELEASE) -# for nmake/jom build directories -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RELEASE" CACHE STRING "" FORCE) +if(NOT CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE STRING "" FORCE) endif() -unset(c) -unset(e) -# specify the cross compiler +SET(CMAKE_SYSTEM_NAME Windows) +SET(CMAKE_SYSTEM_VERSION 5) +set(CMAKE_SYSROOT "/usr/i686-w64-mingw32") + +set(c "") + +## specify the cross compiler if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - set(p C:/msys64/mingw32/bin/) + #set(p D:/cygwin64/opt/bin/) + #set(p "/mingw32/bin/") + set(p "") set(e .exe) + set(c "${p}") +else() + set(p "") + set(c "i686-w64-mingw32-") + set(e "") endif() -#set(c ${p}i686-w64-mingw32-) -set(c "${p}") -#set(CMAKE_MAKE_PROGRAM ${p}/mingw32-make.exe CACHE FILEPATH "" FORCE) SET(CMAKE_C_COMPILER ${c}gcc${e}) SET(CMAKE_CXX_COMPILER ${c}g++${e}) set(CMAKE_RC_COMPILER ${c}windres${e}) set(CMAKE_LINKER ${c}ld${e}) -set(CMAKE_AR ${c}gcc-ar${e} CACHE STRING "" FORCE) -set(CMAKE_NM ${c}gcc-nm${e} CACHE STRING "" FORCE) -set(CMAKE_RANLIB ${c}gcc-ranlib${e} CACHE STRING "" FORCE) -set(CMAKE_OBJCOPY ${c}objcopy${e} CACHE STRING "" FORCE) -set(CMAKE_OBJDUMP ${c}objdump${e} CACHE STRING "" FORCE) -set(CMAKE_STRIP ${c}strip${e} CACHE STRING "" FORCE) - -#SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) +set(CMAKE_AR ${c}gcc-ar${e}) +set(CMAKE_NM ${c}gcc-nm${e}) +set(CMAKE_RANLIB ${c}gcc-ranlib${e}) +set(CMAKE_OBJCOPY ${c}objcopy${e}) +set(CMAKE_OBJDUMP ${c}objdump${e}) +set(CMAKE_STRIP ${c}strip${e}) # search for programs in the host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) @@ -43,32 +48,53 @@ SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # oldest CPU supported here is Northwood-based Pentium 4. -sh 20150811 -set(fpu "-ffast-math -mfpmath=both -mstackrealign -falign-functions=16 -falign-loops=16") -set(cpu "-O3 -march=pentium4 -mtune=skylake -msse -msse2 -mno-sse3 -mno-avx -frename-registers") -set(lto "-flto -fuse-linker-plugin -flto-compression-level=9 -flto-partition=balanced -fipa-pta -flto-odr-type-merging") -set(bloat "") +set(fpu "-ffast-math -mfpmath=sse -mstackrealign") +set(cpu "-O3 -msse3 -mtune=skylake") +#set(lto "-fno-lto -fno-use-linker-plugin -flto-compression-level=9 -flto-partition=balanced -fno-ipa-pta -fno-lto-odr-type-merging") +set(lto "") set(sections "-ffunction-sections -fdata-sections") -set(cc "-fdump-statistics-details -fdump-ipa-cgraph -floop-nest-optimize") +set(cc "") +#set(cc "-fdump-statistics-details -fdump-ipa-cgraph") + +set(noisy-warns "") +set(suggest-final "") +set(numerics "") +set(missing-override "") +if(WARNINGS_ENABLE) + if(WARNINGS_FINAL_SUGGESTIONS) + set(suggest-final "-Wsuggest-final-types") + endif() + if(WARNINGS_NUMERIC) + set(numerics "-Wdouble-promotion") + endif() + if(WARNINGS_MISSING_OVERRIDE) + set(missing-override "-Wsuggest-override") + endif() + set(noisy-warns "${suggest-final} ${numerics}") +endif() set(_CXX_WARNS "") set(_C_WARNS "") + if(WARNINGS_ENABLE) - set(usual-warns "-Wdelete-non-virtual-dtor -Wno-suggest-override -Wno-odr -Wno-attributes -Wcast-align") + set(usual-warns "-Wstrict-aliasing=3 -Wstrict-overflow=4 -Wdelete-non-virtual-dtor -Wno-odr -Wattributes") set(_C_WARNS "-Wall -Wextra -Wpedantic -Wcast-align") - set(_CXX_WARNS "${_C_WARNS} ${usual-warns} ${clang-warns} ${noisy-warns} ${missing-override}") + set(_CXX_WARNS "${_C_WARNS} ${usual-warns} ${noisy-warns} ${missing-override}") endif() -set(ccflags-common "-fvisibility=hidden -pipe") -set(_CXXFLAGS "${bloat} ${ccflags-common} ${_CXX_WARNS}") +set(ccflags-common "-pipe -g3") +set(_CXXFLAGS "${ccflags-common} ${_CXX_WARNS}") set(_CFLAGS "${ccflags-common} -std=c11 ${_C_WARNS}") -set(_CFLAGS_RELEASE "-s ${cpu} ${fpu} ${lto} ${sections} ${cc}") +set(_CFLAGS_RELEASE "${cpu} ${fpu} ${lto} ${sections} ${cc}") set(_CFLAGS_DEBUG "-g -O0 -fstack-protector-strong") -set(_CXXFLAGS_RELEASE "${_CFLAGS_RELEASE} -std=c++14 ${cc}") +set(_CXXFLAGS_RELEASE "${_CFLAGS_RELEASE} ${cc}") set(_CXXFLAGS_DEBUG "${_CFLAGS_DEBUG}") -set(_LDFLAGS "-Wl,--dynamicbase,--no-seh,--nxcompat,--as-needed,--pic-executable") -set(_LDFLAGS_RELEASE "-Wl,--gc-sections,--exclude-libs,ALL -ffunction-sections") +add_definitions(-DSTRSAFE_NO_DEPRECATE) + +#set(_LDFLAGS "-Wl,--dynamicbase,--nxcompat,--as-needed -Wl,--gc-sections,--exclude-libs,ALL") +set(_LDFLAGS_RELEASE "") set(_LDFLAGS_DEBUG "") set(enable-val FALSE) @@ -82,36 +108,14 @@ set(WARNINGS_FINAL_SUGGESTIONS FALSE CACHE BOOL "Emit very noisy warnings at com set(WARNINGS_NUMERIC ${enable-val} CACHE BOOL "Emit very noisy warnings at compile-time") set(WARNINGS_MISSING_OVERRIDE FALSE CACHE BOOL "Emit very noisy warnings at compile-time") -set(noisy-warns "") -set(suggest-final "") -set(numerics "") -set(missing-override "") -if(WARNINGS_ENABLE) - if(WARNINGS_FINAL_SUGGESTIONS) - set(suggest-final "-Wsuggest-final-types -Wsuggest-final-methods") - endif() - if(WARNINGS_NUMERIC) - set(numerics "-Wdouble-promotion -Wsign-compare") - endif() - if(WARNINGS_MISSING_OVERRIDE) - set(missing-override "-Wsuggest-override") - endif() - set(noisy-warns "${suggest-final} ${numerics}") -endif() - -set(clang-warns "") -if(CMAKE_COMPILER_IS_CLANG) - set(clang-warns "-Wweak-vtables") -endif() - foreach(j C CXX) foreach(i "" _DEBUG _RELEASE) - set(CMAKE_${j}_FLAGS${i} "${_${j}FLAGS${i}} ${CMAKE_${j}_FLAGS${j}}") + set(CMAKE_${j}_FLAGS${i} "${CMAKE_${j}_FLAGS${j}}") endforeach() endforeach() -foreach(j "" _DEBUG _RELEASE) - foreach(i MODULE EXE SHARED) - set(CMAKE_${i}_LINKER_FLAGS${j} "${_LDFLAGS${j}} ${CMAKE_${i}_LINKER_FLAGS${j}}") - endforeach() -endforeach() +#foreach(j "" _DEBUG _RELEASE) +# foreach(i MODULE EXE SHARED) +# set(CMAKE_${i}_LINKER_FLAGS${j} "${_LDFLAGS${j}} ${CMAKE_${i}_LINKER_FLAGS${j}}") +# endforeach() +#endforeach() diff --git a/cmake/opentrack-clean-build-directory.cmake b/cmake/mrproper.cmake index c0934af1..1e8713ef 100644 --- a/cmake/opentrack-clean-build-directory.cmake +++ b/cmake/mrproper.cmake @@ -1,4 +1,4 @@ -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
-include(opentrack-build)
-
-cleanup_build_dir()
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") +include(opentrack-mrproper) + +cleanup_build_dir() diff --git a/cmake/msvc.cmake b/cmake/msvc.cmake index 823bfffe..b390c120 100644 --- a/cmake/msvc.cmake +++ b/cmake/msvc.cmake @@ -3,7 +3,24 @@ # mkdir build && cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/../cmake/msvc.cmake build/ SET(CMAKE_SYSTEM_NAME Windows) -SET(CMAKE_SYSTEM_VERSION 1) +SET(CMAKE_SYSTEM_VERSION 5.01) +if(opentrack-64bit) + set(CMAKE_SYSTEM_PROCESSOR AMD64) +else() + set(CMAKE_SYSTEM_PROCESSOR x86) +endif() + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR CMAKE_INSTALL_PREFIX STREQUAL "") + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "" FORCE) +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/opentrack-policy.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/opentrack-policy.cmake" NO_POLICY_SCOPE) +endif() + +#set(CMAKE_GENERATOR Ninja) +#set(CMAKE_MAKE_PROGRAM ninja.exe) +set(CMAKE_ASM_NASM_COMPILER nasm.exe) # search for programs in the host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) @@ -11,92 +28,178 @@ SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -# oldest CPU supported here is Northwood-based Pentium 4. -sh 20150811 -set(cc "/O2it /Ob2 /arch:SSE2 /fp:fast /GS- /GF /GL /Gw /Gy") -set(warns_ "") +#add_definitions(-D_ITERATOR_DEBUG_LEVEL=0) +#add_compile_options(-Qvec-report:2) +#add_compile_options(-d2cgsummary) +add_definitions(-D_HAS_EXCEPTIONS=0) -#C4244: 'return': conversion from '__int64' to 'long', possible loss of data -set(warns-disable 4530 4577 4789 4244) +if(DEFINED CMAKE_TOOLCHAIN_FILE) + # ignore cmake warning: Manually-specified variable not used by the project + set(CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}") +endif() -foreach(i ${warns-disable}) - set(warns_ "${warns_} /wd${i}") -endforeach() +include("${CMAKE_CURRENT_LIST_DIR}/opentrack-policy.cmake" NO_POLICY_SCOPE) +set(CMAKE_POLICY_DEFAULT_CMP0069 NEW CACHE INTERNAL "" FORCE) +#set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) + +set(CMAKE_C_EXTENSIONS FALSE) +set(CMAKE_CXX_EXTENSIONS FALSE) + +set(CMAKE_CROSSCOMPILING 0) + +function(sets type) + set(i 0) + list(LENGTH ARGN max) + math(EXPR foo "${max} % 2") + if(NOT foo EQUAL 0) + message(FATAL_ERROR "argument count not even") + endif() + while(i LESS max) + list(GET ARGN "${i}" name) + math(EXPR i "${i} + 1") + list(GET ARGN "${i}" value) + math(EXPR i "${i} + 1") + set(${name} "${value}" CACHE "${type}" "" FORCE) + endwhile() +endfunction() if(CMAKE_PROJECT_NAME STREQUAL "opentrack") - #C4263 - member function does not override any base class virtual member function - #C4264 - no override available for virtual member function from base class, function is hidden - #C4265 - class has virtual functions, but destructor is not virtual - #C4266 - no override available for virtual member function from base type, function is hidden + #include("${CMAKE_CURRENT_LIST_DIR}/opentrack-policy.cmake" NO_POLICY_SCOPE) - #C4928 - illegal copy-initialization, more than one user-defined conversion has been implicitly applied + add_compile_options("-W4") - set(warns 4263 4264 4266 4928) - set(warns-noerr 4265) + # C4265: class has virtual functions, but destructor is not virtual + # C4005: macro redefinition + set(warns-error 4265 4005) - foreach(i ${warns}) - set(warns_ "${warns_} /w1${i} /we${i}") + foreach(i ${warns-error}) + add_compile_options(-w1${i} -we${i}) endforeach() +endif() - foreach(i ${warns-noerr}) - set(warns_ "${warns_} /w1${i}") - endforeach() - set(cc "${cc} /GR-") +if(CMAKE_PROJECT_NAME STREQUAL "QtBase") + set(QT_BUILD_TOOLS_WHEN_CROSSCOMPILING TRUE CACHE BOOL "" FORCE) + set(QT_DEBUG_OPTIMIZATION_FLAGS TRUE CACHE BOOL "" FORCE) + set(QT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS TRUE CACHE BOOL "" FORCE) + + set(FEATURE_debug OFF) + set(FEATURE_debug_and_release OFF) + set(FEATURE_force_debug_info ON) + set(FEATURE_ltcg ON) + set(FEATURE_shared ON) +endif() + +if(CMAKE_PROJECT_NAME STREQUAL "OpenCV") + set(PARALLEL_ENABLE_PLUGINS FALSE) + set(HIGHGUI_ENABLE_PLUGINS FALSE) + set(VIDEOIO_ENABLE_PLUGINS FALSE) + + set(OPENCV_SKIP_MSVC_EXCEPTIONS_FLAG TRUE) + set(OPENCV_DISABLE_THREAD_SUPPORT TRUE) + + set(ENABLE_FAST_MATH ON) + set(BUILD_TESTS OFF) + set(BUILD_PERF_TESTS OFF) + set(BUILD_opencv_apps OFF) + set(BUILD_opencv_gapi OFF) endif() -set(silly "${warns_} /MT /Zi /Gm") +if(CMAKE_PROJECT_NAME STREQUAL "TestOscpack") + add_compile_definitions(OSC_HOST_LITTLE_ENDIAN) +endif() + +set(opentrack-simd "SSE2") + +if(CMAKE_PROJECT_NAME STREQUAL "onnxruntime") + sets(BOOL + ONNX_USE_MSVC_STATIC_RUNTIME OFF + protobuf_MSVC_STATIC_RUNTIME OFF + onnxruntime_USE_AVX OFF + onnxruntime_USE_AVX2 OFF + onnxruntime_USE_AVX512 OFF + onnxruntime_BUILD_BENCHMARKS OFF + onnxruntime_BUILD_FOR_NATIVE_MACHINE OFF + onnxruntime_BUILD_SHARED_LIB ON + onnxruntime_BUILD_UNIT_TESTS OFF + protobuf_BUILD_EXAMPLES OFF + protobuf_BUILD_SHARED_LIBS OFF + ONNX_BUILD_BENCHMARKS OFF + ONNX_BUILD_TESTS OFF + ONNX_DISABLE_EXCEPTIONS OFF # important! + ONNX_GEN_PB_TYPE_STUBS OFF + onnxruntime_DISABLE_CONTRIB_OPS ON + BUILD_TESTING OFF + ) + if(opentrack-64bit) + sets(BOOL + onnxruntime_USE_AVX ON + ) + endif() +endif() + +if(opentrack-64bit) + set(opentrack-simd "AVX") +endif() -set(_CFLAGS "${silly}") -set(_CXXFLAGS "${silly}") -set(_CFLAGS_RELEASE "${cc}") -set(_CFLAGS_DEBUG "/GS /sdl /Gs /guard:cf") -set(_CXXFLAGS_RELEASE "${cc}") +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") +add_compile_options(-MD) + +add_link_options(-cgthreads:1) + +set(_CFLAGS "-diagnostics:caret -Zc:inline -Zc:preprocessor -wd4117 -Zi -Zf -Zo -bigobj -cgthreads1 -vd0 -permissive-") +#if(NOT opentrack-no-static-crt) +# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded" CACHE INTERNAL "" FORCE) +#else() +# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL" CACHE INTERNAL "" FORCE) +#endif() +set(_CXXFLAGS "${_CFLAGS} -Zc:throwingNew -Zc:lambda") +set(_CFLAGS_RELEASE "-O2 -Oit -Oy- -Ob3 -fp:fast -GS- -GF -GL -Gw -Gy") +if(NOT opentrack-simd STREQUAL "") + set(_CFLAGS_RELEASE "${_CFLAGS_RELEASE} -arch:${opentrack-simd}") +endif() +set(_CFLAGS_DEBUG "-guard:cf -MTd -Gs0 -RTCs") +set(_CXXFLAGS_RELEASE "${_CFLAGS_RELEASE}") set(_CXXFLAGS_DEBUG "${_CFLAGS_DEBUG}") -set(_LDFLAGS "/WX /DEBUG") -set(_LDFLAGS_RELEASE "/LTCG:INCREMENTAL /OPT:REF /OPT:ICF=10") -set(_LDFLAGS_DEBUG "") +set(_LDFLAGS "-WX") +set(_LDFLAGS_RELEASE "-OPT:REF,ICF=10 -LTCG -DEBUG:FULL") +set(_LDFLAGS_DEBUG "-DEBUG:FULL") -set(_LDFLAGS_STATIC "/WX") -set(_LDFLAGS_STATIC_RELEASE "/LTCG:INCREMENTAL") +set(_LDFLAGS_STATIC "-WX") +set(_LDFLAGS_STATIC_RELEASE "-LTCG") set(_LDFLAGS_STATIC_DEBUG "") -foreach(j C CXX) - foreach(i "" _DEBUG _RELEASE) - set(OVERRIDE_${j}_FLAGS${i} "" CACHE STRING "") - set(CMAKE_${j}_FLAGS${i} "${_${j}FLAGS${i}} ${OVERRIDE_${j}_FLAGS${i}}" CACHE STRING "" FORCE) - endforeach() - set(CMAKE_${j}_FLAGS "${_${j}FLAGS} ${_${j}_WARNS} ${OVERRIDE_${j}_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_BUILD_TYPE_INIT "RELEASE" CACHE INTERNAL "") + +string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) +set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "" FORCE) +if (NOT CMAKE_BUILD_TYPE STREQUAL "RELEASE" AND NOT CMAKE_BUILD_TYPE STREQUAL "DEBUG") + set(CMAKE_BUILD_TYPE "RELEASE" CACHE STRING "" FORCE) +endif() +set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS RELEASE DEBUG) + +foreach(k "" "_${CMAKE_BUILD_TYPE}") + set("FLAGS_CXX${k}" "" CACHE STRING "More CMAKE_CXX_FLAGS${k}") + #set("FLAGS_C${k}" "" CACHE STRING "More CMAKE_C_FLAGS${k} (almost never used)") + set("FLAGS_LD${k}" "" CACHE STRING "More CMAKE_(SHARED|EXE|MODULE)_LINKER_FLAGS${k}") + set("FLAGS_ARCHIVE${k}" "" CACHE STRING "More CMAKE_STATIC_LINKER_FLAGS${k}") endforeach() +foreach(k "" _DEBUG _RELEASE) + #set(CMAKE_STATIC_LINKER_FLAGS${k} "${CMAKE_STATIC_LINKER_FLAGS${k}} ${_LDFLAGS_STATIC${k}}") + set(CMAKE_STATIC_LINKER_FLAGS${k} "${_LDFLAGS_STATIC${k}} ${FLAGS_ARCHIVE${k}}" CACHE STRING "" FORCE) +endforeach() foreach(j "" _DEBUG _RELEASE) foreach(i MODULE EXE SHARED) - set(OVERRIDE_LDFLAGS${j} "" CACHE STRING "") - set(CMAKE_${i}_LINKER_FLAGS${j} "${_LDFLAGS${j}} ${OVERRIDE_LDFLAGS${j}}" CACHE STRING "" FORCE) + #set(CMAKE_${i}_LINKER_FLAGS${j} "${CMAKE_${i}_LINKER_FLAGS${j}} ${_LDFLAGS${j}}") + set(CMAKE_${i}_LINKER_FLAGS${j} "${_LDFLAGS${j}} ${FLAGS_LD${j}}" CACHE STRING "" FORCE) endforeach() endforeach() -set(OVERRIDE_LDFLAGS_STATIC "" CACHE STRING "") -set(OVERRIDE_LDFLAGS_STATIC_RELEASE "" CACHE STRING "") -set(OVERRIDE_LDFLAGS_STATIC_DEBUG "" CACHE STRING "") - -set(CMAKE_STATIC_LINKER_FLAGS "${_LDFLAGS_STATIC} ${OVERRIDE_LDFLAGS_STATIC}" CACHE STRING "" FORCE) -set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${_LDFLAGS_STATIC_RELEASE} ${OVERRIDE_LDFLAGS_STATIC_RELEASE}" CACHE STRING "" FORCE) -set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${_LDFLAGS_STATIC_DEBUG} ${OVERRIDE_LDFLAGS_STATIC_DEBUG}" CACHE STRING "" FORCE) - -set(CMAKE_BUILD_TYPE_INIT RELEASE) -# for nmake/jom build directories -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RELEASE" CACHE STRING "" FORCE) -endif() - -if(CMAKE_PROJECT_NAME STREQUAL "opentrack") - foreach (i CMAKE_CXX_FLAGS CMAKE_C_FLAGS) - string(REGEX MATCH "((^| )[-/][W][0-9]( |\$))" ret "${${i}}") - if(ret STREQUAL "") - set(${i} "-W3 ${${i}}" CACHE STRING "" FORCE) - endif() +foreach(j C CXX) + foreach(i "" _DEBUG _RELEASE) + #set(CMAKE_${j}_FLAGS${i} "${CMAKE_${j}_FLAGS${i}} ${_${j}FLAGS${i}}") + set(CMAKE_${j}_FLAGS${i} "${_${j}FLAGS${i}} ${FLAGS_${j}${i}}" CACHE STRING "" FORCE) endforeach() -endif() - -set(CMAKE_RC_FLAGS "-nologo -DWIN32" CACHE STRING "" FORCE) +endforeach() diff --git a/cmake/opentrack-boilerplate.cmake b/cmake/opentrack-boilerplate.cmake index 11e5c71d..e325cd6a 100644 --- a/cmake/opentrack-boilerplate.cmake +++ b/cmake/opentrack-boilerplate.cmake @@ -1,160 +1,187 @@ -set(opentrack-perms PERMISSIONS WORLD_READ WORLD_EXECUTE OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE) +include_guard(GLOBAL) -set(new-hier-path "#pragma once -#ifndef OPENTRACK_NO_QT_PATH +set(opentrack-perms-file WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) +set(opentrack-perms-dir WORLD_READ WORLD_EXECUTE OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE) +set(opentrack-perms-exec "${opentrack-perms-dir}") -# include <QCoreApplication> -# include <QString> +set(new-hier-path "#pragma once +#ifdef QT_CORE_LIB +# include \"compat/base-path.hpp\" +#endif -# define OPENTRACK_BASE_PATH (([]() -> const QString& { \\ - const static QString const__path___ = QCoreApplication::applicationDirPath(); \\ - return const__path___; \\ - })()) +#if defined __APPLE__ +# define OPENTRACK_LIBRARY_EXTENSION \"dylib\" +#elif defined _WIN32 +# define OPENTRACK_LIBRARY_EXTENSION \"dll\" +#else +# define OPENTRACK_LIBRARY_EXTENSION \"so\" #endif -#define OPENTRACK_LIBRARY_PATH \"${opentrack-hier-path}\" -#define OPENTRACK_DOC_PATH \"${opentrack-hier-doc}\" -#define OPENTRACK_CONTRIB_PATH \"${opentrack-hier-doc}contrib/\" -#define OPENTRACK_I18N_PATH \"${opentrack-i18n-path}\" + +#define OPENTRACK_LIBRARY_PREFIX \"\" +#define OPENTRACK_LIBRARY_PATH \"${opentrack-runtime-libexec}\" +#define OPENTRACK_DOC_PATH \"${opentrack-runtime-doc}\" +#define OPENTRACK_CONTRIB_PATH \"${opentrack-runtime-doc}contrib/\" +#define OPENTRACK_I18N_PATH \"${opentrack-runtime-i18n}\" ") -set(hier-path-filename "${CMAKE_BINARY_DIR}/opentrack-library-path.h") -set(orig-hier-path "") -if(EXISTS "${hier-path-filename}") - file(READ ${hier-path-filename} orig-hier-path) -endif() -if(NOT (orig-hier-path STREQUAL new-hier-path)) - file(WRITE "${hier-path-filename}" "${new-hier-path}") -endif() +function(otr_write_library_paths) + set(hier-path-filename "${CMAKE_BINARY_DIR}/opentrack-library-path.hxx") + set(orig-hier-path "") + if(EXISTS "${hier-path-filename}") + file(READ ${hier-path-filename} orig-hier-path) + endif() + if(NOT (orig-hier-path STREQUAL new-hier-path)) + file(WRITE "${hier-path-filename}" "${new-hier-path}") + endif() +endfunction() + +otr_write_library_paths() function(otr_glob_sources var) - set(dir "${CMAKE_CURRENT_SOURCE_DIR}") - file(GLOB ${var}-cc ${dir}/*.cpp ${dir}/*.c) - file(GLOB ${var}-hh ${dir}/*.h ${dir}/*.hpp) - file(GLOB ${var}-res ${dir}/*.rc) - foreach(f ${var}-res) - set_source_files_properties(${f} PROPERTIES LANGUAGE RC) + set(basedir "${CMAKE_CURRENT_SOURCE_DIR}") + foreach(i ui rc res cc cxx hh all) + set(${var}-${i} "") endforeach() - file(GLOB ${var}-ui ${dir}/*.ui) - file(GLOB ${var}-rc ${dir}/*.qrc) - set(${var}-all ${${var}-cc} ${${var}-hh} ${${var}-rc} ${${var}-res}) - foreach(i ui rc res cc hh all) - set(${var}-${i} "${${var}-${i}}" PARENT_SCOPE) - endforeach() -endfunction() - -function(otr_qt n) - if(".${${n}-hh}" STREQUAL ".") - message(FATAL_ERROR "project ${n} not globbed") - endif() - qt5_wrap_cpp(${n}-moc ${${n}-hh} OPTIONS --no-notes) - qt5_wrap_ui(${n}-uih ${${n}-ui}) - qt5_add_resources(${n}-rcc ${${n}-rc}) - foreach(i moc uih rcc) - set(${n}-${i} "${${n}-${i}}" PARENT_SCOPE) - list(APPEND ${n}-all ${${n}-${i}}) + foreach(dir ${ARGN}) + set(dir "${basedir}/${dir}") + file(GLOB cxx CONFIGURE_DEPENDS "${dir}/*.cpp") + file(GLOB cc CONFIGURE_DEPENDS "${dir}/*.c") + file(GLOB hh CONFIGURE_DEPENDS "${dir}/*.h" "${dir}/*.hpp" "${dir}/*.inc") + file(GLOB res CONFIGURE_DEPENDS "${dir}/*.rc") + foreach(f res) + set_source_files_properties(${f} PROPERTIES LANGUAGE RC) + endforeach() + file(GLOB ui CONFIGURE_DEPENDS "${dir}/*.ui") + file(GLOB rc CONFIGURE_DEPENDS "${dir}/*.qrc") + set(all ${cc} ${cxx} ${hh} ${res}) + foreach(i ui rc res cc cxx hh all) + set(${var}-${i} "${${var}-${i}}" ${${i}} PARENT_SCOPE) + endforeach() endforeach() - set(${n}-all "${${n}-all}" PARENT_SCOPE) endfunction() function(otr_fixup_subsystem n) if(MSVC) - if(SDK_CONSOLE_DEBUG) - set(subsystem CONSOLE) - else() - set(subsystem WINDOWS) - endif() - set(loc "$<TARGET_FILE:${n}>") + otr_find_msvc_editbin(editbin-pathname) + set(subsystem WINDOWS) get_property(type TARGET "${n}" PROPERTY TYPE) if (NOT type STREQUAL "STATIC_LIBRARY") + set(loc "$<TARGET_FILE:${n}>") add_custom_command(TARGET "${n}" POST_BUILD - COMMAND editbin -nologo -SUBSYSTEM:${subsystem},5.01 -OSVERSION:5.1 \"${loc}\") + COMMAND "${editbin-pathname}" -nologo -SUBSYSTEM:${subsystem},5.01 -OSVERSION:5.1 \"${loc}\") endif() endif() endfunction() function(otr_compat target) if(NOT MSVC) - set_property(SOURCE ${${target}-moc} APPEND_STRING PROPERTY COMPILE_FLAGS "-w -Wno-error") + set_property(SOURCE ${${target}-moc} APPEND PROPERTY COMPILE_OPTIONS "-w;-Wno-error") endif() - if(WIN32) - target_link_libraries(${target} dinput8 dxguid strmiids) + + if(UNIX) # no-op on OSX + target_link_libraries(${target} m) + endif() + + get_property(type TARGET "${n}" PROPERTY TYPE) + if (type STREQUAL "EXECUTABLE") + otr_fixup_subsystem(${target}) endif() - otr_fixup_subsystem(${target}) endfunction() -include(CMakeParseArguments) +function(otr_is_sln_generator var) + string(FIND "${CMAKE_GENERATOR}" "Visual Studio " is-msvc) + if(is-msvc EQUAL 0) + set(${var} TRUE PARENT_SCOPE) + else() + set(${var} FALSE PARENT_SCOPE) + endif() +endfunction() -function(otr_is_target_c_only ret srcs) - set(val TRUE) - foreach(i ${srcs}) - get_filename_component(ext "${i}" EXT) - string(TOLOWER "${ext}" ext) - if(ext STREQUAL ".cpp") - set(val FALSE) - break() - endif() - endforeach() - set(${ret} "${val}" PARENT_SCOPE) +function(otr_find_msvc_editbin varname) + if(MSVC) + get_filename_component(linker-dir "${CMAKE_LINKER}" DIRECTORY) + set("${varname}" "${linker-dir}/editbin.exe" PARENT_SCOPE) + else() + set("${varname}" "editbin" PARENT_SCOPE) + endif() endfunction() -function(otr_install_pdb_current_project) - if(MSVC AND FALSE) - file(GLOB_RECURSE pdbs "${CMAKE_CURRENT_BINARY_DIR}/*.pdb") - install(FILES ${pdbs} DESTINATION "${subdir}" ${opentrack-perms}) +function(otr_install_pdb_current_project target) + if(MSVC) + install(FILES "$<TARGET_PDB_FILE:${target}>" DESTINATION "${opentrack-debug}" PERMISSIONS ${opentrack-perms-file}) endif() endfunction() -function(otr_module n) - message(STATUS "module ${n}") +function(otr_module n_) + message(STATUS "module ${n_}") cmake_parse_arguments(arg - "STATIC;NO-COMPAT;BIN;EXECUTABLE;NO-QT;WIN32-CONSOLE;NO-INSTALL" + "STATIC;NO-COMPAT;BIN;EXECUTABLE;NO-QT;NO-I18N;WIN32-CONSOLE;NO-INSTALL;RELINK" "LINK;COMPILE" - "SOURCES" + "SOURCES;SUBDIRS" ${ARGN} - ) + ) + if(NOT "${arg_UNPARSED_ARGUMENTS}" STREQUAL "") - message(FATAL_ERROR "otr_module bad formals: ${arg_UNPARSED_ARGUMENTS}") + message(FATAL_ERROR "otr_module(${n_}) bad formals: ${arg_UNPARSED_ARGUMENTS}") endif() - set(n_orig "${n}") - set(n "opentrack-${n}") + set(n "opentrack-${n_}") - otr_glob_sources(${n}) - otr_is_target_c_only(is-c-only "${${n}-all}") - if(NOT (is-c-only OR arg_NO-QT)) - otr_qt(${n}) + if(NOT arg_SUBDIRS) + otr_glob_sources(${n} .) else() - set(arg_NO-QT TRUE) + otr_glob_sources(${n} . ${arg_SUBDIRS}) endif() - list(APPEND ${n}-all ${arg_SOURCES}) - if(arg_NO-QT) - set(arg_NO-COMPAT TRUE) - endif() - - string(TOUPPER arg_WIN32-CONSOLE "${arg_WIN32-CONSOLE}") + list(APPEND ${n}-all ${arg_SOURCES}) - if(NOT WIN32) - set(subsys "") - elseif(MSVC) - set(subsys "WIN32") - elseif(arg_WIN32-CONSOLE) - set(subsys "") + if(NOT arg_NO-QT) + otr_qt(${n}) else() - set(subsys "WIN32") + set(arg_NO-COMPAT TRUE) + set(arg_NO-I18N TRUE) endif() if(arg_EXECUTABLE) + if (APPLE) + set(subsys "MACOSX_BUNDLE") + elseif(NOT WIN32) + set(subsys "") + elseif(arg_WIN32-CONSOLE) + set(subsys "") + else() + set(subsys "WIN32") + endif() + add_executable(${n} ${subsys} "${${n}-all}") + set_target_properties(${n} PROPERTIES + SUFFIX "${opentrack-binary-suffix}" + OUTPUT_NAME "${n_}" + PREFIX "") + if(MSVC) + target_compile_options(${n} PRIVATE -GA) + endif() else() set(link-mode SHARED) if (arg_STATIC) set(link-mode STATIC) endif() add_library(${n} ${link-mode} "${${n}-all}") + set_property(TARGET "${n}" PROPERTY PREFIX "") + endif() + + if(NOT arg_NO-QT) + otr_qt2("${n}") + endif() + + set(self "${n}" PARENT_SCOPE) + + if(NOT arg_RELINK AND FALSE) + set_property(TARGET ${n} PROPERTY LINK_DEPENDS_NO_SHARED TRUE) + else() + set_property(TARGET ${n} PROPERTY LINK_DEPENDS_NO_SHARED FALSE) endif() - set_property(TARGET ${n} PROPERTY PREFIX "") if(NOT arg_NO-QT) target_link_libraries(${n} ${MY_QT_LIBS}) @@ -164,60 +191,111 @@ function(otr_module n) target_link_libraries(${n} opentrack-api opentrack-options opentrack-compat) endif() + string(REPLACE "-" "_" build-n ${n_}) + string(TOUPPER "${build-n}" build-n) + target_compile_definitions(${n} PRIVATE "BUILD_${build-n}") + include(opentrack-org) + + if(arg_STATIC) + set(arg_NO-INSTALL TRUE) + endif() + otr_compat(${n}) - if(CMAKE_COMPILER_IS_GNUCXX) - set(c-props "-fvisibility=hidden") - if(NOT is-c-only) - set(c-props "${c-props} -fuse-cxa-atexit") + if(CMAKE_COMPILER_IS_CLANGXX AND (arg_EXECUTABLE OR NOT arg_BIN)) + set(opts + weak-vtables + header-hygiene + ) + foreach(k ${opts}) + target_compile_options(${n} PRIVATE "-Wno-${k}") + endforeach() + endif() + + if(NOT arg_NO-INSTALL) + # Librarys/executable + if(arg_BIN) + if (APPLE) + install(TARGETS "${n}" + RUNTIME DESTINATION "${opentrack-bin}" + BUNDLE DESTINATION "${opentrack-bin}" + LIBRARY DESTINATION "${opentrack-bin}/Library" + RESOURCE DESTINATION "${opentrack-bin}/opentrack.app/Resource" + PERMISSIONS ${opentrack-perms-exec}) + else() + install(TARGETS "${n}" + RUNTIME DESTINATION "${opentrack-bin}" + LIBRARY DESTINATION "${opentrack-libexec}" + PERMISSIONS ${opentrack-perms-exec}) + endif() + else() + # Plugins + install(TARGETS "${n}" + RUNTIME DESTINATION "${opentrack-libexec}" + LIBRARY DESTINATION "${opentrack-libexec}" + PERMISSIONS ${opentrack-perms-exec}) + endif() + + if(MSVC) + set(opentrack_install-debug-info FALSE CACHE BOOL "Whether to build and install debug info at install time") + if(opentrack_install-debug-info) + otr_install_pdb_current_project(${n}) + endif() endif() endif() - if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE) - set(l-props "-Wl,--as-needed") + if(NOT arg_NO-I18N) + otr_i18n_for_target_directory(${n_}) endif() - set_property(TARGET ${n} APPEND_STRING PROPERTY COMPILE_FLAGS "${c-props} ${arg_COMPILE}") - set_property(TARGET ${n} APPEND_STRING PROPERTY LINK_FLAGS "${l-props} ${arg_LINK}") + set_property(GLOBAL APPEND PROPERTY opentrack-all-modules "${n_}") + set_property(GLOBAL APPEND PROPERTY opentrack-all-source-dirs "${CMAKE_CURRENT_SOURCE_DIR}") - if(NOT arg_STATIC) - string(REGEX REPLACE "^opentrack-" "" n_ "${n}") - string(REPLACE "-" "_" n_ ${n_}) - string(TOUPPER "${n_}" n__) - target_compile_definitions(${n} PRIVATE "BUILD_${n__}") + #make_directory("${CMAKE_CURRENT_BINARY_DIR}") +endfunction() - if(NOT arg_NO-INSTALL) - if(arg_BIN AND WIN32) - set(subdir ".") - install(TARGETS "${n}" RUNTIME DESTINATION . ${opentrack-perms}) - else() - set(subdir "${opentrack-hier-pfx}") - install(TARGETS "${n}" ${opentrack-hier-str} ${opentrack-perms}) - endif() - otr_install_pdb_current_project() - endif() - else() - target_compile_definitions(${n} PRIVATE "STATIC_LIBRARY=1") - endif() - - set_property(GLOBAL APPEND PROPERTY opentrack-all-modules "${n}") - - foreach(i ${opentrack-all-translations}) - set(t "${CMAKE_CURRENT_SOURCE_DIR}/lang/${i}.ts") - add_custom_command(OUTPUT "${t}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_SOURCE_DIR}/lang" - COMMAND "${Qt5_DIR}/../../../bin/lupdate" -silent -recursive -no-obsolete -locations relative . -ts "${t}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - DEPENDS ${${n}-cc} ${${n}-hh} ${${n}-ui} ${${n}-rc} - COMMENT "Running lupdate for ${n}/${i}") - set(target-name "i18n-lang-${i}-module-${n_orig}") - add_custom_target(${target-name} DEPENDS "${t}") - set_property(GLOBAL APPEND PROPERTY "opentrack-ts-targets-${i}" "${target-name}") - set_property(GLOBAL APPEND PROPERTY "opentrack-ts-files-${i}" "${t}") +function(otr_add_target_dirs var) + set(globs "") + foreach(k ${ARGN}) + list(APPEND globs "${k}/CMakeLists.txt") endforeach() + set(projects "") + file(GLOB projects CONFIGURE_DEPENDS ${globs}) + list(SORT projects) + set("${var}" "${projects}" PARENT_SCOPE) +endfunction() - if(NOT arg_NO-INSTALL) - set_property(GLOBAL APPEND PROPERTY opentrack-all-source-dirs "${CMAKE_CURRENT_SOURCE_DIR}") +function(otr_pdb_for_dll varname path) + set("${varname}" "" PARENT_SCOPE) + get_filename_component(dir "${path}" DIRECTORY) + get_filename_component(name-only "${path}" NAME_WE) + set(pdb-path "${dir}/${name-only}.pdb") + if(EXISTS "${pdb-path}") + set("${varname}" "${pdb-path}" PARENT_SCOPE) endif() endfunction() +function(otr_install_lib target dest) + if(WIN32) + string(FIND "${target}" "/" idx) + if(idx EQUAL -1) + get_property(path TARGET "${target}" PROPERTY "LOCATION_${CMAKE_BUILD_TYPE}") + else() + set(path "${target}") + endif() + if(path STREQUAL "") + message(FATAL_ERROR "Can't find ${target}") + endif() + string(TOLOWER "${path}" path_) + if(NOT path_ MATCHES "\\.(a|lib)$") + if(MSVC AND opentrack_install-debug-info) + set(pdb-path "") + otr_pdb_for_dll(pdb-path "${path}") + if(pdb-path) + install(FILES "${pdb-path}" DESTINATION "${opentrack-debug}" PERMISSIONS ${opentrack-perms-exec}) + endif() + endif() + install(FILES "${path}" DESTINATION "${dest}" PERMISSIONS ${opentrack-perms-exec}) + endif() + endif() +endfunction() diff --git a/cmake/opentrack-check-build-directory.cmake b/cmake/opentrack-check-build-directory.cmake deleted file mode 100644 index a9351b6a..00000000 --- a/cmake/opentrack-check-build-directory.cmake +++ /dev/null @@ -1,7 +0,0 @@ -get_filename_component(_abs_src_path ${CMAKE_SOURCE_DIR} REALPATH)
-string(TOLOWER ${_abs_src_path} _abs_src_path)
-get_filename_component(_abs_build_path ${CMAKE_BINARY_DIR} REALPATH)
-string(TOLOWER ${_abs_build_path} _abs_build_path)
-if(_abs_src_path STREQUAL _abs_build_path)
- message(FATAL_ERROR "source directory has to be different than build directory")
-endif()
diff --git a/cmake/opentrack-hier.cmake b/cmake/opentrack-hier.cmake index 905625fb..bb1a435d 100644 --- a/cmake/opentrack-hier.cmake +++ b/cmake/opentrack-hier.cmake @@ -1,62 +1,54 @@ -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
-# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
-# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-# PERFORMANCE OF THIS SOFTWARE.
-
-set(opentrack-install-rpath "")
-if(APPLE)
- set(opentrack-hier-pfx ".")
- set(opentrack-hier-path "/")
- set(opentrack-hier-doc "/")
- set(opentrack-hier-str RUNTIME DESTINATION . LIBRARY DESTINATION .)
- set(opentrack-doc-pfx "./doc")
- set(opentrack-doc-src-pfx "./source-code")
- set(opentrack-i18n-pfx "./i18n")
- set(opentrack-i18n-path "./i18n")
-elseif(WIN32)
- set(opentrack-hier-pfx "./modules")
- set(opentrack-hier-path "/modules/")
- set(opentrack-hier-doc "/doc/")
- set(opentrack-doc-pfx "./doc")
- set(opentrack-doc-src-pfx "./source-code")
- set(opentrack-hier-str RUNTIME DESTINATION ./modules/ LIBRARY DESTINATION ./modules/)
- set(opentrack-i18n-pfx "./i18n")
- set(opentrack-i18n-path "./i18n")
-else()
- set(opentrack-hier-pfx "libexec/opentrack")
- set(opentrack-hier-path "/../libexec/opentrack/")
- set(opentrack-hier-doc "/share/doc/opentrack/")
- set(opentrack-doc-pfx "./share/doc/opentrack")
- set(opentrack-doc-src-pfx "./share/doc/opentrack/source-code")
- set(opentrack-install-rpath "${CMAKE_INSTALL_PREFIX}/${opentrack-hier-pfx}")
- set(opentrack-hier-str ARCHIVE DESTINATION lib/opentrack LIBRARY DESTINATION ${opentrack-hier-pfx} RUNTIME DESTINATION bin)
- set(opentrack-i18n-pfx "./libexec/opentrack/i18n")
- set(opentrack-i18n-path "../libexec/opentrack/i18n")
-endif()
-
-function(otr_escape_string var str)
- string(REGEX REPLACE "([\$\\\"#])" "\\\\\\1" tmp__ "${str}")
- set(${var} "${tmp__}" PARENT_SCOPE)
-endfunction()
-
-function(otr_setup_refresh_install_dir)
- if((NOT CMAKE_INSTALL_PREFIX STREQUAL "") AND (NOT opentrack-doc-src-pfx STREQUAL ""))
- otr_escape_string(dir "${CMAKE_INSTALL_PREFIX}/${opentrack-doc-src-pfx}/")
- install(CODE "file(REMOVE_RECURSE \"${dir}\")")
- endif()
-endfunction()
-
-otr_setup_refresh_install_dir()
-
-set(opentrack-contrib-pfx "${opentrack-doc-pfx}/contrib")
-
-set(opentrack-binary-suffix "")
-if(APPLE)
- set(opentrack-binary-suffix ".bin")
-elseif(WIN32)
- set(opentrack-binary-suffix ".exe")
-endif()
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +include_guard(GLOBAL) + +if(APPLE) + set(opentrack-libexec "Plugins") + set(opentrack-runtime-libexec "/Plugins/") # MUST HAVE A TRAILING BACKSLASH, Used in APP + set(opentrack-runtime-doc "/") # MUST HAVE A TRAILING BACKSLASH + set(opentrack-bin "${CMAKE_INSTALL_PREFIX}") + set(opentrack-doc "doc") + set(opentrack-i18n "opentrack.app/Contents/Resources") # used during install + set(opentrack-runtime-i18n "../Resources/i18n") # used in application + set(opentrack-install-rpath "${CMAKE_INSTALL_PREFIX}/Library") +elseif(WIN32) + set(opentrack-libexec "modules") + set(opentrack-runtime-libexec "/${opentrack-libexec}/") # MUST HAVE A TRAILING BACKSLASH + set(opentrack-runtime-doc "/doc/") # MUST HAVE A TRAILING BACKSLASH + set(opentrack-bin ".") + set(opentrack-doc "doc") + set(opentrack-i18n "i18n") + set(opentrack-runtime-i18n "./i18n") + set(opentrack-debug "./debug") + set(opentrack-install-rpath "") +else() + set(opentrack-libexec "libexec/opentrack") + set(opentrack-runtime-libexec "/../${opentrack-libexec}/") # MUST HAVE A TRAILING BACKSLASH + set(opentrack-runtime-doc "/../share/doc/opentrack/") # MUST HAVE A TRAILING BACKSLASH + set(opentrack-bin "bin") + set(opentrack-doc "share/doc/opentrack") + set(opentrack-install-rpath "${CMAKE_INSTALL_PREFIX}/${opentrack-libexec}") + set(opentrack-i18n "share/opentrack/i18n") + set(opentrack-runtime-i18n "../share/opentrack/i18n") +endif() + +function(otr_escape_string var str) + string(REGEX REPLACE "([^_A-Za-z0-9./:-])" "\\\\\\1" str "${str}") + set(${var} "${str}" PARENT_SCOPE) +endfunction() + +set(opentrack-contrib-pfx "${opentrack-doc}/contrib") + +set(opentrack-binary-suffix "") +if(WIN32) + set(opentrack-binary-suffix ".exe") +endif() + +set(CMAKE_INSTALL_RPATH "${opentrack-install-rpath}") diff --git a/cmake/opentrack-i18n.cmake b/cmake/opentrack-i18n.cmake new file mode 100644 index 00000000..1f0c67d9 --- /dev/null +++ b/cmake/opentrack-i18n.cmake @@ -0,0 +1,97 @@ +include_guard(GLOBAL) + +add_custom_target(i18n-lupdate) +add_custom_target(i18n-lrelease DEPENDS i18n-lupdate) +add_custom_target(i18n ALL DEPENDS i18n-lrelease) + +function(otr_i18n_for_target_directory n) + set(k "opentrack-${n}") + + get_property(lupdate-binary TARGET "${Qt5_LUPDATE_EXECUTABLE}" PROPERTY IMPORTED_LOCATION) + + #make_directory("${CMAKE_CURRENT_BINARY_DIR}/lang") + + set(ts-files "") + foreach(k ${opentrack_all-translations}) + list(APPEND ts-files "${CMAKE_CURRENT_SOURCE_DIR}/lang/${k}.ts") + set_property(GLOBAL APPEND PROPERTY "opentrack-ts-files-${k}" "${CMAKE_CURRENT_SOURCE_DIR}/lang/${k}.ts") + endforeach() + set(stamp "${CMAKE_CURRENT_BINARY_DIR}/lupdate.stamp") + + foreach(i ${opentrack_all-translations}) + set(t "${CMAKE_CURRENT_SOURCE_DIR}/lang/${i}.ts") + set(input "${${k}-all}") + if (NOT EXISTS "${t}") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lang") + file(READ "${CMAKE_SOURCE_DIR}/cmake/translation-stub.ts" stub) + string(REPLACE "@LANG@" "${i}" stub "${stub}") + file(WRITE "${t}" "${stub}") + endif() + endforeach() + + # all sorts of problems + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(to-null "2>NUL") + else() + set(to-null "2>/dev/null") + endif() + + add_custom_command(OUTPUT "${stamp}" + COMMAND "${lupdate-binary}" + -I "${CMAKE_SOURCE_DIR}" + -silent + -recursive + -no-obsolete + -locations none + . + -ts ${ts-files} + ${to-null} + COMMAND "${CMAKE_COMMAND}" -E touch "${stamp}" + #BYPRODUCTS ${ts-files} + DEPENDS "opentrack-${n}" + COMMENT "Running lupdate for ${n}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") + set(target-name "i18n-module-${n}") + add_custom_target(${target-name} DEPENDS "${stamp}" COMMENT "") + add_dependencies(i18n-lupdate ${target-name}) +endfunction() + +function(otr_merge_translations) + otr_escape_string(i18n-pfx "${opentrack-i18n}") + #install(CODE "message(FATAL_ERROR \"foo \${CMAKE_INSTALL_PREFIX}\")") + #install(CODE "file(REMOVE_RECURSE \"\${CMAKE_INSTALL_PREFIX}/${i18n-pfx}\")") + + foreach(i ${opentrack_all-translations}) + get_property(ts-files GLOBAL PROPERTY "opentrack-ts-files-${i}") + get_property(lrelease-binary TARGET "${Qt5_LRELEASE_EXECUTABLE}" PROPERTY IMPORTED_LOCATION) + + set(qm-output "${CMAKE_BINARY_DIR}/${i}.qm") + + # whines about duplicate messages since tracker-pt-base is static + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(to-null "2>NUL") + else() + set(to-null "2>/dev/null") + endif() + + add_custom_command(OUTPUT "${qm-output}" + COMMAND "${lrelease-binary}" + -nounfinished + -silent + #-verbose + ${ts-files} + -qm "${qm-output}" + ${to-null} + DEPENDS i18n-lupdate ${ts-files} + COMMENT "Running lrelease for ${i}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") + + set(target-name i18n-qm-${i}) + add_custom_target(${target-name} DEPENDS "${qm-output}") + add_dependencies(i18n-lrelease ${target-name}) + + install(FILES "${qm-output}" + DESTINATION "${opentrack-i18n}" + PERMISSIONS ${opentrack-perms-file}) + endforeach() +endfunction() diff --git a/cmake/opentrack-install.cmake b/cmake/opentrack-install.cmake index 0dd5cc7d..5aac983b 100644 --- a/cmake/opentrack-install.cmake +++ b/cmake/opentrack-install.cmake @@ -1,96 +1,58 @@ -set(opentrack-perms_ WORLD_READ WORLD_EXECUTE OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE) -set(opentrack-perms PERMISSIONS ${opentrack-perms_}) +include_guard(GLOBAL) +macro(otr_install_misc path) + install(${ARGN} DESTINATION "${path}" PERMISSIONS ${opentrack-perms-file}) +endmacro() -macro(otr_inst2 path) - install(${ARGN} DESTINATION "${path}" ${opentrack-perms}) +macro(otr_install_exec path) + install(${ARGN} DESTINATION "${path}" PERMISSIONS ${opentrack-perms-file}) endmacro() -macro(otr_inst_dir path) +macro(otr_install_dir path) install( DIRECTORY ${ARGN} DESTINATION "${path}" - FILE_PERMISSIONS ${opentrack-perms_} - DIRECTORY_PERMISSIONS ${opentrack-perms_} + FILE_PERMISSIONS ${opentrack-perms-file} + DIRECTORY_PERMISSIONS ${opentrack-perms-dir} + PATTERN ".gtm" EXCLUDE ) endmacro() -function(install_sources) - get_property(source-dirs GLOBAL PROPERTY opentrack-all-source-dirs) - foreach(k ${source-dirs}) - file(RELATIVE_PATH dest "${CMAKE_SOURCE_DIR}" "${k}") - otr_inst_dir("${opentrack-doc-src-pfx}" "${dest}") - endforeach() +function(cleanup_visual_studio_debug) + otr_escape_string(pfx "${CMAKE_INSTALL_PREFIX}") + install(CODE "file(REMOVE_RECURSE \"${pfx}/.vs\")") endfunction() -otr_inst_dir("${opentrack-doc-pfx}" ${CMAKE_SOURCE_DIR}/3rdparty-notices) -otr_inst_dir("${opentrack-doc-pfx}" "${CMAKE_SOURCE_DIR}/settings" "${CMAKE_SOURCE_DIR}/contrib") -otr_inst_dir("${opentrack-doc-src-pfx}" "${CMAKE_SOURCE_DIR}/cmake") -otr_inst_dir("${opentrack-doc-src-pfx}" "${CMAKE_SOURCE_DIR}/bin") +otr_install_dir("${opentrack-doc}" ${CMAKE_SOURCE_DIR}/3rdparty-notices) +otr_install_dir("${opentrack-doc}" "${CMAKE_SOURCE_DIR}/settings" "${CMAKE_SOURCE_DIR}/contrib") +otr_install_dir("${opentrack-libexec}" "${CMAKE_SOURCE_DIR}/presets") if(WIN32) - otr_inst2(. FILES "${CMAKE_SOURCE_DIR}/bin/qt.conf") - otr_inst2(. FILES "${CMAKE_SOURCE_DIR}/bin/cleye.config") - otr_inst2(${opentrack-hier-pfx} FILES "${CMAKE_SOURCE_DIR}/bin/cleye.config") + otr_install_misc(. FILES "${CMAKE_SOURCE_DIR}/bin/qt.conf") + otr_install_misc(. FILES "${CMAKE_SOURCE_DIR}/bin/cleye.config") + otr_install_misc(${opentrack-libexec} FILES "${CMAKE_SOURCE_DIR}/bin/cleye.config") endif() -otr_inst2("${opentrack-doc-pfx}" FILES ${CMAKE_SOURCE_DIR}/README.md) - -otr_inst2("${opentrack-hier-pfx}" FILES "${CMAKE_SOURCE_DIR}/bin/freetrackclient.dll") -otr_inst2("${opentrack-hier-pfx}" FILES - "${CMAKE_SOURCE_DIR}/bin/NPClient.dll" - "${CMAKE_SOURCE_DIR}/bin/NPClient64.dll" - "${CMAKE_SOURCE_DIR}/bin/TrackIR.exe") - -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/CMakeLists.txt") -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/README.md") -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/CONTRIBUTING.md") -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/WARRANTY.txt") -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/OPENTRACK-LICENSING.txt") -otr_inst2("${opentrack-doc-src-pfx}" FILES "${CMAKE_SOURCE_DIR}/AUTHORS.md") - -function(merge_translations) - set(SDK_SKIP_TRANSLATION_UPDATE FALSE CACHE BOOL "") - install(CODE "file(REMOVE_RECURSE \"\${CMAKE_INSTALL_PREFIX}/i18n\")") - - set(all-ts-files "") - set(all-qm-files "") - - foreach(i ${opentrack-all-translations}) - get_property(ts-files GLOBAL PROPERTY "opentrack-ts-files-${i}") - #get_property(ts-deps GLOBAL PROPERTY "opentrack-ts-targets-${i}") - - set(ts-files_ "") +otr_install_misc("${opentrack-doc}" FILES ${CMAKE_SOURCE_DIR}/README.md) - foreach(k ${ts-files}) - if(EXISTS "${k}") - list(APPEND ts-files_ "${k}") - endif() - endforeach() +otr_install_misc("${opentrack-doc}" FILES "${CMAKE_SOURCE_DIR}/README.md") +otr_install_misc("${opentrack-doc}" FILES "${CMAKE_SOURCE_DIR}/.github/CONTRIBUTING.md") +otr_install_misc("${opentrack-doc}" FILES "${CMAKE_SOURCE_DIR}/WARRANTY.txt") +otr_install_misc("${opentrack-doc}" FILES "${CMAKE_SOURCE_DIR}/OPENTRACK-LICENSING.txt") +otr_install_misc("${opentrack-doc}" FILES "${CMAKE_SOURCE_DIR}/AUTHORS.md") - set(ts-files "${ts-files_}") +# this must be done last because the files may be in use already +# do it last so in case of file-in-use failure, the rest is installed - foreach(k ${ts-files}) - list(APPEND all-ts-files "${k}") - endforeach() - - if(NOT ".${ts-files}" STREQUAL ".") - if(SDK_SKIP_TRANSLATION_UPDATE) - set(lrelease-deps "") - else() - set(lrelease-deps "${ts-files}") - endif() - - set(qm-output "${CMAKE_CURRENT_BINARY_DIR}/${i}.qm") - list(APPEND all-qm-files "${qm-output}") - add_custom_command(OUTPUT "${qm-output}" - COMMAND "${Qt5_DIR}/../../../bin/lrelease" -nounfinished -silent ${ts-files} -qm "${qm-output}" - DEPENDS ${lrelease-deps} - COMMENT "Running lrelease for ${i}") - set(lang-target "i18n-lang-${i}") - - install(FILES "${qm-output}" DESTINATION "${opentrack-i18n-pfx}" RENAME "${i}.qm" ${opentrack-perms}) - endif() - endforeach() - add_custom_target(i18n ALL DEPENDS ${all-qm-files}) - add_custom_target(force-i18n DEPENDS ${all-ts-files} ${all-qm-files} i18n) -endfunction() +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + cleanup_visual_studio_debug() +endif() +# For now copy third party needed files into a seperate direcvtory instead of the plugins directory +if (APPLE) + set(OSX_POST_INSTALL_DIR "/../thirdparty") +endif() +otr_install_exec("${opentrack-libexec}${OSX_POST_INSTALL_DIR}" FILES "${CMAKE_SOURCE_DIR}/bin/freetrackclient.dll") +otr_install_exec("${opentrack-libexec}${OSX_POST_INSTALL_DIR}" FILES "${CMAKE_SOURCE_DIR}/bin/freetrackclient64.dll") +otr_install_exec("${opentrack-libexec}${OSX_POST_INSTALL_DIR}" FILES + "${CMAKE_SOURCE_DIR}/bin/NPClient.dll" + "${CMAKE_SOURCE_DIR}/bin/NPClient64.dll" + "${CMAKE_SOURCE_DIR}/bin/TrackIR.exe") diff --git a/cmake/opentrack-load-user-settings.cmake b/cmake/opentrack-load-user-settings.cmake new file mode 100644 index 00000000..fdb63936 --- /dev/null +++ b/cmake/opentrack-load-user-settings.cmake @@ -0,0 +1,36 @@ +include_guard(GLOBAL) +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(__sdk_username "$ENV{USERNAME}") +else() + set(__sdk_username "$ENV{USER}") +endif() + +if(".${__sdk_username}" STREQUAL ".") + set(__sdk_username "(I-have-no-name)") +endif() + +if(WIN32) + set(__sdk_target_os "windows") +else() + string(REGEX MATCH "^Linux (.+)-Microsoft\$" __sdk_target_os_match "${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}") + if(__sdk_target_os_match) + set(__sdk_target_os "Windows-WSL") + else() + set(__sdk_target_os "${CMAKE_SYSTEM_NAME}") + endif() +endif() + +if(NOT CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME) + set(__sdk_host_os "${CMAKE_HOST_SYSTEM_NAME}-cross-") +else() + set(__sdk_host_os "") +endif() + +set(__sdk_paths_filename "${CMAKE_CURRENT_SOURCE_DIR}/sdk-paths-${__sdk_username}@${CMAKE_CXX_COMPILER_ID}-${__sdk_host_os}${__sdk_target_os}.cmake") + +if(EXISTS "${__sdk_paths_filename}") + message(STATUS "Loading user settings '${__sdk_paths_filename}'") + include("${__sdk_paths_filename}") +else() + message(STATUS "User settings file '${__sdk_paths_filename}' doesn't exist") +endif() diff --git a/cmake/opentrack-build.cmake b/cmake/opentrack-mrproper.cmake index 4fe8fde0..6efb0be3 100644 --- a/cmake/opentrack-build.cmake +++ b/cmake/opentrack-mrproper.cmake @@ -7,15 +7,7 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -if(NOT CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "" FORCE) -endif() - -set(CMAKE_BUILD_TYPE_INIT "RELEASE") - -if(APPLE) - set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "" FORCE) -endif() +include_guard(GLOBAL) function(cleanup_build_dir) file(GLOB_RECURSE files LIST_DIRECTORIES TRUE RELATIVE "${CMAKE_BINARY_DIR}" "*") diff --git a/cmake/opentrack-opencv.cmake b/cmake/opentrack-opencv.cmake new file mode 100644 index 00000000..3acadf4a --- /dev/null +++ b/cmake/opentrack-opencv.cmake @@ -0,0 +1,4 @@ +include_guard(GLOBAL) + +include(opentrack-boilerplate) +find_package(OpenCV QUIET) diff --git a/cmake/opentrack-org.cmake b/cmake/opentrack-org.cmake new file mode 100644 index 00000000..107c829b --- /dev/null +++ b/cmake/opentrack-org.cmake @@ -0,0 +1,21 @@ +include_guard(GLOBAL) +function(otr_write_org) + get_property(ident GLOBAL PROPERTY opentrack-ident) + if (ident STREQUAL "") + message(FATAL_ERROR "must set global property `opentrack-ident' in `opentrack-variant.cmake'") + endif() + otr_escape_string(ident "${ident}") + set(new-str "#pragma once +#define OPENTRACK_ORG \"${ident}\" +") + + set(filename "${CMAKE_BINARY_DIR}/opentrack-org.hxx") + set(old-str "") + if(EXISTS "${filename}") + file(READ "${filename}" old-str) + endif() + if(NOT old-str STREQUAL new-str) + file(WRITE "${filename}" "${new-str}") + endif() +endfunction() +otr_write_org() diff --git a/cmake/opentrack-pkg-config.cmake b/cmake/opentrack-pkg-config.cmake new file mode 100644 index 00000000..0f13defc --- /dev/null +++ b/cmake/opentrack-pkg-config.cmake @@ -0,0 +1,31 @@ +include_guard(GLOBAL) +include(FindPkgConfig) + +function(otr_pkgconfig_ ret target) + set(${ret} 1 PARENT_SCOPE) + foreach(i ${ARGN}) + set(k pkg-config_${i}) + pkg_check_modules(${k} QUIET ${i}) + if(${${k}_FOUND}) + target_compile_options(${target} PRIVATE "${${k}_CFLAGS}") + target_link_options(${target} PRIVATE ${${k}_LDFLAGS}) + target_include_directories(${target} SYSTEM PRIVATE ${${k}_INCLUDE_DIRS} ${${k}_INCLUDEDIR}) + target_link_libraries(${target} ${${k}_LIBRARIES}) + else() + set(${ret} 0 PARENT_SCOPE) + endif() + endforeach() +endfunction() + +function(otr_pkgconfig target) + set(ret "") + otr_pkgconfig_(ret "${target}" ${ARGN}) + foreach(i ${ARGN}) + set(k pkg-config_${i}) + if(NOT ${${k}_FOUND}) + message(FATAL_ERROR "Can't find '${i}'. Please install development files for this package.") + endif() + endforeach() +endfunction() + + diff --git a/cmake/opentrack-platform.cmake b/cmake/opentrack-platform.cmake index ab3a5f8b..638260f1 100644 --- a/cmake/opentrack-platform.cmake +++ b/cmake/opentrack-platform.cmake @@ -21,114 +21,153 @@ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. +include_guard(GLOBAL) + +if(MSVC AND MSVC_VERSION LESS "1915" AND NOT ".${CMAKE_CXX_COMPILER_ID}" STREQUAL ".Clang") + message(FATAL_ERROR "Visual Studio too old. Use Visual Studio 2017 or newer.") +endif() + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # for clang + +string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) +set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "" FORCE) + +include_directories("${CMAKE_SOURCE_DIR}") + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_DEFAULT 20) +set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_CXX_EXTENSIONS FALSE) + +set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +set(CMAKE_SKIP_INSTALL_RPATH FALSE) +set(CMAKE_SKIP_RPATH FALSE) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) + +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) + + +if(NOT WIN32 AND NOT APPLE) + include(opentrack-pkg-config) +endif() + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_COMPILER_IS_GNUCXX TRUE) - set(CMAKE_COMPILER_IS_CLANG TRUE) + set(CMAKE_COMPILER_IS_CLANGXX TRUE) endif() if(CMAKE_C_COMPILER_ID STREQUAL "Clang") set(CMAKE_COMPILER_IS_GNUCC TRUE) - set(CMAKE_COMPILER_IS_GNUC TRUE) set(CMAKE_COMPILER_IS_CLANG TRUE) endif() -if((NOT CMAKE_COMPILER_IS_GNUCXX) EQUAL (NOT (NOT CMAKE_COMPILER_IS_GNUCC))) - message(FATAL_ERROR "cannot use GNU C xor GNU C++") +if(APPLE AND NOT CMAKE_OSX_ARCHITECTURES) + set(CMAKE_OSX_ARCHITECTURES "x86_64") + set(opentrack-intel TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*|i[0-9]86.*|x86.*") + set(opentrack-intel TRUE) +elseif(MSVC AND CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "") + set(opentrack-intel TRUE) +else() + set(opentrack-intel FALSE) +endif() + +if(CMAKE_SIZEOF_VOID_P GREATER_EQUAL 8) + set(opentrack-64bit TRUE) +else() + set(opentrack-64bit FALSE) endif() IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(LINUX TRUE) endif() -if(MSVC) - add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_WARNINGS) - add_definitions(-D_ITERATOR_DEBUG_LEVEL=0 -D_HAS_ITERATOR_DEBUGGING=0 -D_SECURE_SCL=0) - set(CMAKE_CXX_FLAGS "-std:c++14 ${CMAKE_CXX_FLAGS}") - #set(CMAKE_C_FLAGS " -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS ${CMAKE_C_FLAGS} ") +if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE) + add_compile_options(-fuse-cxa-atexit) - foreach (i SHARED MODULE EXE) - set(CMAKE_${i}_LINKER_FLAGS "-DYNAMICBASE -NXCOMPAT ${CMAKE_${i}_LINKER_FLAGS} ") - endforeach() + if(LINUX) # assume binutils + add_link_options(-Wl,--exclude-libs,ALL) + add_link_options(-Wl,-z,relro,-z,now) + add_link_options(-Wl,--as-needed) + add_link_options(-Wl,-z,noexecstack) + add_compile_options(-fno-plt) + endif() endif() if(WIN32) - if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_RC_COMPILER_INIT i686-w64-mingw32-windres) - set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> --use-temp-file -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") - endif() - enable_language(RC) - add_definitions(-D_USE_MATH_DEFINES=1) -endif(WIN32) - -if(opentrack-install-rpath) - set(CMAKE_INSTALL_RPATH "${opentrack-install-rpath}") -else() - set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}") + add_definitions(-D_USE_MATH_DEFINES=1 -DSTRSAFE_NO_DEPRECATE) endif() -set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -set(CMAKE_SKIP_INSTALL_RPATH FALSE) -set(CMAKE_SKIP_RPATH FALSE) -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOMOC OFF) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +if(MINGW) + add_definitions(-DMINGW_HAS_SECURE_API) +endif() -include_directories("${CMAKE_SOURCE_DIR}") +if(MSVC) + set(CMAKE_RC_FLAGS "/nologo /DWIN32") -if(APPLE) - set(CMAKE_MACOSX_RPATH OFF) - set(apple-frameworks "-stdlib=libc++ -framework Cocoa -framework CoreFoundation -lobjc -lz -framework Carbon") - set(CMAKE_SHARED_LINKER_FLAGS " ${apple-frameworks} ${CMAKE_SHARED_LINKER_FLAGS}") - #set(CMAKE_STATIC_LINKER_FLAGS " ${apple-frameworks} ${CMAKE_STATIC_LINKER_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS " ${apple-frameworks} ${CMAKE_EXE_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS " ${apple-frameworks} ${CMAKE_MODULE_LINKER_FLAGS}") - set(CMAKE_CXX_FLAGS " -stdlib=libc++ ${CMAKE_CXX_FLAGS}") -endif() + add_definitions(-DNOMINMAX) + add_definitions(-DWIN32_LEAN_AND_MEAN) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_definitions(-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1) + add_definitions(-D_SCL_SECURE_NO_WARNINGS) -if(NOT MSVC) - set(CMAKE_CXX_STANDARD 14) - set(CMAKE_CXX_STANDARD_DEFAULT 14) - set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - set(CMAKE_CXX_EXTENSIONS FALSE) -endif() + #add_compile_options(-EHsc) + add_definitions(-D_HAS_EXCEPTIONS=0) -set_property(GLOBAL PROPERTY USE_FOLDERS OFF) + add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE) + add_definitions(-D_ENABLE_ATOMIC_ALIGNMENT_FIX) + add_definitions(-D_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING) + add_definitions(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING) + add_definitions(-D_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING) -function(fix_flags lang flag replacement) - set(part "-") - set(pfx "-") - if(MSVC) - set(part "[-/]") - set(pfx "/") - endif() - if(".${replacement}" STREQUAL ".") - set(pfx "") + add_compile_options(-permissive-) + + if(opentrack-64bit) + add_link_options(-HIGHENTROPYVA) endif() - otr_escape_string(flag "${flag}") - foreach(k _DEBUG _RELEASE _MINSIZEREL _RELWITHDEBINFO "") - set(tmp "${CMAKE_${lang}_FLAGS${k}}") - if(NOT ".${replacement}" STREQUAL ".") - string(APPEND replacement " ") - endif() - string(REGEX REPLACE "(^| )${part}${flag}(\$| )" " ${pfx}${replacement}" CMAKE_${lang}_FLAGS${k} "${CMAKE_${lang}_FLAGS${k}}") - if(NOT ".${tmp}" STREQUAL ".${CMAKE_${lang}_FLAGS${k}}") - set(CMAKE_${lang}_FLAGS${k} "${CMAKE_${lang}_FLAGS${k}}" CACHE STRING "" FORCE) - else() - set(CMAKE_${lang}_FLAGS${k} "${CMAKE_${lang}_FLAGS${k}} ${pfx}${replacement}" CACHE STRING "" FORCE) + + add_link_options(-DYNAMICBASE -NXCOMPAT) + add_link_options(-WX) + add_link_options(-ignore:4020) + add_link_options(-ignore:4217) # debug build + + + if(MSVC_VERSION GREATER_EQUAL 1913) + if(NOT MSVC_VERSION GREATER_EQUAL 1929) + add_compile_options(-experimental:external) endif() + add_compile_options(-external:W0 -external:anglebrackets) + endif() + add_compile_options(-Zc:preprocessor) + #add_compile_options(-Zc:inline) + + #C4457: declaration of 'id' hides function parameter + #C4456: declaration of 'i' hides previous local declaration + #C4263 - member function does not override any base class virtual member function + #C4264 - no override available for virtual member function from base class, function is hidden + #C4265 - class has virtual functions, but destructor is not virtual + #C4266 - no override available for virtual member function from base type, function is hidden + #C4928 - illegal copy-initialization, more than one user-defined conversion has been implicitly applied + #C4200: nonstandard extension used: zero-sized array in struct/union + #C4459: declaration of 'eps' hides global declaration + + set(warns-disable 4530 4577 4789 4244 4702 4530 4244 4127 4458 4456 4251 4100 4702 4457 4200 4459) + + foreach(i ${warns-disable}) + add_compile_options(-wd${i}) endforeach() -endfunction() - -# nix -rdynamic passed from Linux-GNU.cmake -if(CMAKE_COMPILER_IS_GNUCXX) - set(__LINUX_COMPILER_GNU 1) - set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) - set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) endif() -if(MINGW) - add_definitions(-DMINGW_HAS_SECURE_API) +if(NOT MSVC) + include(FindPkgConfig) endif() -set(opencv-modules opencv_calib3d opencv_core opencv_features2d opencv_imgcodecs opencv_imgproc opencv_objdetect opencv_videoio) +if(LINUX AND CMAKE_COMPILER_IS_CLANG) + link_libraries(atomic) +endif() diff --git a/cmake/opentrack-policy.cmake b/cmake/opentrack-policy.cmake index 2d88e218..5fd8647f 100644 --- a/cmake/opentrack-policy.cmake +++ b/cmake/opentrack-policy.cmake @@ -1,27 +1,24 @@ -if(POLICY CMP0020) - cmake_policy(SET CMP0020 NEW) -endif() +include_guard(GLOBAL) -if(POLICY CMP0058) - cmake_policy(SET CMP0058 NEW) -endif() +set(_policies + CMP0020 + CMP0022 + CMP0058 + CMP0028 + CMP0042 + CMP0063 + CMP0053 + CMP0011 + CMP0054 + CMP0012 + CMP0069 + CMP0063 + CMP0074 +) +foreach(k ${_policies}) + if(POLICY ${k}) + cmake_policy(SET ${k} NEW) + endif() +endforeach() -if(POLICY CMP0028) - cmake_policy(SET CMP0028 NEW) -endif() - -if(POLICY CMP0042) - cmake_policy(SET CMP0042 NEW) -endif() - -if(POLICY CMP0063) - cmake_policy(SET CMP0063 NEW) -endif() - -if(POLICY CMP0053) - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0011) - cmake_policy(SET CMP0011 NEW) -endif() +set(CMAKE_INSTALL_MESSAGE LAZY) diff --git a/cmake/opentrack-qt.cmake b/cmake/opentrack-qt.cmake index 66618c59..1735e836 100644 --- a/cmake/opentrack-qt.cmake +++ b/cmake/opentrack-qt.cmake @@ -1,40 +1,68 @@ -find_package(Qt5 REQUIRED COMPONENTS Core Network Widgets Gui QUIET) -find_package(Qt5 COMPONENTS SerialPort Gamepad QUIET) -include_directories(SYSTEM ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS}) -add_definitions(${Qt5Core_DEFINITIONS} ${Qt5Gui_DEFINITIONS} ${Qt5Widgets_DEFINITIONS} ${Qt5Network_DEFINITIONS}) -set(MY_QT_LIBS ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES}) - +include_guard(GLOBAL) if(WIN32) - foreach(i Qt5Core Qt5Gui Qt5Network Qt5SerialPort Qt5Widgets) - install(FILES "${Qt5_DIR}/../../../bin/${i}.dll" DESTINATION .) - endforeach() - install(FILES "${Qt5_DIR}/../../../plugins/platforms/qwindows.dll" DESTINATION "./platforms") + find_package(Qt5Gui REQUIRED COMPONENTS QWindowsIntegrationPlugin) endif() +set(qt-required-components Core Network Widgets LinguistTools Gui) +set(qt-optional-components SerialPort) +set(qt-imported-targets Qt5::Core Qt5::Gui Qt5::Network Qt5::Widgets) +if(APPLE) + list(APPEND qt-required-components "DBus") + list(APPEND qt-optional-components "Multimedia") + list(APPEND qt-imported-targets Qt5::DBus Qt5::Multimedia) +endif() + +find_package(Qt5 REQUIRED COMPONENTS ${qt-required-components} QUIET) +find_package(Qt5 COMPONENTS ${qt-optional-components} QUIET) -string(FIND "${CMAKE_GENERATOR}" "Visual Studio " is-msvc) -if(is-msvc EQUAL 0) - set(is-msvc TRUE) -else() - set(is-msvc FALSE) +set(MY_QT_LIBS ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES}) +if(APPLE) + list(APPEND MY_QT_LIBS ${Qt5Multimedia_LIBRARIES} ${Qt5DBus_LIBRARIES}) endif() -if(MSVC) - # on .sln generator we have no editbin in path - if(is-msvc) - # this is bad but what can we do? searching for vcvarsall.bat - # would be easier, but then we'd have to differentiate x86/amd64 - # cross tools, etc. which is a can of worms and if/else branches. - get_filename_component(linker-dir "${CMAKE_LINKER}" DIRECTORY) - find_file(editbin-executable-filepath "editbin.exe" "${linker-dir}" "${linker-dir}/.." "${linker-dir}/../..") - otr_escape_string("${editbin-executable-filepath}" editbin-executable) - else() - set(editbin-executable "editbin") +function(otr_install_qt_libs) + foreach(i ${qt-imported-targets}) + if(NOT TARGET "${i}") + continue() + endif() + otr_install_lib(${i} ".") + endforeach() + if(WIN32) + otr_install_lib(Qt5::QWindowsIntegrationPlugin "./platforms") endif() +endfunction() - install(CODE " - foreach(i Qt5Core Qt5Gui Qt5Network Qt5SerialPort Qt5Widgets platforms/qwindows) - execute_process(COMMAND \"${editbin-executable}\" -nologo -SUBSYSTEM:WINDOWS,5.01 -OSVERSION:5.1 \"\${i}.dll\" WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\") - endforeach() - ") +if(WIN32 OR APPLE) + otr_install_qt_libs() endif() +function(otr_qt n) + if(".${${n}-cc}${${n}-cxx}${${n}-hh}" STREQUAL ".") + message(FATAL_ERROR "project ${n} not globbed") + endif() + qt5_wrap_cpp(${n}-moc ${${n}-hh} OPTIONS --no-notes -I "${CMAKE_CURRENT_BINARY_DIR}" -I "${CMAKE_SOURCE_DIR}") + qt5_wrap_ui(${n}-uih ${${n}-ui}) + qt5_add_resources(${n}-rcc ${${n}-rc}) + + foreach(i moc uih rcc) + set(${n}-${i} "${${n}-${i}}" PARENT_SCOPE) + list(APPEND ${n}-all ${${n}-${i}}) + endforeach() + set(${n}-all "${${n}-all}" PARENT_SCOPE) +endfunction() + +function(otr_qt2 n) + target_include_directories("${n}" SYSTEM PRIVATE + ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS} + ) + target_compile_definitions("${n}" PRIVATE + ${Qt5Core_DEFINITIONS} ${Qt5Gui_DEFINITIONS} ${Qt5Widgets_DEFINITIONS} ${Qt5Network_DEFINITIONS} + -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT + -DQT_MESSAGELOGCONTEXT + ) + if(CMAKE_COMPILER_IS_GNUCXX) + set_property(SOURCE ${${n}-moc} ${${n}-rcc} + APPEND_STRING PROPERTY COMPILE_FLAGS " -w -Wno-error ") + endif() +endfunction() + +include_directories("${CMAKE_BINARY_DIR}") diff --git a/cmake/opentrack-rift.cmake b/cmake/opentrack-rift.cmake deleted file mode 100644 index 88adbb3e..00000000 --- a/cmake/opentrack-rift.cmake +++ /dev/null @@ -1,37 +0,0 @@ -function(otr_rift proj opt) - if(${opt}) - set(link-flags) - set(c-flags) - if(APPLE) - set(link-flags "-framework CoreFoundation -framework CoreGraphics -framework IOKit -framework Quartz") - set(c-flags "-fno-strict-aliasing") - elseif(NOT MSVC) - set(c-flags "-fno-strict-aliasing") - endif() - otr_module(${proj} LINK ${link-flags} COMPILE ${c-flags}) - set(proj "opentrack-${proj}") - target_include_directories(${proj} SYSTEM PUBLIC ${${opt}}/Include ${${opt}}/Src) - set(c-flags) - set(link-flags) - if(MSVC) - set(ext lib) - set(p) - else() - set(ext a) - set(p lib) - endif() - if(MSVC) - set(pfx "") - else() - set(pfx "lib") - endif() - target_link_libraries(${proj} ${${opt}}/${pfx}LibOVR.${ext}) - if(WIN32) - target_link_libraries(${proj} winmm setupapi ws2_32 imagehlp wbemuuid) - set(ext) - set(p) - elseif(NOT APPLE) - target_link_libraries(${proj} udev Xinerama) - endif() - endif() -endfunction() diff --git a/cmake/opentrack-variant.cmake b/cmake/opentrack-variant.cmake new file mode 100644 index 00000000..5cb4bd57 --- /dev/null +++ b/cmake/opentrack-variant.cmake @@ -0,0 +1,32 @@ +include_guard(GLOBAL) + +function(otr_init_variant) + set_property(GLOBAL PROPERTY opentrack-variant "default") + set_property(GLOBAL PROPERTY opentrack-ident "opentrack-2.3") + + set(subprojects + "tracker-*" + "proto-*" + "filter-*" + "options" + "api" + "compat" + "logic" + "dinput" + "gui" + "main" + "x-plane-plugin" + "csv" + "pose-widget" + "spline" + "qxt-mini" + "macosx" + "cv" + "migration" + "main-window" + "video" + "video-*" + "opentrack" + ) + set_property(GLOBAL PROPERTY opentrack-subprojects "${subprojects}") +endfunction() diff --git a/cmake/opentrack-version.cmake b/cmake/opentrack-version.cmake index 9cd597d3..0ff516f2 100644 --- a/cmake/opentrack-version.cmake +++ b/cmake/opentrack-version.cmake @@ -1,3 +1,4 @@ +include_guard(GLOBAL) include(GetGitRevisionDescription) find_package(Git QUIET) @@ -5,41 +6,31 @@ if(GIT_FOUND) git_describe(OPENTRACK_COMMIT --tags --always) endif() -unset(_build_type) -if(CMAKE_BUILD_TYPE) - string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type) - if (NOT _build_type STREQUAL "DEBUG") - unset(_build_type) - else() - set(_build_type "-${_build_type}") - endif() -endif() - -file(WRITE ${CMAKE_BINARY_DIR}/opentrack-version.h "#define OPENTRACK_VERSION \"${OPENTRACK_COMMIT}${_build_type}\"") +file(WRITE ${CMAKE_BINARY_DIR}/opentrack-version.hxx "#define OPENTRACK_VERSION \"${OPENTRACK_COMMIT}\"") -set(version-string " +set(version-string "\ #ifdef __cplusplus extern \"C\" #else extern #endif -const char* opentrack_version; - -const char* opentrack_version = \"${OPENTRACK_COMMIT}${_build_type}\"; +const char* const opentrack_version; +const char* const opentrack_version = \"${OPENTRACK_COMMIT}\"; ") +set(file "${CMAKE_CURRENT_BINARY_DIR}/version.cpp") set(crapola-ver) -if(EXISTS ${CMAKE_BINARY_DIR}/version.c) - file(READ ${CMAKE_BINARY_DIR}/version.c crapola-ver) +if(EXISTS "${file}") + file(READ "${file}" crapola-ver) endif() if(NOT (crapola-ver STREQUAL version-string)) - file(WRITE ${CMAKE_BINARY_DIR}/version.c "${version-string}") + file(WRITE "${file}" "${version-string}") endif() -add_library(opentrack-version STATIC ${CMAKE_BINARY_DIR}/version.c) +add_library(opentrack-version STATIC "${file}") + if(NOT MSVC) - set_property(TARGET opentrack-version APPEND_STRING PROPERTY COMPILE_FLAGS "-fno-lto") + target_compile_options(opentrack-version PRIVATE -fno-lto) endif() -otr_compat(opentrack-version) diff --git a/cmake/opentrack-word-size.cmake b/cmake/opentrack-word-size.cmake deleted file mode 100644 index 12c34066..00000000 --- a/cmake/opentrack-word-size.cmake +++ /dev/null @@ -1,11 +0,0 @@ -include(CheckTypeSize)
-check_type_size(void* opentrack-word-size BUILTIN_TYPES_ONLY LANGUAGE C)
-if(NOT ((opentrack-word-size EQUAL 4) OR (opentrack-word-size EQUAL 8)))
- message(FATAL_ERROR "word size '${opentrack-word-size}' either misdetected or really not 4 or 8")
-endif()
-set(opentrack-word-size ${opentrack-word-size})
-if(opentrack-word-size GREATER 4)
- set(opentrack-64bit TRUE)
-else()
- set(opentrack-64bit FALSE)
-endif()
diff --git a/cmake/translation-stub.ts b/cmake/translation-stub.ts new file mode 100644 index 00000000..9d616636 --- /dev/null +++ b/cmake/translation-stub.ts @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="@LANG@"> +</TS> |
