From 4990b661948cee62730408a150bd2b94126882c8 Mon Sep 17 00:00:00 2001 From: runelauridsen Date: Fri, 23 Aug 2024 08:28:32 +0200 Subject: [PATCH] Make path to .chip files relative to installation directory on Windows --- .gitignore | 1 + CMakeLists.txt | 10 ++++++---- src/stlink-lib/chipid.c | 32 +++++++++++++++++++++++++++----- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 1a5fd5ab1..6566dedf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build +build-mingw build-mingw-32 build-mingw-64 diff --git a/CMakeLists.txt b/CMakeLists.txt index 59d9970a7..ee075dd23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,9 +128,11 @@ if (STLINK_HAVE_UNISTD_H) add_definitions(-DSTLINK_HAVE_UNISTD_H) endif() -CHECK_INCLUDE_FILE(dirent.h STLINK_HAVE_DIRENT_H) -if (STLINK_HAVE_DIRENT_H) - add_definitions(-DSTLINK_HAVE_DIRENT_H) +if (NOT WIN32) # Use GetModuleFileNameA and FindFirstFileA on Windows + CHECK_INCLUDE_FILE(dirent.h STLINK_HAVE_DIRENT_H) + if (STLINK_HAVE_DIRENT_H) + add_definitions(-DSTLINK_HAVE_DIRENT_H) + endif() endif() if (MSVC) @@ -380,7 +382,7 @@ endif() # MCU configuration files if (WIN32) -set(CMAKE_CHIPS_DIR ${CMAKE_INSTALL_PREFIX}/config/chips) +set(CMAKE_CHIPS_DIR ./config/chips) else () set(CMAKE_CHIPS_DIR ${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/chips) endif () diff --git a/src/stlink-lib/chipid.c b/src/stlink-lib/chipid.c index c115089a4..7b705a490 100644 --- a/src/stlink-lib/chipid.c +++ b/src/stlink-lib/chipid.c @@ -250,14 +250,35 @@ void init_chipids(char *dir_to_scan) { HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATAA ffd; char filepath[MAX_PATH] = {0}; + DWORD filepathlen; + int numslash; StringCchCopyA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan); - if (FAILED( - StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\*.chip"))) { - ELOG("Path to chips's dir too long.\n"); + filepathlen = GetModuleFileNameA(NULL, filepath, STLINK_ARRAY_SIZE(filepath)); + if (filepathlen == 0) { + ELOG("GetModuleFileNameA failed: %u\n", (unsigned)GetLastError()); return; } + // Chop off exe and bin directory to get installation directory + // 'C:\path-to-stlink\bin\st-util.exe' -> 'C:\path-to-stlink' + numslash = 2; + while (filepathlen > 0 && numslash > 0) { + if (filepath[filepathlen - 1] == '\\') { + numslash--; + } + filepathlen--; + } + if (filepathlen <= 0) { + ELOG("GetModuleFileNameA returned an invalid path: %s\n", filepath); + return; + } + + filepath[filepathlen] = '\0'; + StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\"); + StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan); + StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\*.chip"); + hFind = FindFirstFileA(filepath, &ffd); if (INVALID_HANDLE_VALUE == hFind) { @@ -266,8 +287,9 @@ void init_chipids(char *dir_to_scan) { } do { - memset(filepath, 0, STLINK_ARRAY_SIZE(filepath)); - StringCchCopyA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan); + filepath[filepathlen] = '\0'; + StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\"); + StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan); StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\"); StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), ffd.cFileName); process_chipfile(filepath);