MSCL icon indicating copy to clipboard operation
MSCL copied to clipboard

CMake for building mscl for Windows and Linux

Open michaelaeriksen opened this issue 2 years ago • 0 comments

cmake_minimum_required(VERSION 3.25)

project(MSCL CXX)

file(GLOB_RECURSE SOURCE_FILES MSCL/source/*.cpp)
file(GLOB_RECURSE HEADER_FILES MSCL/source/*.h)

list(REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/WsdaFinder.cpp)
list(REMOVE_ITEM HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/WsdaFinder.h)
list(REMOVE_ITEM HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/stdafx.h)

if (UNIX)
  list(REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/UpnpDeviceFinderCallback.cpp)
  list(REMOVE_ITEM HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/UpnpDeviceFinderCallback.h)
  list(REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/UpnpService.cpp)
  list(REMOVE_ITEM HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source/mscl/Communication/UpnpService.h)
endif ()

source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX "Source Files" FILES 
  ${SOURCE_FILES} 
  ${HEADER_FILES} 
  MSCL/source/stdafx.h
)

add_library(${PROJECT_NAME} SHARED)

target_sources(${PROJECT_NAME}
  PRIVATE ${SOURCE_FILES} MSCL/source/stdafx.h
  PUBLIC FILE_SET HEADERS
  BASE_DIRS MSCL/source
  FILES ${HEADER_FILES} 
)

target_precompile_headers(${PROJECT_NAME} PRIVATE MSCL/source/stdafx.h)

set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)

if (WIN32)
  set_target_properties(${PROJECT_NAME} PROPERTIES UNITY_BUILD ON)
  set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true)
endif ()

target_compile_definitions(${PROJECT_NAME} PUBLIC $<$<CXX_COMPILER_ID:MSVC>:NOMINMAX _USE_MATH_DEFINES UNICODE _UNICODE>)
target_compile_definitions(${PROJECT_NAME} PUBLIC $<$<CXX_COMPILER_ID:MSVC>:_WIN32_WINNT=0x0601>)
target_compile_definitions(${PROJECT_NAME} PUBLIC UNIX_BUILD)

target_compile_options(${PROJECT_NAME} PUBLIC
  $<$<CXX_COMPILER_ID:MSVC>:/W4 /MP /permissive- /bigobj>
  $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -Wpedantic>
)

target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/MSCL/source> 
  $<INSTALL_INTERFACE:include>
)

find_package(Boost REQUIRED COMPONENTS system filesystem)
target_link_libraries(${PROJECT_NAME} PUBLIC Boost::filesystem Boost::system)

find_package(OpenSSL REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto)

install(
  TARGETS ${PROJECT_NAME}
  EXPORT ${PROJECT_NAME}
  FILE_SET HEADERS
  DESTINATION include
)

install(
  EXPORT ${PROJECT_NAME} 
  NAMESPACE mscl:: 
  DESTINATION share
)

michaelaeriksen avatar Apr 20 '23 14:04 michaelaeriksen