diff --git a/cmake/DPFFunctions.cmake b/cmake/DPFFunctions.cmake new file mode 100644 index 00000000..c626acf2 --- /dev/null +++ b/cmake/DPFFunctions.cmake @@ -0,0 +1,161 @@ +# Sets GET_LIBS_AND_DEFINES_LIBS and GET_LIBS_AND_DEFINES_DEFINES variables in parentscope. Link to this ! +function(GET_LIBS_AND_DEFINES UI_BACKEND) + if(NOT UI_BACKEND) + set(UI_BACKEND NONE) + endif(NOT UI_BACKEND) + if(${UI_BACKEND} STREQUAL "NONE") + set(GET_LIBS_AND_DEFINES_LIBS DPF PARENT_SCOPE) + elseif(${UI_BACKEND} STREQUAL "OPENGL") + set(GET_LIBS_AND_DEFINES_LIBS dgl-opengl DPF_UI PARENT_SCOPE) + elseif(${UI_BACKEND} STREQUAL "CAIRO") + set(GET_LIBS_AND_DEFINES_LIBS dgl-cairo DPF_UI PARENT_SCOPE) + elseif(${UI_BACKEND} STREQUAL "EXTERNAL") + set(GET_LIBS_AND_DEFINES_LIBS DPF_UI PARENT_SCOPE) + set(GET_LIBS_AND_DEFINES_DEFINES DGL_EXTERNAL PARENT_SCOPE) + else() + message(ERROR "No vaild UI_BACKEND, choose NONE OPENGL CAIRO or EXTERNAL") + endif(${UI_BACKEND} STREQUAL "NONE") +endfunction(GET_LIBS_AND_DEFINES UI_BACKEND) + +# Parameter to use: +# TARGET: Name for the generated VST +# UI_BACKEND; weather it should be NONE,EXTERNAL,OPENGL or CAIRO +# SOURCES: Plugin Sources, to compile in the vst +# INCLUDE_DIRECTORIES: Directories to include to the vst. +# DEFINES: Define Preprocessor defines +function(BUILD_JACK) + find_package(Jack) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + get_libs_and_defines(${PLUGIN_PARAM_UI_BACKEND} ) + add_executable(${PLUGIN_PARAM_TARGET} ${PLUGIN_PARAM_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} DPF ${JACK_LIBRARIES} ) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_JACK) +endfunction(BUILD_JACK) + +# Parameter to use: +# TARGET: Name for the generated VST +# UI_BACKEND; weather it should be NONE,EXTERNAL,OPENGL or CAIRO +# SOURCES: Plugin Sources, to compile in the vst +# INCLUDE_DIRECTORIES: Directories to include to the vst. +# DEFINES: Define Preprocessor defines +function(BUILD_VST2) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + get_libs_and_defines(${PLUGIN_PARAM_UI_BACKEND} ) + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} DPF) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_VST) +endfunction(BUILD_VST2) + + +# Parameter to use: +# TARGET: Name for the generated VST +# UI_BACKEND; weather it should be NONE,EXTERNAL,OPENGL or CAIRO because its an ladspa... set it to NONE or External... +# SOURCES: Plugin Sources, to compile in the vst +# INCLUDE_DIRECTORIES: Directories to include to the vst. +# DEFINES: Define Preprocessor defines +function(BUILD_LADSPA ) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + get_libs_and_defines(${PLUGIN_PARAM_UI_BACKEND} ) + + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS}) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_LADSPA) +endfunction(BUILD_LADSPA) + +# Parameter to use: +# TARGET: Name for the generated VST +# UI_BACKEND: weather it should be NONE,EXTERNAL,OPENGL or CAIRO +# UI_SOURCES: Plugin UI Sources +# SOURCES: Plugin Sources, to compile in the vst +# INCLUDE_DIRECTORIES: Directories to include to the vst. +# DEFINES: Define Preprocessor defines +# fills the Variable ${TARGET}_TTL_FILES with the generated files. +# if a ui is specified(with UI_SOURCES) 2 targets are build the TARGET and {TARGET}_ui +# if UI_SOURCES is not specified, a unified ui lv2 plugin will be build. This will also add DISTHRO_WANT_DIRECT_ACCESS=1 to the Project. +function(BUILD_LV2 ) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES UI_SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + get_libs_and_defines(${PLUGIN_PARAM_UI_BACKEND}) + if(PLUGIN_PARAM_UI_SOURCES) # IF UI Files are present, build seperated UI Files. + add_library(${PLUGIN_PARAM_TARGET}_ui MODULE ${PLUGIN_PARAM_UI_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET}_ui PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET}_ui ${GET_LIBS_AND_DEFINES_LIBS} ) + target_include_directories(${PLUGIN_PARAM_TARGET}_ui PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET}_ui PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_LV2) + + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES} ${PLUGIN_PARAM_UI_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} DPF DPF_UI) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_LV2) + set(${PLUGIN_PARAM_TARGET}_TTL_FILES + $/manifest.ttl + $/${PLUGIN_PARAM_TARGET}.ttl + $/${PLUGIN_PARAM_TARGET}_ui.ttl PARENT_SCOPE) + else() + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} DPF) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_LV2 DISTRHO_PLUGIN_WANT_DIRECT_ACCESS=1 ) + set(${PLUGIN_PARAM_TARGET}_TTL_FILES + $/manifest.ttl + $/${PLUGIN_PARAM_TARGET}.ttl PARENT_SCOPE) + endif(PLUGIN_PARAM_UI_SOURCES) + add_custom_command(TARGET ${PLUGIN_PARAM_TARGET} POST_BUILD COMMAND $ ARGS $ ) +endfunction(BUILD_LV2) + +function(BUILD_DSSI ) + find_package(LibLo) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES UI_SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + get_libs_and_defines(${PLUGIN_PARAM_UI_BACKEND} ) + + if(PLUGIN_PARAM_UI_SOURCES) + add_library(${PLUGIN_PARAM_TARGET}_ui MODULE ${PLUGIN_PARAM_UI_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET}_ui PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET}_ui ${GET_LIBS_AND_DEFINES_LIBS} ${LIBLO_LIBRARIES}) + target_include_directories(${PLUGIN_PARAM_TARGET}_ui PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} ${LIBLO_INCLUDE_DIRS}) + target_compile_definitions(${PLUGIN_PARAM_TARGET}_ui PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_DSSI) + + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES} ${PLUGIN_PARAM_UI_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} DPF DPF_UI ${LIBLO_LIBRARIES}) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} ${LIBLO_INCLUDE_DIRS}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_DSSI) + else(PLUGIN_PARAM_UI_SOURCES) + add_library(${PLUGIN_PARAM_TARGET} MODULE ${PLUGIN_PARAM_SOURCES}) + set_target_properties(${PLUGIN_PARAM_TARGET} PROPERTIES PREFIX "") + target_link_libraries(${PLUGIN_PARAM_TARGET} ${GET_LIBS_AND_DEFINES_LIBS} ${LIBLO_LIBRARIES}) + target_include_directories(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} ${LIBLO_INCLUDE_DIRS}) + target_compile_definitions(${PLUGIN_PARAM_TARGET} PUBLIC ${PLUGIN_PARAM_DEFINES} ${GET_LIBS_AND_DEFINES_DEFINES} DISTRHO_PLUGIN_TARGET_DSSI) + endif(PLUGIN_PARAM_UI_SOURCES) +endfunction(BUILD_DSSI) + + +#Are u so lazy, u have to call all functions? okay.... but declare erverything... +function(BUILD_ALL_PLUGINS) + set(oneValueArgs TARGET UI_BACKEND) + set(multiValueArgs SOURCES INCLUDE_DIRECTORIES DEFINES) + cmake_parse_arguments(PLUGIN_PARAM "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + BUILD_LV2(TARGET ${PLUGIN_PARAM_TARGET}.lv2 UI_BACKEND ${PLUGIN_PARAM_UI_BACKEND} SOURCES ${PLUGIN_PARAM_SOURCES} INCLUDE_DIRECTORIES ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} DEFINES ${PLUGIN_PARAM_DEFINES}) + BUILD_VST2(TARGET ${PLUGIN_PARAM_TARGET}.vst UI_BACKEND ${PLUGIN_PARAM_UI_BACKEND} SOURCES ${PLUGIN_PARAM_SOURCES} INCLUDE_DIRECTORIES ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} DEFINES ${PLUGIN_PARAM_DEFINES}) + BUILD_DSSI(TARGET ${PLUGIN_PARAM_TARGET}.dssi UI_BACKEND ${PLUGIN_PARAM_UI_BACKEND} SOURCES ${PLUGIN_PARAM_SOURCES} INCLUDE_DIRECTORIES ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} DEFINES ${PLUGIN_PARAM_DEFINES}) + if(${PLUGIN_PARAM_UI_BACKEND} STREQUAL "NONE") + BUILD_LADSPA(TARGET ${PLUGIN_PARAM_TARGET}.ladspa UI_BACKEND ${PLUGIN_PARAM_UI_BACKEND} SOURCES ${PLUGIN_PARAM_SOURCES} INCLUDE_DIRECTORIES ${PLUGIN_PARAM_INCLUDE_DIRECTORIES} DEFINES ${PLUGIN_PARAM_DEFINES}) + endif(${PLUGIN_PARAM_UI_BACKEND} STREQUAL "NONE") +endfunction(BUILD_ALL_PLUGINS) diff --git a/cmake/cxx_handling.cmake b/cmake/cxx_handling.cmake new file mode 100644 index 00000000..6e833187 --- /dev/null +++ b/cmake/cxx_handling.cmake @@ -0,0 +1,76 @@ +# DISTRHO Plugin Framework (DPF) +# Copyright (C) 2019-2020 Benjamin Heisch +# +# Permission to use, copy, modify, and/or distribute this software for any purpose with +# or without fee is hereby granted, provided that the above copyright notice and this +# permission notice appear in all copies. +# +# 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. + +# This cmake-Module contains functions arround c++ handling . +# use_cxx(CXX_VERSION(11,14,17,20)) -> Sets the C++ Version +# create_export_header(TARGET, OUTDIR) -> Creates a header for exporting symbols +# + +set(__DIR_OF_GENERATE_CMAKE ${CMAKE_CURRENT_LIST_DIR}) +macro(use_cxx cxx_version) + if(CMAKE_VERSION VERSION_GREATER "3.1.0.0") + set (CMAKE_CXX_STANDARD_REQUIRED ON) + set (CMAKE_CXX_STANDARD ${cxx_version}) + message(STATUS "Enable c++${cxx_version} ${CMAKE_CXX_STANDARD}") + else() + get_cxx_alias(${cxx_version} cxx_alias) + message(STATUS "The Version of Cmake is to old for save c++ ${cxx_version} support. Use wrapper instead") + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-std=c++${cxx_version}" compiler_supports_cxx_version) + CHECK_CXX_COMPILER_FLAG("-std=c++${cxx_alias}" compiler_supports_cxx_alias) + if(compiler_supports_cxx_version) + add_definitions("-std=c++${cxx_version}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${cxx_version}") + message(STATUS "Use -std=c++${cxx_version} for compiling") + elseif(compiler_supports_cxx_alias) + add_definitions("-std=c++${cxx_alias}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${cxx_alias}") + message(STATUS "Use -std=c++${cxx_alias} for compiling") + else() + message(WARNING "The compiler ${CMAKE_CXX_COMPILER} has no C++${cxx_version} support. Please use a different C++ compiler.") + endif(COMPILER_SUPPORTS_CXX11) + endif(CMAKE_VERSION VERSION_GREATER "3.1.0.0") +endmacro(use_cxx) + +#Can be called with OUTDIR and TARGET, if not provided OUTDIR is BIN_DIR/generated and TARGET is the current PROJECT_NAME like CREATE_EXPORT_HEADER(TARGET Blub OUTDIR Bla) +function(CREATE_EXPORT_HEADER) + set(oneValueArgs OUTDIR TARGET) + cmake_parse_arguments(CREATE_EXPORT_HEADER "" "${oneValueArgs}" "" ${ARGN} ) + if(NOT CREATE_EXPORT_HEADER_OUTDIR) + set(CREATE_EXPORT_HEADER_OUTDIR ${PROJECT_BINARY_DIR}/generated/) + endif(NOT CREATE_EXPORT_HEADER_OUTDIR) + if(NOT CREATE_EXPORT_HEADER_TARGET) + set(CREATE_EXPORT_HEADER_TARGET ${PROJECT_NAME}) + endif(NOT CREATE_EXPORT_HEADER_TARGET) + include(GenerateExportHeader) + generate_export_header(${CREATE_EXPORT_HEADER_TARGET} EXPORT_FILE_NAME "${CREATE_EXPORT_HEADER_OUTDIR}/${CREATE_EXPORT_HEADER_TARGET}_export.h") + target_include_directories(${CREATE_EXPORT_HEADER_TARGET} PUBLIC ${CREATE_EXPORT_HEADER_OUTDIR}) +endfunction(CREATE_EXPORT_HEADER) + + +######################HELPER FUNCTIONS###################### + + +#sets the cxx_alias variable to a cxx_alias(like 0x for c++11). +macro(get_cxx_alias cxx_number cxx_alias) + if(${cxx_number} EQUAL 11) + set(cxx_alias "0x") + elseif(${cxx_number} EQUAL 14) + set(cxx_alias "1y") + else() + message(WARNING "No supported cxx_alias. Please add an valid cxx_alias if possible") + endif() + message(STATUS "Use ${cxx_alias} as alias for ${cxx_number}") +endmacro(get_cxx_alias) + diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 00000000..2392e4fc --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,118 @@ +# DISTRHO Plugin Framework (DPF) +# Copyright (C) 2019-2020 Benjamin Heisch +# +# Permission to use, copy, modify, and/or distribute this software for any purpose with +# or without fee is hereby granted, provided that the above copyright notice and this +# permission notice appear in all copies. +# +# 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. + +# This cmake-Module contains functions arround versioning. +# set_version(MAJOR,MINOR,PATCH,BUILD) -> Sets the Version, if BUILD is not given, this +# Module tries to detect the Build version with git or svn. +# +# +# + +# SET_VERSION(1 0 1) or SET_VERSION(1 0 1 10204) +# If the 4th Component not given, it will be detected with git or svn +# (if git and svn are present(whatever this happened) git is preferred +# this function use the current projectname. +function(set_version major minor patch) + set(TEMP_PROJECT_NAME ${PROJECT_NAME}) + #setze default_value + if(NOT ARGV3) + set(TEMP_CURRENT_REVISON 0) + set_subversion_revision(TEMP_CURRENT_REVISON) + set_git_revision(TEMP_CURRENT_REVISON) + else(NOT ARGV3) + set(TEMP_CURRENT_REVISON ${ARGV3}) + endif(NOT ARGV3) + + if(POLICY CMP0048) + cmake_policy(SET CMP0048 NEW) + endif(POLICY CMP0048) + set(${TEMP_PROJECT_NAME}_VERSION "${major}.${minor}.${patch}.${TEMP_CURRENT_REVISON}" PARENT_SCOPE) + set(${TEMP_PROJECT_NAME}_VERSION_MAJOR ${major} PARENT_SCOPE) + set(${TEMP_PROJECT_NAME}_VERSION_MINOR ${minor} PARENT_SCOPE) + set(${TEMP_PROJECT_NAME}_VERSION_PATCH ${patch} PARENT_SCOPE) + set(${TEMP_PROJECT_NAME}_VERSION_TWEAK ${TEMP_CURRENT_REVISON} PARENT_SCOPE) + message(STATUS "Set Version to: ${major}.${minor}.${patch}.${TEMP_CURRENT_REVISON}") +endfunction(set_version) + +set(__DIR_OF_GENERATE_CMAKE ${CMAKE_CURRENT_LIST_DIR}) + +# Can be called with OUTDIR and TARGET, if not provided OUTDIR is BIN_DIR/generated and TARGET is +# the current PROJECT_NAME use itlike CREATE_VERSION_HEADER(TARGET Blub OUTDIR Bla) +# the versionheader is included to the given target. +function(CREATE_VERSION_HEADER) + set(oneValueArgs OUTDIR TARGET) + cmake_parse_arguments(CREATE_VERSION_HEADER "" "${oneValueArgs}" "" ${ARGN} ) + if(NOT CREATE_VERSION_HEADER_OUTDIR) + set(CREATE_VERSION_HEADER_OUTDIR ${PROJECT_BINARY_DIR}/generated/) + endif(NOT CREATE_VERSION_HEADER_OUTDIR) + if(NOT CREATE_VERSION_HEADER_TARGET) + set(CREATE_VERSION_HEADER_TARGET ${PROJECT_NAME}) + endif(NOT CREATE_VERSION_HEADER_TARGET) + configure_file ( + ${__DIR_OF_GENERATE_CMAKE}/version.h.in + "${CREATE_VERSION_HEADER_OUTDIR}/${CREATE_VERSION_HEADER_TARGET}_version.h" + ) + target_include_directories(${CREATE_VERSION_HEADER_TARGET} PUBLIC ${CREATE_VERSION_HEADER_OUTDIR}) +endfunction(CREATE_VERSION_HEADER) + + + + + + + + + + + + +#########################Helperfunctions######################### +macro(set_git_revision internal_revision_var) + find_package(Git) + if(GIT_FOUND) + set(possible_working_copies ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + foreach(working_copy_path ${possible_working_copies}) + if(EXISTS "${working_copy_path}/.git") + # Get the latest abbreviated commit hash of the working branch + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --format=%h + WORKING_DIRECTORY ${working_copy_path} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(${internal_revision_var} "0x${GIT_COMMIT_HASH}") + message(STATUS "Use current git-hash ${GIT_COMMIT_HASH} as tweak-version") + break() + endif(EXISTS "${working_copy_path}/.git") + endforeach(working_copy_path) + endif(GIT_FOUND) +endmacro(set_git_revision) + +macro(set_subversion_revision internal_revision_var) + find_package(Subversion) + if(SUBVERSION_FOUND) + set(possible_working_copies ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + foreach(working_copy_path ${possible_working_copies}) + if(EXISTS "${working_copy_path}/.svn") + Subversion_WC_INFO(${working_copy_path} TEMP_SVN_INFO_LOG) + #Subversion_WC_LOG(${working_copy_path} TEMP_SVN_INFO_LOG) + if(${TEMP_SVN_INFO_LOG_WC_REVISION}) + set(${internal_revision_var} ${TEMP_SVN_INFO_LOG_WC_REVISION}) + message(STATUS "Use current Subversion-Revision ${TEMP_SVN_INFO_LOG_WC_REVISION} as tweak-version") + break() + endif(${TEMP_SVN_INFO_LOG_WC_REVISION}) + endif(EXISTS "${working_copy_path}/.svn") + endforeach(working_copy_path) + endif(SUBVERSION_FOUND) +endmacro(set_subversion_revision) diff --git a/cmake/version.h.in b/cmake/version.h.in new file mode 100644 index 00000000..eff49ed5 --- /dev/null +++ b/cmake/version.h.in @@ -0,0 +1,25 @@ +#ifndef @PROJECT_NAME@_H +#define @PROJECT_NAME@_H + +#define xstr(s) str(s) +#define str(s) #s + +#define @PROJECT_NAME@_VERSION_MAJOR ${@PROJECT_NAME@_VERSION_MAJOR} +#define @PROJECT_NAME@_VERSION_MINOR ${@PROJECT_NAME@_VERSION_MINOR} +#define @PROJECT_NAME@_VERSION_PATCH ${@PROJECT_NAME@_VERSION_PATCH} +#define @PROJECT_NAME@_VERSION_TWEAK ${@PROJECT_NAME@_VERSION_TWEAK} +#define @PROJECT_NAME@_VERSION_STRING xstr(@PROJECT_NAME@_VERSION_MAJOR.@PROJECT_NAME@_VERSION_MINOR.@PROJECT_NAME@_VERSION_PATCH.@PROJECT_NAME@_VERSION_TWEAK) + +#ifndef VERSION_STRUCT +#define VERSION_STRUCT +typedef struct VERSION { + int MAJOR; + int MINOR; + int PATCH; + int TWEAK; + const char STRING[]; +}; +#endif // VERSION_STRUCT +static const struct VERSION @PROJECT_NAME@_VERSION = {@PROJECT_NAME@_VERSION_MAJOR, @PROJECT_NAME@_VERSION_MINOR, @PROJECT_NAME@_VERSION_PATCH, @PROJECT_NAME@_VERSION_TWEAK, @PROJECT_NAME@_VERSION_STRING }; +#endif // @PROJECT_NAME@_H +