Browse Source

forgot to add new cmake stuff for versining and cxx standard

pull/210/head
CapRat 6 years ago
parent
commit
34edd4654b
4 changed files with 380 additions and 0 deletions
  1. +161
    -0
      cmake/DPFFunctions.cmake
  2. +76
    -0
      cmake/cxx_handling.cmake
  3. +118
    -0
      cmake/version.cmake
  4. +25
    -0
      cmake/version.h.in

+ 161
- 0
cmake/DPFFunctions.cmake View File

@@ -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
$<TARGET_FILE_DIR:${PLUGIN_PARAM_TARGET}>/manifest.ttl
$<TARGET_FILE_DIR:${PLUGIN_PARAM_TARGET}>/${PLUGIN_PARAM_TARGET}.ttl
$<TARGET_FILE_DIR:${PLUGIN_PARAM_TARGET}>/${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
$<TARGET_FILE_DIR:${PLUGIN_PARAM_TARGET}>/manifest.ttl
$<TARGET_FILE_DIR:${PLUGIN_PARAM_TARGET}>/${PLUGIN_PARAM_TARGET}.ttl PARENT_SCOPE)
endif(PLUGIN_PARAM_UI_SOURCES)
add_custom_command(TARGET ${PLUGIN_PARAM_TARGET} POST_BUILD COMMAND $<TARGET_FILE:lv2_ttl_generator> ARGS $<TARGET_FILE:${PLUGIN_PARAM_TARGET}> )
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)

+ 76
- 0
cmake/cxx_handling.cmake View File

@@ -0,0 +1,76 @@
# DISTRHO Plugin Framework (DPF)
# Copyright (C) 2019-2020 Benjamin Heisch <benjaminheisch@yahoo.de>
#
# 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)


+ 118
- 0
cmake/version.cmake View File

@@ -0,0 +1,118 @@
# DISTRHO Plugin Framework (DPF)
# Copyright (C) 2019-2020 Benjamin Heisch <benjaminheisch@yahoo.de>
#
# 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)

+ 25
- 0
cmake/version.h.in View File

@@ -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


Loading…
Cancel
Save