# # Copyright(c) 2019 Jeroen Koekkoek # # This program and the accompanying materials are made available under the # terms of the Eclipse Public License v. 2.0 which is available at # http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License # v. 1.0 which is available at # http://www.eclipse.org/org/documents/edl-v10.php. # # SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause # if (NOT BUILD_IDLC) return() endif() include(CheckIncludeFile) include(CheckSymbolExists) include(CheckTypeSize) include(GenerateExportHeader) function(idlpp_system_type _name _var) string(TOLOWER ${_name} _name) if("${_name}" MATCHES "^windows") set(${_var} "SYS_WIN32" PARENT_SCOPE) elseif("${_name}" MATCHES "^linux") set(${_var} "SYS_LINUX" PARENT_SCOPE) elseif("${_name}" MATCHES "^freebsd") set(${_var} "SYS_FREEBSD" PARENT_SCOPE) elseif("${_name}" MATCHES "^darwin") set(${_var} "SYS_MAC" PARENT_SCOPE) elseif("${_name}" MATCHES "^cygwin") set(${_var} "SYS_CYGWIN" PARENT_SCOPE) elseif("${_name}" MATCHES "^mingw") set(${_var} "SYS_MINGW" PARENT_SCOPE) else() set(${_var} "SYS_UNIX" PARENT_SCOPE) endif() endfunction() function(have_type _type _var) check_type_size(${_type} _size ${ARGN}) if(_size) set(${_var} 1 PARENT_SCOPE) else() set(${_var} 0 PARENT_SCOPE) endif() endfunction() macro(have_symbol _symbol _header _var) check_symbol_exists("${_symbol}" "${_header}" ${_var}) if(${${_var}}) set(${_var} 1) else() set(${_var} 0) endif() endmacro() set(idlpp_gcc_major_version_define "#undef GCC_MAJOR_VERSION") set(idlpp_gcc_minor_version_define "#undef GCC_MINOR_VERSION") if(CMAKE_C_COMPILER_ID MATCHES "MSVC") set(idlpp_host_compiler "MSC") set(idlpp_host_cmp_name "Visual C++") elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") set(idlpp_host_compiler "GNUC") set(idlpp_host_cmp_name "GCC") if(CMAKE_C_COMPILER_VERSION MATCHES "([0-9]+)\.([0-9]+)") set(idlpp_gcc_major_version_define "#define GCC_MAJOR_VERSION \"${CMAKE_MATCH_1}\"") set(idlpp_gcc_minor_version_define "#define GCC_MINOR_VERSION \"${CMAKE_MATCH_2}\"") else() message(FATAL "Cannot parse GCC version number") endif() elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") set(idlpp_host_compiler "GNUC") set(idlpp_host_cmp_name "Clang") if(CMAKE_C_COMPILER_VERSION MATCHES "([0-9]+)\.([0-9]+)") set(idlpp_gcc_major_version_define "#define GCC_MAJOR_VERSION \"${CMAKE_MATCH_1}\"") set(idlpp_gcc_minor_version_define "#define GCC_MINOR_VERSION \"${CMAKE_MATCH_2}\"") else() message(FATAL "Cannot parse Clang version number") endif() endif() # Generate __CYCLONEDDS__ macro value XXYYZZ. Version number as an integer # constant so that it may be used in mathmatical equations. # XX: Major version # YY: Minor version # ZZ: Patch version foreach(var MAJOR MINOR PATCH) if("00${PROJECT_VERSION_${var}}" MATCHES "([0-9][0-9])$") set(idlpp_version "${idlpp_version}${CMAKE_MATCH_1}") endif() endforeach() set(idlpp_include_dir "/path/to/cyclonedds/idl/includes") idlpp_system_type("${CMAKE_HOST_SYSTEM_NAME}" idlpp_host_system) idlpp_system_type("${CMAKE_SYSTEM_NAME}" idlpp_system) set(idlpp_system_version "ignored") if(idlpp_system STREQUAL "SYS_FREEBSD") if("${CMAKE_SYSTEM_VERSION}" MATCHES "^([0-9]+)") set(idlpp_system_version "${CMAKE_MATCH_1}") endif() endif() check_include_file(stdint.h idlpp_have_stdint_h) check_include_file(inttypes.h idlpp_have_inttypes_h) have_type("intmax_t" idlpp_have_intmax_t) have_type("long long" idlpp_have_long_long) have_symbol("stpcpy" "string.h" idlpp_have_stpcpy) have_symbol("strlcpy" "string.h" idlpp_have_strlcpy) have_symbol("strlcat" "string.h" idlpp_have_strlcat) if(idlpp_have_intmax_t) set(idlpp_ll_form "j") elseif(idlpp_have_long_long) set(idlpp_ll_form "ll") else() set(idlpp_ll_form "l") endif() set(configed_H "${CMAKE_CURRENT_BINARY_DIR}/src/configed.H") configure_file("src/configed.H.in" "${configed_H}" @ONLY) set(headers "src/internal.H" "src/system.H" "src/mcpp_lib.h" "src/mcpp_out.h" "${configed_H}") set(sources "src/directive.c" "src/eval.c" "src/expand.c" "src/main.c" "src/mbchar.c" "src/support.c" "src/system.c") # idlpp (mcpp) must not be exported as a library by itself and is therefore # defined as a static library, to be used by idlc only. add_library(idlpp STATIC ${sources} ${headers}) target_include_directories( idlpp PUBLIC $ $) target_compile_definitions( idlpp PRIVATE HAVE_CONFIG_H=1) if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") target_compile_definitions(idlpp PRIVATE _CRT_SECURE_NO_WARNINGS) endif() if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" AND ${WERROR} AND CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0) if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11.0) set(no_error stringop-overflow array-bounds stringop-overread format-overflow nonnull) foreach(ne ${no_error}) target_compile_options(idlpp PRIVATE -Wno-error=${ne}) target_link_options(idlpp PRIVATE -Wno-error=${ne}) endforeach() endif() endif() set_target_properties(idlpp PROPERTIES POSITION_INDEPENDENT_CODE TRUE) set_target_properties(idlpp PROPERTIES OUTPUT_NAME idlpp) generate_export_header( idlpp BASE_NAME mcpp EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/src/mcpp_export.h" )