summaryrefslogtreecommitdiffhomepage
path: root/cmake/opentrack-boilerplate.cmake
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2016-08-23 11:37:53 +0200
committerStanislaw Halik <sthalik@misaki.pl>2016-08-23 13:20:22 +0200
commite28c988a04c15c2cedfe7e069a066463f4e4c452 (patch)
tree7eda372353b8d309380ebe1f524e2a136bd818a1 /cmake/opentrack-boilerplate.cmake
parent163c717dec73df7a907821cfb092a2ab6c62286a (diff)
cmake: refactor boilerplate for projects
Don't rely on a macro that shouldn't be necessary. The information "opentrack_boilerplate" retrieves is now factored out to be easily available to projects themselves. opentrack_boilerplate can now also build executables. When appropriate, target properties are now concatenated rather than replaced.
Diffstat (limited to 'cmake/opentrack-boilerplate.cmake')
-rw-r--r--cmake/opentrack-boilerplate.cmake213
1 files changed, 135 insertions, 78 deletions
diff --git a/cmake/opentrack-boilerplate.cmake b/cmake/opentrack-boilerplate.cmake
index d00a4a75..5cabe949 100644
--- a/cmake/opentrack-boilerplate.cmake
+++ b/cmake/opentrack-boilerplate.cmake
@@ -29,120 +29,177 @@ install(DIRECTORY "${CMAKE_SOURCE_DIR}/bin" DESTINATION "${opentrack-doc-src-pfx
install(FILES "${CMAKE_SOURCE_DIR}/README.md" DESTINATION "${opentrack-doc-src-pfx}")
install(FILES "${CMAKE_SOURCE_DIR}/CONTRIBUTING.md" DESTINATION "${opentrack-doc-src-pfx}")
-function(opentrack_set_globs n)
- set(dir ${PROJECT_SOURCE_DIR})
- file(GLOB ${n}-c ${dir}/*.cpp ${dir}/*.c ${dir}/*.h ${dir}/*.hpp)
- file(GLOB ${n}-res ${dir}/*.rc)
- foreach(f ${n}-res)
+function(opentrack_glob_sources var)
+ set(dir "${CMAKE_CURRENT_SOURCE_DIR}")
+ file(GLOB ${var}-c ${dir}/*.cpp ${dir}/*.c ${dir}/*.h ${dir}/*.hpp)
+ file(GLOB ${var}-res ${dir}/*.rc)
+ foreach(f ${var}-res)
set_source_files_properties(${f} PROPERTIES LANGUAGE RC)
endforeach()
- file(GLOB ${n}-ui ${dir}/*.ui)
- file(GLOB ${n}-rc ${dir}/*.qrc)
- foreach(i c res ui rc)
- set(${n}-${i} ${${n}-${i}} PARENT_SCOPE)
+ file(GLOB ${var}-ui ${dir}/*.ui)
+ file(GLOB ${var}-rc ${dir}/*.qrc)
+ file(GLOB aa ${dir}/*.qrc)
+ set(${var}-all ${${var}-c} ${${var}-rc} ${${var}-rcc} ${${var}-uih} ${${var}-moc} ${${var}-res})
+ foreach(i ui rc res c all)
+ set(${var}-${i} "${${var}-${i}}" PARENT_SCOPE)
endforeach()
endfunction()
function(opentrack_qt n)
qt5_wrap_cpp(${n}-moc ${${n}-c} OPTIONS --no-notes)
- QT5_WRAP_UI(${n}-uih ${${n}-ui})
- QT5_ADD_RESOURCES(${n}-rcc ${${n}-rc})
- set(${n}-all ${${n}-c} ${${n}-rc} ${${n}-rcc} ${${n}-uih} ${${n}-moc} ${${n}-res})
- foreach(i moc uih rcc all)
- set(${n}-${i} ${${n}-${i}} PARENT_SCOPE)
+ 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(opentrack_compat target)
+function(opentrack_fixup_subsystem n)
if(MSVC)
- set(msvc-subsystem "/VERSION:5.1 /SUBSYSTEM:WINDOWS,5.01")
- set_target_properties(${target} PROPERTIES LINK_FLAGS "${msvc-subsystem} /DEBUG /OPT:ICF")
+ if(SDK_CONSOLE_DEBUG)
+ set(subsystem CONSOLE)
+ else()
+ set(subsystem WINDOWS)
+ endif()
+ if("$ENV{LIBPATH}" STREQUAL "")
+ message(FATAL_ERROR "no vcvars.bat run; probably no editbin in PATH")
+ endif()
+ set(loc "$<TARGET_FILE:${n}>")
+ add_custom_command(TARGET "${n}"
+ POST_BUILD
+ COMMAND editbin -nologo -SUBSYSTEM:${subsystem},5.01 -OSVERSION:5.1 \"${loc}\"
+ COMMENT "Fixing up Windows XP support for target ${n}")
endif()
+endfunction()
+
+function(opentrack_compat target)
if(NOT MSVC)
set_property(SOURCE ${${target}-moc} APPEND_STRING PROPERTY COMPILE_FLAGS "-w -Wno-error")
endif()
if(WIN32)
target_link_libraries(${target} dinput8 dxguid strmiids)
endif()
+ opentrack_fixup_subsystem(${target})
+endfunction()
+
+function(opentrack_sources n ret)
+ get_target_property(srcs ${n} SOURCES)
+ if(srcs)
+ foreach(f ${srcs})
+ get_source_file_property(autogen "${f}" GENERATED)
+ if(NOT autogen)
+ list(APPEND ${ret} "${f}")
+ endif()
+ endforeach()
+ endif()
+ set(${ret} "${${ret}}" PARENT_SCOPE)
endfunction()
include(CMakeParseArguments)
-function(opentrack_boilerplate__ n files_ no-library_ static_ no-compat_ compile_ link_ stage2_ bin_)
- if((NOT no-library_) AND (NOT stage2_))
+function(opentrack_install_sources n)
+ opentrack_sources(${n} sources)
+ file(RELATIVE_PATH subdir "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
+ foreach (i ${sources})
+ install(FILES "${i}" DESTINATION "${opentrack-doc-src-pfx}/${subdir}")
+ endforeach()
+ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt" DESTINATION "${opentrack-doc-src-pfx}/${subdir}")
+endfunction()
+
+function(opentrack_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)
+endfunction()
+
+function(opentrack_boilerplate n)
+ message(STATUS "module ${n}")
+ cmake_parse_arguments(arg
+ "STATIC;NO-COMPAT;BIN;EXECUTABLE;NO-QT;WIN32-CONSOLE"
+ "LINK;COMPILE"
+ ""
+ ${ARGN}
+ )
+ if(NOT "${arg_UNPARSED_ARGUMENTS}" STREQUAL "")
+ message(FATAL_ERROR "opentrack_boilerplate bad formals: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ project(${n})
+ opentrack_glob_sources(${n})
+ opentrack_is_target_c_only(is-c-only "${${n}-all}")
+ if(NOT is-c-only)
+ opentrack_qt(${n})
+ endif()
+
+ if(arg_NO-QT)
+ set(arg_NO-COMPAT TRUE)
+ endif()
+
+ string(TOUPPER arg_WIN32-CONSOLE "${arg_WIN32-CONSOLE}")
+
+ if(NOT WIN32)
+ set(subsys "")
+ elseif(MSVC)
+ set(subsys "WIN32")
+ elseif(arg_WIN32-CONSOLE)
+ set(subsys "")
+ else()
+ set(subsys "WIN32")
+ endif()
+
+ if(arg_EXECUTABLE)
+ add_executable(${n} ${subsys} "${${n}-all}")
+ else()
set(link-mode SHARED)
- if (static_)
+ if (arg_STATIC)
set(link-mode STATIC)
endif()
- add_library(${n} ${link-mode} ${files_})
- set(all-files ${${n}-c} ${${n}-res} ${${n}-ui} ${${n}-rc})
- file(RELATIVE_PATH subdir ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
- foreach (i ${all-files})
- install(FILES "${i}" DESTINATION "${opentrack-doc-src-pfx}/${subdir}")
- endforeach()
- install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt" DESTINATION "${opentrack-doc-src-pfx}/${subdir}")
- message(STATUS "module ${n}")
+ add_library(${n} ${link-mode} "${${n}-all}")
endif()
- if(NOT no-library_)
- opentrack_compat(${n})
+
+ if(NOT arg_NO-QT)
+ target_link_libraries(${n} ${MY_QT_LIBS})
endif()
- if(NOT no-compat_)
+
+ if(NOT arg_NO-COMPAT)
target_link_libraries(${n} opentrack-api opentrack-options opentrack-compat)
endif()
- target_link_libraries(${n} ${MY_QT_LIBS})
- if(CMAKE_COMPILER_IS_GNUCXX)
- set(c-props "-fvisibility=hidden -fuse-cxa-atexit")
+
+ opentrack_install_sources(${n})
+ opentrack_compat(${n})
+
+ if(CMAKE_COMPILER_IS_GNUCXX OR APPLE)
+ set(c-props "-fvisibility=hidden")
+ if(NOT is-c-only)
+ set(c-props "${c-props} -fuse-cxa-atexit")
+ endif()
endif()
if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE)
set(l-props "-Wl,--as-needed")
endif()
- get_target_property(orig-compile ${n} COMPILE_FLAGS)
- if(NOT orig-compile)
- set(orig-compile "")
- endif()
- get_target_property(orig-link ${n} LINK_FLAGS)
- if(NOT orig-link)
- set(orig-link "")
- endif()
- set_target_properties(${n} PROPERTIES
- COMPILE_FLAGS "${c-props} ${orig-compile} ${compile_}"
- LINK_FLAGS "${l-props} ${orig-link} ${link_}"
- )
- string(REGEX REPLACE "^opentrack-" "" n_ ${n})
- string(REPLACE "-" "_" n_ ${n_})
- target_compile_definitions(${n} PRIVATE "BUILD_${n_}")
- if((NOT static_) AND (NOT no-library_))
- if(bin_ AND WIN32)
+
+ 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}")
+
+ if(NOT arg_STATIC)
+ string(REGEX REPLACE "^opentrack-" "" n_ "${n}")
+ string(REGEX REPLACE "^(tracker|filter-proto)-" "" n_ "${n_}")
+ string(REPLACE "-" "_" n_ ${n_})
+ target_compile_definitions(${n} PRIVATE "BUILD_${n_}")
+
+ if(arg_BIN AND WIN32)
install(TARGETS ${n} RUNTIME DESTINATION . LIBRARY DESTINATION .)
else()
install(TARGETS ${n} ${opentrack-hier-str})
endif()
endif()
endfunction()
-
-macro(opentrack_boilerplate n)
- cmake_parse_arguments(${n}-args
- "NO-LIBRARY;STATIC;NO-COMPAT;STAGE2;BIN"
- "LINK;COMPILE"
- ""
- ${ARGN}
- )
- if(NOT "${${n}-args_UNPARSED_ARGUMENTS}" STREQUAL "")
- message(FATAL_ERROR "opentrack_boilerplate bad formals ${${n}-args_UNPARSED_ARGUMENTS}")
- endif()
- if(NOT ${n}-args_STAGE2)
- project(${n} C CXX)
- opentrack_set_globs(${n})
- opentrack_qt(${n})
- endif()
- if((NOT ${n}-args_NO-LIBRARY) OR ${n}-args_STAGE2)
- opentrack_boilerplate__("${n}" "${${n}-all}"
- "${${n}-args_NO-LIBRARY}"
- "${${n}-args_STATIC}"
- "${${n}-args_NO-COMPAT}"
- "${${n}-args_COMPILE}"
- "${${n}-args_LINK}"
- "${${n}-args_STAGE2}"
- "${${n}-args_BIN}")
- endif()
-endmacro()