diff options
Diffstat (limited to 'cmake/opentrack-boilerplate.cmake')
-rw-r--r-- | cmake/opentrack-boilerplate.cmake | 251 |
1 files changed, 156 insertions, 95 deletions
diff --git a/cmake/opentrack-boilerplate.cmake b/cmake/opentrack-boilerplate.cmake index bea2b47a..e325cd6a 100644 --- a/cmake/opentrack-boilerplate.cmake +++ b/cmake/opentrack-boilerplate.cmake @@ -1,53 +1,68 @@ +include_guard(GLOBAL) + 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}") set(new-hier-path "#pragma once -#ifndef OPENTRACK_NO_QT_PATH -# include <QCoreApplication> -# include <QString> +#ifdef QT_CORE_LIB # include \"compat/base-path.hpp\" #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}\" + +#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_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}\" ") -include_directories("${CMAKE_BINARY_DIR}") +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() -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() +otr_write_library_paths() function(otr_glob_sources var) set(basedir "${CMAKE_CURRENT_SOURCE_DIR}") - foreach(dir . ${ARGN}) + foreach(i ui rc res cc cxx hh all) + set(${var}-${i} "") + endforeach() + foreach(dir ${ARGN}) set(dir "${basedir}/${dir}") - file(GLOB ${var}-cxx ${dir}/*.cpp) - file(GLOB ${var}-cc ${dir}/*.c) - file(GLOB ${var}-hh ${dir}/*.h ${dir}/*.hpp) - file(GLOB ${var}-res ${dir}/*.rc) - foreach(f ${var}-res) + 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 ${var}-ui ${dir}/*.ui) - file(GLOB ${var}-rc ${dir}/*.qrc) - set(${var}-all ${${var}-cc} ${${var}-cxx} ${${var}-hh} ${${var}-rc} ${${var}-res}) + 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}}" PARENT_SCOPE) + set(${var}-${i} "${${var}-${i}}" ${${i}} PARENT_SCOPE) endforeach() endforeach() endfunction() function(otr_fixup_subsystem n) - otr_find_msvc_editbin(editbin-pathname) if(MSVC) + otr_find_msvc_editbin(editbin-pathname) set(subsystem WINDOWS) get_property(type TARGET "${n}" PROPERTY TYPE) if (NOT type STREQUAL "STATIC_LIBRARY") @@ -61,27 +76,16 @@ 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() - get_property(type TARGET "${n}" PROPERTY TYPE) - if (".${TYPE}" STREQUAL ".EXECUTABLE") - otr_fixup_subsystem(${target}) + if(UNIX) # no-op on OSX + target_link_libraries(${target} m) endif() - if(CMAKE_COMPILER_IS_GNUCXX AND NOT MSVC) - # gives incorrect result - #get_property(linker-lang TARGET ${target} PROPERTY LINKER_LANGUAGE) - - set_property(TARGET ${target} APPEND_STRING PROPERTY COMPILE_FLAGS "-fvisibility=hidden ") - - if (NOT ".${${target}-cxx}" STREQUAL ".") # not a C only target - set_property(TARGET ${target} APPEND_STRING PROPERTY COMPILE_FLAGS "-fuse-cxa-atexit ") - endif() - - if(NOT APPLE) - set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS "-Wl,--as-needed ") - endif() + get_property(type TARGET "${n}" PROPERTY TYPE) + if (type STREQUAL "EXECUTABLE") + otr_fixup_subsystem(${target}) endif() endfunction() @@ -96,42 +100,30 @@ endfunction() function(otr_find_msvc_editbin varname) if(MSVC) - # on .sln generator we have no editbin in path - is_sln_generator(is-msvc) - 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(opentrack_editbin-executable "editbin.exe" "${linker-dir}" "${linker-dir}/.." "${linker-dir}/../..") - otr_escape_string("${editbin-executable}" editbin-executable) - else() - set(opentrack_editbin-executable "editbin") - endif() - mark_as_advanced(FORCE opentrack_editbin-executable) - set("${varname}" "${opentrack_editbin-executable}" PARENT_SCOPE) + 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 target) if(MSVC) - install(FILES "$<TARGET_PDB_FILE:${target}>" DESTINATION "${opentrack-hier-debug}" PERMISSIONS ${opentrack-perms-file}) + install(FILES "$<TARGET_PDB_FILE:${target}>" DESTINATION "${opentrack-debug}" PERMISSIONS ${opentrack-perms-file}) endif() endfunction() -include(CMakeParseArguments) - function(otr_module n_) message(STATUS "module ${n_}") cmake_parse_arguments(arg - "STATIC;NO-COMPAT;BIN;EXECUTABLE;NO-QT;WIN32-CONSOLE;NO-INSTALL;RELINK" + "STATIC;NO-COMPAT;BIN;EXECUTABLE;NO-QT;NO-I18N;WIN32-CONSOLE;NO-INSTALL;RELINK" "LINK;COMPILE" "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 "opentrack-${n_}") @@ -139,7 +131,7 @@ function(otr_module n_) if(NOT arg_SUBDIRS) otr_glob_sources(${n} .) else() - otr_glob_sources(${n} ${arg_SUBDIRS}) + otr_glob_sources(${n} . ${arg_SUBDIRS}) endif() list(APPEND ${n}-all ${arg_SOURCES}) @@ -148,30 +140,44 @@ function(otr_module n_) otr_qt(${n}) else() set(arg_NO-COMPAT TRUE) - endif() - - if(NOT WIN32) - set(subsys "") - elseif(arg_WIN32-CONSOLE) - set(subsys "") - else() - set(subsys "WIN32") + 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 "lib") + set_property(TARGET "${n}" PROPERTY PREFIX "") endif() - set_property(SOURCE ${${n}-moc} ${${n}-uih} ${${n}-rcc} PROPERTY GENERATED TRUE) + if(NOT arg_NO-QT) + otr_qt2("${n}") + endif() - if(NOT arg_RELINK) + 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) @@ -185,27 +191,51 @@ function(otr_module n_) target_link_libraries(${n} opentrack-api opentrack-options opentrack-compat) endif() - target_compile_definitions("${n}" PRIVATE "-DOTR_MODULE_NAME=\"${n_}\"") string(REPLACE "-" "_" build-n ${n_}) string(TOUPPER "${build-n}" build-n) - set_property(TARGET ${n} PROPERTY DEFINE_SYMBOL "BUILD_${build-n}") - - get_property(ident GLOBAL PROPERTY opentrack-ident) - if (".${ident}" STREQUAL ".") - message(FATAL_ERROR "must set global property `opentrack-ident' in `opentrack-variant.cmake'") - endif() - set_property(TARGET ${n} APPEND PROPERTY COMPILE_DEFINITIONS "OPENTRACK_ORG=\"${ident}\"") + 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_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) - if(arg_BIN AND WIN32) - install(TARGETS "${n}" RUNTIME DESTINATION . PERMISSIONS ${opentrack-perms-exec}) + # 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() - install(TARGETS "${n}" ${opentrack-hier-str} PERMISSIONS ${opentrack-perms-exec}) + # 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) @@ -214,18 +244,14 @@ function(otr_module n_) endif() endif() - otr_compat(${n}) - if(NOT arg_NO-QT) + if(NOT arg_NO-I18N) otr_i18n_for_target_directory(${n_}) - - foreach(k ${opentrack_all-translations}) - set(i18n-target "i18n-lang-${k}-module-${n_}") - add_dependencies("${n}" "${i18n-target}") - endforeach() endif() - set_property(GLOBAL APPEND PROPERTY opentrack-all-modules "${n}") + set_property(GLOBAL APPEND PROPERTY opentrack-all-modules "${n_}") set_property(GLOBAL APPEND PROPERTY opentrack-all-source-dirs "${CMAKE_CURRENT_SOURCE_DIR}") + + #make_directory("${CMAKE_CURRENT_BINARY_DIR}") endfunction() function(otr_add_target_dirs var) @@ -234,7 +260,42 @@ function(otr_add_target_dirs var) list(APPEND globs "${k}/CMakeLists.txt") endforeach() set(projects "") - file(GLOB projects ${globs}) + file(GLOB projects CONFIGURE_DEPENDS ${globs}) list(SORT projects) set("${var}" "${projects}" PARENT_SCOPE) endfunction() + +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() |