diff --git a/CMake/Default.cmake b/CMake/Default.cmake new file mode 100644 index 0000000..70bfa90 --- /dev/null +++ b/CMake/Default.cmake @@ -0,0 +1,65 @@ +################################################################################ +# Command for variable_watch. This command issues error message, if a variable +# is changed. If variable PROPERTY_READER_GUARD_DISABLED is TRUE nothing happens +# variable_watch( property_reader_guard) +################################################################################ +function(property_reader_guard VARIABLE ACCESS VALUE CURRENT_LIST_FILE STACK) + if("${PROPERTY_READER_GUARD_DISABLED}") + return() + endif() + + if("${ACCESS}" STREQUAL "MODIFIED_ACCESS") + message(FATAL_ERROR + " Variable ${VARIABLE} is not supposed to be changed.\n" + " It is used only for reading target property ${VARIABLE}.\n" + " Use\n" + " set_target_properties(\"\" PROPERTIES \"${VARIABLE}\" \"\")\n" + " or\n" + " set_target_properties(\"\" PROPERTIES \"${VARIABLE}_\" \"\")\n" + " instead.\n") + endif() +endfunction() + +################################################################################ +# Create variable with generator expression that expands to value of +# target property _. If property is empty or not set then property +# is used instead. Variable has watcher property_reader_guard that +# doesn't allow to edit it. +# create_property_reader() +# Input: +# name - Name of watched property and output variable +################################################################################ +function(create_property_reader NAME) + set(PROPERTY_READER_GUARD_DISABLED TRUE) + set(CONFIG_VALUE "$>>>") + set(IS_CONFIG_VALUE_EMPTY "$") + set(GENERAL_VALUE "$>") + set("${NAME}" "$" PARENT_SCOPE) + variable_watch("${NAME}" property_reader_guard) +endfunction() + +################################################################################ +# Set property $_${PROPS_CONFIG_U} of ${PROPS_TARGET} to +# set_config_specific_property( ) +# Input: +# name - Prefix of property name +# value - New value +################################################################################ +function(set_config_specific_property NAME VALUE) + set_target_properties("${PROPS_TARGET}" PROPERTIES "${NAME}_${PROPS_CONFIG_U}" "${VALUE}") +endfunction() + +################################################################################ + +create_property_reader("TARGET_NAME") +create_property_reader("OUTPUT_DIRECTORY") + +set_config_specific_property("TARGET_NAME" "${PROPS_TARGET}") +set_config_specific_property("OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("ARCHIVE_OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("LIBRARY_OUTPUT_NAME" "${TARGET_NAME}") +set_config_specific_property("RUNTIME_OUTPUT_NAME" "${TARGET_NAME}") + +set_config_specific_property("ARCHIVE_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") +set_config_specific_property("LIBRARY_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") +set_config_specific_property("RUNTIME_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}") \ No newline at end of file diff --git a/CMake/DefaultCXX.cmake b/CMake/DefaultCXX.cmake new file mode 100644 index 0000000..90705db --- /dev/null +++ b/CMake/DefaultCXX.cmake @@ -0,0 +1,15 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake") + +set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_SOURCE_DIR}$<$>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}") + +if(MSVC) + create_property_reader("DEFAULT_CXX_DEBUG_RUNTIME_LIBRARY") + create_property_reader("DEFAULT_CXX_RUNTIME_LIBRARY") + create_property_reader("DEFAULT_CXX_EXCEPTION_HANDLING") + create_property_reader("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT") + + set_config_specific_property("DEFAULT_CXX_DEBUG_RUNTIME_LIBRARY" "/MDd") + set_config_specific_property("DEFAULT_CXX_RUNTIME_LIBRARY" "/MD") + set_config_specific_property("DEFAULT_CXX_EXCEPTION_HANDLING" "/EHsc") + set_config_specific_property("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT" "/Zi") +endif() diff --git a/CMake/DefaultFortran.cmake b/CMake/DefaultFortran.cmake new file mode 100644 index 0000000..3c16740 --- /dev/null +++ b/CMake/DefaultFortran.cmake @@ -0,0 +1,12 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake") + +set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_CURRENT_SOURCE_DIR}$<$>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}") + +get_target_property(${PROPS_TARGET}_BINARY_DIR ${PROPS_TARGET} BINARY_DIR) +set(DEFAULT_FORTRAN_MODULES_DIR "${${PROPS_TARGET}_BINARY_DIR}/${PROPS_TARGET}.Modules.dir") +set_target_properties(${PROPS_TARGET} PROPERTIES Fortran_MODULE_DIRECTORY ${DEFAULT_FORTRAN_MODULES_DIR}) + +if(${CMAKE_GENERATOR} MATCHES "Visual Studio") + # Hack for visual studio generator (https://gitlab.kitware.com/cmake/cmake/issues/19552) + add_custom_command(TARGET ${PROPS_TARGET} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/${CMAKE_CFG_INTDIR}) +endif() \ No newline at end of file diff --git a/CMake/Utils.cmake b/CMake/Utils.cmake new file mode 100644 index 0000000..102963f --- /dev/null +++ b/CMake/Utils.cmake @@ -0,0 +1,266 @@ +# utils file for projects came from visual studio solution with cmake-converter. + +################################################################################ +# Wrap each token of the command with condition +################################################################################ +cmake_policy(PUSH) +cmake_policy(SET CMP0054 NEW) +macro(prepare_commands) + unset(TOKEN_ROLE) + unset(COMMANDS) + foreach(TOKEN ${ARG_COMMANDS}) + if("${TOKEN}" STREQUAL "COMMAND") + set(TOKEN_ROLE "KEYWORD") + elseif("${TOKEN_ROLE}" STREQUAL "KEYWORD") + set(TOKEN_ROLE "CONDITION") + elseif("${TOKEN_ROLE}" STREQUAL "CONDITION") + set(TOKEN_ROLE "COMMAND") + elseif("${TOKEN_ROLE}" STREQUAL "COMMAND") + set(TOKEN_ROLE "ARG") + endif() + + if("${TOKEN_ROLE}" STREQUAL "KEYWORD") + list(APPEND COMMANDS "${TOKEN}") + elseif("${TOKEN_ROLE}" STREQUAL "CONDITION") + set(CONDITION ${TOKEN}) + elseif("${TOKEN_ROLE}" STREQUAL "COMMAND") + list(APPEND COMMANDS "$<$:${DUMMY}>$<${CONDITION}:${TOKEN}>") + elseif("${TOKEN_ROLE}" STREQUAL "ARG") + list(APPEND COMMANDS "$<${CONDITION}:${TOKEN}>") + endif() + endforeach() +endmacro() +cmake_policy(POP) + +################################################################################ +# Transform all the tokens to absolute paths +################################################################################ +macro(prepare_output) + unset(OUTPUT) + foreach(TOKEN ${ARG_OUTPUT}) + if(IS_ABSOLUTE ${TOKEN}) + list(APPEND OUTPUT "${TOKEN}") + else() + list(APPEND OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/${TOKEN}") + endif() + endforeach() +endmacro() + +################################################################################ +# Parse add_custom_command_if args. +# +# Input: +# PRE_BUILD - Pre build event option +# PRE_LINK - Pre link event option +# POST_BUILD - Post build event option +# TARGET - Target +# OUTPUT - List of output files +# DEPENDS - List of files on which the command depends +# COMMANDS - List of commands(COMMAND condition1 commannd1 args1 COMMAND +# condition2 commannd2 args2 ...) +# Output: +# OUTPUT - Output files +# DEPENDS - Files on which the command depends +# COMMENT - Comment +# PRE_BUILD - TRUE/FALSE +# PRE_LINK - TRUE/FALSE +# POST_BUILD - TRUE/FALSE +# TARGET - Target name +# COMMANDS - Prepared commands(every token is wrapped in CONDITION) +# NAME - Unique name for custom target +# STEP - PRE_BUILD/PRE_LINK/POST_BUILD +################################################################################ +function(add_custom_command_if_parse_arguments) + cmake_parse_arguments("ARG" "PRE_BUILD;PRE_LINK;POST_BUILD" "TARGET;COMMENT" "DEPENDS;OUTPUT;COMMANDS" ${ARGN}) + + if(WIN32) + set(DUMMY "cd.") + elseif(UNIX) + set(DUMMY "true") + endif() + + prepare_commands() + prepare_output() + + set(DEPENDS "${ARG_DEPENDS}") + set(COMMENT "${ARG_COMMENT}") + set(PRE_BUILD "${ARG_PRE_BUILD}") + set(PRE_LINK "${ARG_PRE_LINK}") + set(POST_BUILD "${ARG_POST_BUILD}") + set(TARGET "${ARG_TARGET}") + if(PRE_BUILD) + set(STEP "PRE_BUILD") + elseif(PRE_LINK) + set(STEP "PRE_LINK") + elseif(POST_BUILD) + set(STEP "POST_BUILD") + endif() + set(NAME "${TARGET}_${STEP}") + + set(OUTPUT "${OUTPUT}" PARENT_SCOPE) + set(DEPENDS "${DEPENDS}" PARENT_SCOPE) + set(COMMENT "${COMMENT}" PARENT_SCOPE) + set(PRE_BUILD "${PRE_BUILD}" PARENT_SCOPE) + set(PRE_LINK "${PRE_LINK}" PARENT_SCOPE) + set(POST_BUILD "${POST_BUILD}" PARENT_SCOPE) + set(TARGET "${TARGET}" PARENT_SCOPE) + set(COMMANDS "${COMMANDS}" PARENT_SCOPE) + set(STEP "${STEP}" PARENT_SCOPE) + set(NAME "${NAME}" PARENT_SCOPE) +endfunction() + +################################################################################ +# Add conditional custom command +# +# Generating Files +# The first signature is for adding a custom command to produce an output: +# add_custom_command_if( +# +# +# +# [COMMAND condition command2 [args2...]] +# [DEPENDS [depends...]] +# [COMMENT comment] +# +# Build Events +# add_custom_command_if( +# +# +# +# [COMMAND condition command2 [args2...]] +# [COMMENT comment] +# +# Input: +# output - Output files the command is expected to produce +# condition - Generator expression for wrapping the command +# command - Command-line(s) to execute at build time. +# args - Command`s args +# depends - Files on which the command depends +# comment - Display the given message before the commands are executed at +# build time. +# PRE_BUILD - Run before any other rules are executed within the target +# PRE_LINK - Run after sources have been compiled but before linking the +# binary +# POST_BUILD - Run after all other rules within the target have been +# executed +################################################################################ +function(add_custom_command_if) + add_custom_command_if_parse_arguments(${ARGN}) + + if(OUTPUT AND TARGET) + message(FATAL_ERROR "Wrong syntax. A TARGET and OUTPUT can not both be specified.") + endif() + + if(OUTPUT) + add_custom_command(OUTPUT ${OUTPUT} + ${COMMANDS} + DEPENDS ${DEPENDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + elseif(TARGET) + if(PRE_BUILD AND NOT ${CMAKE_GENERATOR} MATCHES "Visual Studio") + add_custom_target( + ${NAME} + ${COMMANDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + add_dependencies(${TARGET} ${NAME}) + else() + add_custom_command( + TARGET ${TARGET} + ${STEP} + ${COMMANDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT ${COMMENT}) + endif() + else() + message(FATAL_ERROR "Wrong syntax. A TARGET or OUTPUT must be specified.") + endif() +endfunction() + +################################################################################ +# Use props file for a target and configs +# use_props( ) +# Inside there are following variables: +# PROPS_TARGET - +# PROPS_CONFIG - One of +# PROPS_CONFIG_U - Uppercase PROPS_CONFIG +# Input: +# target - Target to apply props file +# configs - Build configurations to apply props file +# props_file - CMake script +################################################################################ +macro(use_props TARGET CONFIGS PROPS_FILE) + set(PROPS_TARGET "${TARGET}") + foreach(PROPS_CONFIG ${CONFIGS}) + string(TOUPPER "${PROPS_CONFIG}" PROPS_CONFIG_U) + + get_filename_component(ABSOLUTE_PROPS_FILE "${PROPS_FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}") + if(EXISTS "${ABSOLUTE_PROPS_FILE}") + include("${ABSOLUTE_PROPS_FILE}") + else() + message(WARNING "Corresponding cmake file from props \"${ABSOLUTE_PROPS_FILE}\" doesn't exist") + endif() + endforeach() +endmacro() + +################################################################################ +# Function for MSVC precompiled headers +# add_precompiled_header( ) +# Input: +# target - Target to which add precompiled header +# precompiled_header - Name of precompiled header +# precompiled_source - Name of precompiled source file +################################################################################ +function(add_precompiled_header TARGET PRECOMPILED_HEADER PRECOMPILED_SOURCE) + get_target_property(SOURCES "${TARGET}" SOURCES) + list(REMOVE_ITEM SOURCES "${PRECOMPILED_SOURCE}") + + if(MSVC) + set(PRECOMPILED_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PROJECT_NAME}.pch") + + set_source_files_properties( + "${PRECOMPILED_SOURCE}" + PROPERTIES + COMPILE_OPTIONS "/Yc${PRECOMPILED_HEADER};/Fp${PRECOMPILED_BINARY}" + OBJECT_OUTPUTS "${PRECOMPILED_BINARY}") + + set_source_files_properties( + ${SOURCES} + PROPERTIES + COMPILE_OPTIONS "$<$,$>:/Yu${PRECOMPILED_HEADER};/Fp${PRECOMPILED_BINARY}>" + OBJECT_DEPENDS "${PRECOMPILED_BINARY}") + endif() + + list(INSERT SOURCES 0 "${PRECOMPILED_SOURCE}") + set_target_properties("${TARGET}" PROPERTIES SOURCES "${SOURCES}") +endfunction() + +################################################################################ +# Add compile options to source file +# source_file_compile_options( [compile_options...]) +# Input: +# source_file - Source file +# compile_options - Options to add to COMPILE_FLAGS property +################################################################################ +function(source_file_compile_options SOURCE_FILE) + if("${ARGC}" LESS_EQUAL "1") + return() + endif() + + get_source_file_property(COMPILE_OPTIONS "${SOURCE_FILE}" COMPILE_OPTIONS) + + if(COMPILE_OPTIONS) + list(APPEND COMPILE_OPTIONS ${ARGN}) + else() + set(COMPILE_OPTIONS "${ARGN}") + endif() + + set_source_files_properties("${SOURCE_FILE}" PROPERTIES COMPILE_OPTIONS "${COMPILE_OPTIONS}") +endfunction() + +################################################################################ +# Default properties of visual studio projects +################################################################################ +set(DEFAULT_CXX_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultCXX.cmake") +set(DEFAULT_Fortran_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultFortran.cmake") diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..7621f02 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,87 @@ +cmake_minimum_required(VERSION 3.13.0 FATAL_ERROR) + +set(CMAKE_SYSTEM_VERSION 10.0.18362.0 CACHE STRING "" FORCE) + +project(Topologic CXX) + +################################################################################ +# Set target arch type if empty. Visual studio solution generator provides it. +################################################################################ +if(NOT CMAKE_VS_PLATFORM_NAME) + set(CMAKE_VS_PLATFORM_NAME "x64") +endif() +message("${CMAKE_VS_PLATFORM_NAME} architecture in use") + +if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU" + OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" + OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86")) + message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") +endif() + +################################################################################ +# Global configuration types +################################################################################ +set(CMAKE_CONFIGURATION_TYPES + "Debug" + "Release" + CACHE STRING "" FORCE +) + +################################################################################ +# Global compiler options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_CXX_FLAGS "") + set(CMAKE_CXX_FLAGS_DEBUG "") + set(CMAKE_CXX_FLAGS_RELEASE "") +endif() + +################################################################################ +# Global linker options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_EXE_LINKER_FLAGS "") + set(CMAKE_MODULE_LINKER_FLAGS "") + set(CMAKE_SHARED_LINKER_FLAGS "") + set(CMAKE_STATIC_LINKER_FLAGS "") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") +endif() + +################################################################################ +# Nuget packages function stub. +################################################################################ +function(use_package TARGET PACKAGE VERSION) + message(WARNING "No implementation of use_package. Create yours. " + "Package \"${PACKAGE}\" with version \"${VERSION}\" " + "for target \"${TARGET}\" is ignored!") +endfunction() + +################################################################################ +# Common utils +################################################################################ +include(CMake/Utils.cmake) + +################################################################################ +# Additional Global Settings(add specific info there) +################################################################################ +include(CMake/GlobalSettingsInclude.cmake OPTIONAL) + +################################################################################ +# Use solution folders feature +################################################################################ +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +################################################################################ +# Sub-projects +################################################################################ +add_subdirectory(TopologicCore) + diff --git a/TopologicCore/CMakeLists.txt b/TopologicCore/CMakeLists.txt new file mode 100644 index 0000000..21d48cb --- /dev/null +++ b/TopologicCore/CMakeLists.txt @@ -0,0 +1,433 @@ +project(TopologicCore CXX) + +################################################################################ +# Source groups +################################################################################ +set(no_group_source_files + "include/About.h" + "include/Aperture.h" + "include/Cell.h" + "include/CellComplex.h" + "include/Cluster.h" + "include/ContentManager.h" + "include/Context.h" + "include/ContextManager.h" + "include/Edge.h" + "include/Face.h" + "include/GlobalCluster.h" + "include/Graph.h" + "include/InstanceGUIDManager.h" + "include/Shell.h" + "include/TopologicalQuery.h" + "include/Topology.h" + "include/Utilities.h" + "include/Vertex.h" + "include/Wire.h" + "src/About.cpp" + "src/Aperture.cpp" + "src/Cell.cpp" + "src/CellComplex.cpp" + "src/Cluster.cpp" + "src/ContentManager.cpp" + "src/Context.cpp" + "src/ContextManager.cpp" + "src/Edge.cpp" + "src/Face.cpp" + "src/GlobalCluster.cpp" + "src/Graph.cpp" + "src/InstanceGUIDManager.cpp" + "src/Shell.cpp" + "src/Topology.cpp" + "src/Utilities.cpp" + "src/Vertex.cpp" + "src/Wire.cpp" +) +source_group("" FILES ${no_group_source_files}) + +set(Attributes + "include/Attribute.h" + "include/AttributeManager.h" + "include/DoubleAttribute.h" + "include/IntAttribute.h" + "include/ListAttribute.h" + "include/StringAttribute.h" + "src/AttributeManager.cpp" + "src/DoubleAttribute.cpp" + "src/IntAttribute.cpp" + "src/ListAttribute.cpp" + "src/StringAttribute.cpp" +) +source_group("Attributes" FILES ${Attributes}) + +set(Factories + "include/ApertureFactory.h" + "include/CellComplexFactory.h" + "include/CellFactory.h" + "include/ClusterFactory.h" + "include/EdgeFactory.h" + "include/FaceFactory.h" + "include/ShellFactory.h" + "include/TopologyFactory.h" + "include/TopologyFactoryManager.h" + "include/VertexFactory.h" + "include/WireFactory.h" + "src/ApertureFactory.cpp" + "src/CellComplexFactory.cpp" + "src/CellFactory.cpp" + "src/ClusterFactory.cpp" + "src/EdgeFactory.cpp" + "src/FaceFactory.cpp" + "src/ShellFactory.cpp" + "src/TopologyFactoryManager.cpp" + "src/VertexFactory.cpp" + "src/WireFactory.cpp" +) +source_group("Factories" FILES ${Factories}) + +set(Geometries + "include/Geometry.h" + "include/Line.h" + "include/NurbsCurve.h" + "include/NurbsSurface.h" + "include/PlanarSurface.h" + "include/Surface.h" + "src/Geometry.cpp" + "src/Line.cpp" + "src/NurbsCurve.cpp" + "src/NurbsSurface.cpp" + "src/PlanarSurface.cpp" + "src/Surface.cpp" +) +source_group("Geometries" FILES ${Geometries}) + +set(Utilities + "include/Bitwise.h" + "include/Utilities/CellUtility.h" + "include/Utilities/Direction.h" + "include/Utilities/EdgeUtility.h" + "include/Utilities/FaceUtility.h" + "include/Utilities/ShellUtility.h" + "include/Utilities/TopologyUtility.h" + "include/Utilities/TransformationMatrix2D.h" + "include/Utilities/Vector.h" + "include/Utilities/VertexUtility.h" + "include/Utilities/WireUtility.h" + "src/Bitwise.cpp" + "src/Utilities/CellUtility.cpp" + "src/Utilities/Direction.cpp" + "src/Utilities/EdgeUtility.cpp" + "src/Utilities/FaceUtility.cpp" + "src/Utilities/ShellUtility.cpp" + "src/Utilities/TopologyUtility.cpp" + "src/Utilities/TransformationMatrix2D.cpp" + "src/Utilities/Vector.cpp" + "src/Utilities/VertexUtility.cpp" + "src/Utilities/WireUtility.cpp" +) +source_group("Utilities" FILES ${Utilities}) + +set(ALL_FILES + ${no_group_source_files} + ${Attributes} + ${Factories} + ${Geometries} + ${Utilities} +) + +################################################################################ +# Target +################################################################################ +add_library(${PROJECT_NAME} SHARED ${ALL_FILES}) + +use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}") +set(ROOT_NAMESPACE TopologicCore) + +################################################################################ +# Output directory +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + set_target_properties(${PROJECT_NAME} PROPERTIES + OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set_target_properties(${PROJECT_NAME} PROPERTIES + OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + set_target_properties(${PROJECT_NAME} PROPERTIES + OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/output/${CMAKE_VS_PLATFORM_NAME}/$/" + ) +endif() +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + set_target_properties(${PROJECT_NAME} PROPERTIES + INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set_target_properties(${PROJECT_NAME} PROPERTIES + INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + set_target_properties(${PROJECT_NAME} PROPERTIES + INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" + ) +endif() +################################################################################ +# Include directories +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + target_include_directories(${PROJECT_NAME} PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/include;" + "/usr/include/opencascade" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_include_directories(${PROJECT_NAME} PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/include;" + "/usr/include/opencascade" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_include_directories(${PROJECT_NAME} PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/include;" + "/usr/include/opencascade" + ) +endif() + +################################################################################ +# Compile definitions +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + target_compile_definitions(${PROJECT_NAME} PRIVATE + "TOPOLOGIC_EXPORTS;" + "_WINDLL;" + "_MBCS" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_compile_definitions(${PROJECT_NAME} PRIVATE + "$<$:" + "NDEBUG" + ">" + "TOPOLOGICCORE_EXPORTS;" + "_WINDLL;" + "_MBCS" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_compile_definitions(${PROJECT_NAME} PRIVATE + "TOPOLOGIC_EXPORTS;" + "_WINDLL;" + "_MBCS" + ) +endif() + +################################################################################ +# Compile and link options +################################################################################ +if(MSVC) + if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /Od; + ${DEFAULT_CXX_DEBUG_RUNTIME_LIBRARY} + > + $<$: + /O2; + /Oi; + ${DEFAULT_CXX_RUNTIME_LIBRARY}; + /Gy + > + /permissive-; + /sdl; + /W3; + ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; + ${DEFAULT_CXX_EXCEPTION_HANDLING} + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /Od; + ${DEFAULT_CXX_DEBUG_RUNTIME_LIBRARY} + > + $<$: + /O2; + /Oi; + ${DEFAULT_CXX_RUNTIME_LIBRARY}; + /Gy + > + /permissive-; + /sdl; + /W3; + ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; + ${DEFAULT_CXX_EXCEPTION_HANDLING} + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_compile_options(${PROJECT_NAME} PRIVATE + $<$: + /Od; + ${DEFAULT_CXX_DEBUG_RUNTIME_LIBRARY} + > + $<$: + /O2; + /Oi; + ${DEFAULT_CXX_RUNTIME_LIBRARY}; + /Gy + > + /permissive-; + /sdl; + /W3; + ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; + ${DEFAULT_CXX_EXCEPTION_HANDLING} + ) + endif() + if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + target_link_options(${PROJECT_NAME} PRIVATE + $<$: + /OPT:REF; + /OPT:ICF + > + /DEBUG:FULL + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_link_options(${PROJECT_NAME} PRIVATE + $<$: + /OPT:REF; + /OPT:ICF + > + /DEBUG:FULL + ) + elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_link_options(${PROJECT_NAME} PRIVATE + $<$: + /OPT:REF; + /OPT:ICF + > + /DEBUG:FULL + ) + endif() +endif() + +################################################################################ +# Post build events +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + add_custom_command_if( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMANDS + COMMAND $ copy "$references\\opencascade-7.2.0\\win32\\vc14\\bin\\*.dll" "$output\\${CMAKE_VS_PLATFORM_NAME}\\$" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + add_custom_command_if( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMANDS + COMMAND $ copy "C:\\OpenCASCADE-7.4.0-vc14-64\\opencascade-7.4.0\\win64\\vc14\\bin\\*.dll" "$output\\${CMAKE_VS_PLATFORM_NAME}\\$" + COMMAND $ copy "C:\\OpenCASCADE-7.4.0-vc14-64\\opencascade-7.4.0\\win64\\vc14\\bin\\*.dll" "$output\\${CMAKE_VS_PLATFORM_NAME}\\$" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + add_custom_command_if( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMANDS + COMMAND $ copy "$references\\opencascade-7.2.0\\win32\\vc14\\bin\\*.dll" "$output\\${CMAKE_VS_PLATFORM_NAME}\\$" + ) +endif() + +################################################################################ +# Dependencies +################################################################################ +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + set(ADDITIONAL_LIBRARY_DEPENDENCIES + "TKCAF;" + "TKLCAF;" + "TKOffset;" + "TKIGES;" + "TKPrim;" + "TKMesh;" + "TKXSBase;" + "TKBool;" + "TKBO;" + "TKShHealing;" + "TKG3d;" + "TKG2d;" + "TKGeomBase;" + "TKGeomAlgo;" + "TKTopAlgo;" + "TKernel;" + "TKMath;" + "uuid;" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + set(ADDITIONAL_LIBRARY_DEPENDENCIES + "TKCAF;" + "TKLCAF;" + "TKOffset;" + "TKIGES;" + "TKPrim;" + "TKMesh;" + "TKXSBase;" + "TKBool;" + "TKBO;" + "TKShHealing;" + "TKG3d;" + "TKG2d;" + "TKGeomBase;" + "TKGeomAlgo;" + "TKTopAlgo;" + "TKernel;" + "TKMath;" + "uuid;" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + set(ADDITIONAL_LIBRARY_DEPENDENCIES + "TKCAF;" + "TKLCAF;" + "TKOffset;" + "TKIGES;" + "TKPrim;" + "TKMesh;" + "TKXSBase;" + "TKBool;" + "TKBO;" + "TKShHealing;" + "TKG3d;" + "TKG2d;" + "TKGeomBase;" + "TKGeomAlgo;" + "TKTopAlgo;" + "TKernel;" + "TKMath;" + "uuid;" + ) +endif() +target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}") + +if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Any CPU") + target_link_directories(${PROJECT_NAME} PUBLIC + "$<$:" + "/usr/lib64" + ">" + "$<$:" + "/usr/lib64" + ">" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + target_link_directories(${PROJECT_NAME} PUBLIC + "$<$:" + "/usr/lib64" + ">" + "$<$:" + "/usr/lib64" + ">" + ) +elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86") + target_link_directories(${PROJECT_NAME} PUBLIC + "$<$:" + "/usr/lib64" + ">" + "$<$:" + "/usr/lib64" + ">" + ) +endif() +