summaryrefslogtreecommitdiffhomepage
path: root/cmake/opentrack-boilerplate.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/opentrack-boilerplate.cmake')
-rw-r--r--cmake/opentrack-boilerplate.cmake251
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()