From e28c988a04c15c2cedfe7e069a066463f4e4c452 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Tue, 23 Aug 2016 11:37:53 +0200 Subject: 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. --- cmake/opentrack-boilerplate.cmake | 213 ++++++++++++++++++++++++-------------- 1 file changed, 135 insertions(+), 78 deletions(-) (limited to 'cmake/opentrack-boilerplate.cmake') 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 "$") + 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() -- cgit v1.2.3