cmake_minimum_required(VERSION 3.4.2) set(CMAKE_USER_MAKE_RULES_OVERRIDE cmake/c_flag_overrides.cmake) project(stlink C) set(PROJECT_DESCRIPTION "Open source version of the STMicroelectronics ST-LINK Tools") include(GNUInstallDirs) set(STLINK_UDEV_RULES_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/udev/rules.d" CACHE PATH "udev rules directory") set(STLINK_MODPROBED_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/modprobe.d" CACHE PATH "modprobe.d directory") set(STLINK_STATIC_LIB ON CACHE BOOL "Install static lib") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) if (IS_DIRECTORY ${LIB_INSTALL_DIR}) set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR} CACHE PATH "Main library directory") set(STLINK_LIBRARY_PATH "${LIB_INSTALL_DIR}") else () set(LIB_INSTALL_DIR "lib" CACHE PATH "Main library directory") set(STLINK_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") endif () if (IS_DIRECTORY ${INCLUDE_INSTALL_DIR}) set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_DIR} CACHE PATH "Main include directory") set(STLINK_INCLUDE_PATH "${INCLUDE_INSTALL_DIR}") else () set(INCLUDE_INSTALL_DIR "include" CACHE PATH "Main include directory") set(STLINK_INCLUDE_PATH "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}") endif () option(STLINK_GENERATE_MANPAGES "Generate manpages with pandoc" OFF) option(STLINK_INSTALL_UDEV_RULES "Install udev rules files" ON) option(STLINK_INSTALL_MODPROBE_CONF "Install modprobe conf files" ON) # cmake (3.0+) on MacOS should use @rpath cmake_policy(SET CMP0042 NEW) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_SOURCE_DIR}/cmake/modules") include(cmake/version.cmake) if (NOT MSVC) include(cmake/c_flags.cmake) endif () ### # Dependencies ### find_package(LibUSB REQUIRED) if (NOT APPLE AND NOT WIN32 AND NOT CMAKE_CROSSCOMPILING) find_package(PkgConfig) pkg_check_modules(gtk gtk+-3.0) endif () include(CheckIncludeFile) CHECK_INCLUDE_FILE(sys/mman.h STLINK_HAVE_SYS_MMAN_H) if (STLINK_HAVE_SYS_MMAN_H) add_definitions(-DSTLINK_HAVE_SYS_MMAN_H) endif () CHECK_INCLUDE_FILE(unistd.h STLINK_HAVE_UNISTD_H) if (STLINK_HAVE_UNISTD_H) add_definitions(-DSTLINK_HAVE_UNISTD_H) endif () include(CheckLibraryExists) CHECK_LIBRARY_EXISTS(ssp __stack_chk_fail "" _stack_chk_fail_exists) if (_stack_chk_fail_exists) set(SSP_LIB ssp) else () set(SSP_LIB "") endif () if (CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE "Debug") endif () if (${CMAKE_BUILD_TYPE} MATCHES "Debug") include(CTest) endif () set(STLINK_HEADERS include/stlink.h include/stlink/usb.h include/stlink/sg.h include/stlink/logging.h include/stlink/mmap.h include/stlink/chipid.h include/stlink/flash_loader.h ) set(STLINK_SOURCE src/chipid.c src/common.c src/usb.c src/sg.c src/logging.c src/flash_loader.c src/md5.c ) if (WIN32 OR MSYS OR MINGW) set(STLINK_SOURCE "${STLINK_SOURCE};src/mmap.c;src/mingw/mingw.c") set(STLINK_HEADERS "${STLINK_HEADERS};src/mingw/mingw.h") endif () include_directories(${LIBUSB_INCLUDE_DIR}) include_directories(include) include_directories(${PROJECT_BINARY_DIR}/include) include_directories(src/mingw) if (MSVC) include_directories(src/win32) include_directories(src/getopt) # Use string.h rather than strings.h and disable annoying warnings add_definitions(-DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS /wd4710) endif () ### # Shared library ### if (NOT WIN32) set(STLINK_LIB_SHARED ${PROJECT_NAME}) else () set(STLINK_LIB_SHARED ${PROJECT_NAME}-shared) endif () add_library( ${STLINK_LIB_SHARED} SHARED ${STLINK_HEADERS} # header files for ide projects generated by cmake ${STLINK_SOURCE} ) target_link_libraries( ${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY} ) set(STLINK_SHARED_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) message(STATUS "STLINK_LIB_SHARED: ${STLINK_LIB_SHARED}") message(STATUS "PROJECT_VERSION_MAJOR: ${PROJECT_VERSION_MAJOR}") message(STATUS "VERSION: ${STLINK_SHARED_VERSION}") set_target_properties( ${STLINK_LIB_SHARED} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} VERSION ${STLINK_SHARED_VERSION} ) # Link shared library with Apple macOS libraries if (APPLE) find_library(ObjC objc) find_library(CoreFoundation CoreFoundation) find_library(IOKit IOKit) target_link_libraries(${STLINK_LIB_SHARED} ${CoreFoundation} ${IOKit} ${ObjC} ${SSP_LIB}) endif () if (WIN32 OR MSYS OR MINGW) target_link_libraries(${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY} wsock32 ws2_32 ${SSP_LIB}) else () target_link_libraries(${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY} ${SSP_LIB}) endif () install( TARGETS ${STLINK_LIB_SHARED} DESTINATION ${STLINK_LIBRARY_PATH} ) ### # Static library ### set(STLINK_LIB_STATIC ${PROJECT_NAME}-static) add_library( ${STLINK_LIB_STATIC} STATIC ${STLINK_HEADERS} # header files for ide projects generated by cmake ${STLINK_SOURCE} ) # Link shared library with Apple macOS libraries if (APPLE) find_library(ObjC objc) find_library(CoreFoundation CoreFoundation) find_library(IOKit IOKit) target_link_libraries(${STLINK_LIB_STATIC} ${CoreFoundation} ${IOKit} ${ObjC} ${SSP_LIB}) endif () if (WIN32 OR MSYS OR MINGW) target_link_libraries(${STLINK_LIB_STATIC} ${LIBUSB_LIBRARY} wsock32 ws2_32 ${SSP_LIB}) else () target_link_libraries(${STLINK_LIB_STATIC} ${LIBUSB_LIBRARY} ${SSP_LIB}) endif () set_target_properties(${STLINK_LIB_STATIC} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) if (STLINK_STATIC_LIB) install(TARGETS ${STLINK_LIB_STATIC} ARCHIVE DESTINATION ${STLINK_LIBRARY_PATH}) endif () ### # Tools ### add_executable(st-flash src/tools/flash.c src/tools/flash_opts.c) if (WIN32 OR APPLE) target_link_libraries(st-flash ${STLINK_LIB_STATIC} ${SSP_LIB}) else () target_link_libraries(st-flash ${STLINK_LIB_SHARED} ${SSP_LIB}) endif () add_executable(st-info src/tools/info.c) if (WIN32 OR APPLE) target_link_libraries(st-info ${STLINK_LIB_STATIC} ${SSP_LIB}) else () target_link_libraries(st-info ${STLINK_LIB_SHARED} ${SSP_LIB}) endif () install(TARGETS st-flash st-info RUNTIME DESTINATION bin) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") if (STLINK_INSTALL_MODPROBE_CONF) install(FILES etc/modprobe.d/stlink_v1.conf DESTINATION ${STLINK_MODPROBED_DIR}/) endif () if (STLINK_INSTALL_UDEV_RULES) file(GLOB RULES_FILES etc/udev/rules.d/*.rules) install(FILES ${RULES_FILES} DESTINATION ${STLINK_UDEV_RULES_DIR}/) endif () endif () add_subdirectory(src/gdbserver) add_subdirectory(src/tools/gui) ### # Others ### add_subdirectory(usr/lib/pkgconfig) add_subdirectory(include) add_subdirectory(doc/man) add_subdirectory(tests) include(cmake/cpack_config.cmake) include(CPack) ### # Uninstall target ### if (NOT TARGET uninstall) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) add_custom_target( uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake ) endif ()