You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
9.1 KiB

1 year ago
# Copyright 2023 Ingemar Hedvall
# SPDX-License-Identifier: MIT
cmake_minimum_required(VERSION 3.20)
include(CMakePrintHelpers)
if("${CMAKE_TOOLCHAIN_FILE}" STREQUAL "")
set(USE_VCPKG OFF)
else()
set(USE_VCPKG ON)
endif()
option(BUILD_SHARED_LIBS "Static libraries are preferred" OFF)
option(A2L_DOC "If doxygen is installed, then build documentation in Release mode" OFF)
option(A2L_TOOLS "Building applications" OFF)
option(A2L_TEST "Building unit test" OFF)
option(A2L_FLEX "Create FLEX/BISON files" OFF)
if(A2L_TOOLS AND USE_VCPKG)
list(APPEND VCPKG_MANIFEST_FEATURES "tools")
endif()
project(a2llib
VERSION 1.0
DESCRIPTION "ASAP 2 parser C++ library."
LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_DEBUG_POSTFIX d)
include(script/boost.cmake)
if (A2L_TOOLS)
include(script/wxwidgets.cmake)
endif()
if (A2L_TEST)
include(script/googletest.cmake)
endif()
if (A2L_DOC)
include(script/doxygen.cmake)
endif()
if (A2L_FLEX)
include(script/flex.cmake)
include(script/bison.cmake)
endif()
if (BISON_FOUND AND A2L_FLEX)
BISON_TARGET(A2L_PARSER src/a2lparser.y ${CMAKE_CURRENT_SOURCE_DIR}/src/a2lparser.cpp
COMPILE_FLAGS "")
cmake_print_variables(BISON_A2L_PARSER_DEFINED
BISON_A2L_PARSER_INPUT
BISON_A2L_PARSER_OUTPUT_SOURCE
BISON_A2L_PARSER_OUTPUT_HEADER
BISON_A2L_PARSER_OUTPUTS
BISON_A2L_PARSER_COMPILE_FLAGS
BISON_INCLUDE_DIRS)
BISON_TARGET(A2ML_PARSER src/a2mlparser.y ${CMAKE_CURRENT_SOURCE_DIR}/src/a2mlparser.cpp
COMPILE_FLAGS "")
cmake_print_variables(BISON_A2ML_PARSER_DEFINED
BISON_A2ML_PARSER_INPUT
BISON_A2ML_PARSER_OUTPUT_SOURCE
BISON_A2ML_PARSER_OUTPUT_HEADER
BISON_A2ML_PARSER_OUTPUTS
BISON_A2ML_PARSER_COMPILE_FLAGS
BISON_INCLUDE_DIRS)
BISON_TARGET(IF_DATA_PARSER src/ifdataparser.y ${CMAKE_CURRENT_SOURCE_DIR}/src/ifdataparser.cpp
COMPILE_FLAGS "")
cmake_print_variables(BISON_IF_DATA_PARSER_DEFINED
BISON_IF_DATA_PARSER_INPUT
BISON_IF_DATA_PARSER_OUTPUT_SOURCE
BISON_IF_DATA_PARSER_OUTPUT_HEADER
BISON_IF_DATA_PARSER_OUTPUTS
BISON_IF_DATA_PARSER_COMPILE_FLAGS
BISON_INCLUDE_DIRS)
endif ()
if (FLEX_FOUND AND A2L_FLEX)
FLEX_TARGET(A2L_SCANNER src/a2lflexer.l ${CMAKE_CURRENT_SOURCE_DIR}/src/a2lflexer.cpp)
cmake_print_variables(FLEX_A2L_SCANNER_DEFINED
FLEX_A2L_SCANNER_OUTPUTS
FLEX_A2L_SCANNER_INPUT
FLEX_A2L_SCANNER_OUTPUT_HEADER
FLEX_INCLUDE_DIRS)
FLEX_TARGET(A2ML_SCANNER src/a2mlflexer.l ${CMAKE_CURRENT_SOURCE_DIR}/src/a2mlflexer.cpp)
cmake_print_variables(FLEX_A2ML_SCANNER_DEFINED
FLEX_A2ML_SCANNER_OUTPUTS
FLEX_A2ML_SCANNER_INPUT
FLEX_A2ML_SCANNER_OUTPUT_HEADER
FLEX_INCLUDE_DIRS)
FLEX_TARGET(IF_DATA_SCANNER src/ifdataflexer.l ${CMAKE_CURRENT_SOURCE_DIR}/src/ifdataflexer.cpp)
cmake_print_variables(FLEX_IF_DATA_SCANNER_DEFINED
FLEX_IF_DATA_SCANNER_OUTPUTS
FLEX_IF_DATA_SCANNER_INPUT
FLEX_IF_DATA_SCANNER_OUTPUT_HEADER
FLEX_INCLUDE_DIRS)
# Copy FlexLexer.h. This is a dirty trick to avoid flex/bison installation in windows build
file(COPY_FILE ${FLEX_INCLUDE_DIRS}/FlexLexer.h ${CMAKE_CURRENT_SOURCE_DIR}/src/FlexLexer.h)
endif ()
if (FLEX_FOUND AND BISON_FOUND)
ADD_FLEX_BISON_DEPENDENCY(A2L_SCANNER A2L_PARSER)
ADD_FLEX_BISON_DEPENDENCY(A2ML_SCANNER A2ML_PARSER)
ADD_FLEX_BISON_DEPENDENCY(IF_DATA_SCANNER IF_DATA_PARSER)
endif()
set(A2L_HEADERS
include/a2l/a2lfile.h
include/a2l/a2lstructs.h
include/a2l/a2lproject.h
include/a2l/module.h
include/a2l/a2lobject.h
include/a2l/a2lenums.h
include/a2l/axispts.h
include/a2l/blob.h
include/a2l/characteristic.h
include/a2l/axisdescr.h
include/a2l/compumethod.h
include/a2l/compuvtab.h
include/a2l/computab.h
include/a2l/compuvtabrange.h
include/a2l/frame.h
include/a2l/function.h
include/a2l/group.h
include/a2l/instance.h
include/a2l/overwrite.h
include/a2l/measurement.h
include/a2l/recordlayout.h
include/a2l/transformer.h
include/a2l/structure.h
include/a2l/unit.h
include/a2l/a2mlobject.h
include/a2l/a2mlblock.h
include/a2l/ifdataitem.h
include/a2l/ifdatablock.h
src/ifdatablock.cpp
)
add_library(a2l
src/a2lparser.cpp src/a2lparser.hpp
src/a2mlparser.cpp src/a2mlparser.hpp
src/ifdataparser.cpp src/ifdataparser.hpp
src/FlexLexer.h src/a2lflexer.cpp
src/FlexLexer.h src/a2mlflexer.cpp
src/FlexLexer.h src/ifdataflexer.cpp
${A2L_HEADERS}
src/a2lscanner.cpp src/a2lscanner.h
src/a2lfile.cpp
src/a2lhelper.cpp src/a2lhelper.h
src/a2lproject.cpp
src/module.cpp
src/a2lobject.cpp
src/axispts.cpp
src/a2lenums.cpp
src/blob.cpp
src/characteristic.cpp
src/axisdescr.cpp
src/compumethod.cpp
src/compuvtab.cpp
src/computab.cpp
src/compuvtabrange.cpp
src/frame.cpp
src/function.cpp
src/group.cpp
src/instance.cpp
src/overwrite.cpp
src/measurement.cpp
src/recordlayout.cpp
src/transformer.cpp
src/structure.cpp
src/unit.cpp
src/a2mlscanner.cpp
src/a2mlscanner.h
src/a2mlobject.cpp
src/a2mlblock.cpp
src/ifdatascanner.cpp
src/ifdatascanner.h
)
target_include_directories(a2l PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
target_include_directories(a2l PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_include_directories(a2l PRIVATE ${Boost_INCLUDE_DIRS})
cmake_print_properties(TARGETS a2l PROPERTIES INCLUDE_DIRECTORIES)
if (MSVC)
target_compile_definitions(a2l PRIVATE _WIN32_WINNT=0x0A00)
endif ()
if (wxWidgets_FOUND AND A2L_TOOLS)
add_subdirectory(a2lexplorer)
endif ()
if (A2L_TEST)
enable_testing()
add_subdirectory(test)
endif ()
if (DOXYGEN_FOUND AND (CMAKE_BUILD_TYPE MATCHES "^[Rr]elease") AND A2L_DOC)
set(DOXYGEN_RECURSIVE NO)
set(DOXYGEN_REPEAT_BRIEF NO)
set(DOXYGEN_PROJECT_NAME "A2lLib")
set(DOXYGEN_HTML_EXTRA_STYLESHEET doxygen/a2llib.css)
set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs/manual)
doxygen_add_docs(doc_liba2l ALL
include/dbc doxygen
COMMENT "A2L Library generating API documentation with Doxygen")
endif ()
##################################################################################
##### Packaging and installation ###############################################
##################################################################################
# install headers
# FILE_SET makes problems with GTest
#if (${CMAKE_MINOR_VERSION} GREATER_EQUAL 23)
# target_sources(dbc PUBLIC
# FILE_SET HEADERS
# TYPE HEADERS
# BASE_DIRS include/dbc
# FILES ${HEADERS})
#else()
if (WIN32)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/a2l DESTINATION a2l/include)
else()
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/a2l DESTINATION include)
endif()
#endif()
if (WIN32)
install(TARGETS a2l
EXPORT a2lTargets
LIBRARY DESTINATION a2l/lib
ARCHIVE DESTINATION a2l/lib
RUNTIME DESTINATION a2l/bin
# FILE_SET HEADERS DESTINATION dbc/include
)
else()
install(TARGETS a2l
EXPORT a2lTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
# PUBLIC_HEADER
# FILE_SET HEADERS DESTINATION include/dbc
)
endif()
include(CMakePackageConfigHelpers)
set(CONFIG_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/a2l/a2lConfigVersion.cmake")
# generate *Version.cmake
write_basic_package_version_file(
${CONFIG_VERSION_FILE}
VERSION ${PACKAGE_VERSION}
COMPATIBILITY AnyNewerVersion)
# Export dbcTargets to file *Targets.cmake
export(EXPORT a2lTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/liba2l/a2lTargets.cmake"
NAMESPACE Upstream::
)
set(ConfigPackageLocation lib/cmake/a2l)
set(CONFIG_CMAKE "${CMAKE_CURRENT_BINARY_DIR}/a2l/a2lConfig.cmake")
# create final a2l *Config.make file
# https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/a2lConfig.cmake.in"
${CONFIG_CMAKE}
INSTALL_DESTINATION ${ConfigPackageLocation}
)
# install *Targets.cmake
install(EXPORT a2lTargets
FILE
a2lTargets.cmake
NAMESPACE
A2l::
DESTINATION
${ConfigPackageLocation}
)
# Install *Version.cmake and *Config.cmake
install(
FILES
${CONFIG_VERSION_FILE}
${CONFIG_CMAKE}
DESTINATION
${ConfigPackageLocation}
COMPONENT
Devel
)