Skip to content

Commit 4990b66

Browse files
author
runelauridsen
committed
Make path to .chip files relative to installation directory on Windows
1 parent 25785b9 commit 4990b66

File tree

3 files changed

+34
-9
lines changed

3 files changed

+34
-9
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
build
2+
build-mingw
23
build-mingw-32
34
build-mingw-64
45

CMakeLists.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@ if (STLINK_HAVE_UNISTD_H)
128128
add_definitions(-DSTLINK_HAVE_UNISTD_H)
129129
endif()
130130

131-
CHECK_INCLUDE_FILE(dirent.h STLINK_HAVE_DIRENT_H)
132-
if (STLINK_HAVE_DIRENT_H)
133-
add_definitions(-DSTLINK_HAVE_DIRENT_H)
131+
if (NOT WIN32) # Use GetModuleFileNameA and FindFirstFileA on Windows
132+
CHECK_INCLUDE_FILE(dirent.h STLINK_HAVE_DIRENT_H)
133+
if (STLINK_HAVE_DIRENT_H)
134+
add_definitions(-DSTLINK_HAVE_DIRENT_H)
135+
endif()
134136
endif()
135137

136138
if (MSVC)
@@ -380,7 +382,7 @@ endif()
380382

381383
# MCU configuration files
382384
if (WIN32)
383-
set(CMAKE_CHIPS_DIR ${CMAKE_INSTALL_PREFIX}/config/chips)
385+
set(CMAKE_CHIPS_DIR ./config/chips)
384386
else ()
385387
set(CMAKE_CHIPS_DIR ${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/chips)
386388
endif ()

src/stlink-lib/chipid.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,14 +250,35 @@ void init_chipids(char *dir_to_scan) {
250250
HANDLE hFind = INVALID_HANDLE_VALUE;
251251
WIN32_FIND_DATAA ffd;
252252
char filepath[MAX_PATH] = {0};
253+
DWORD filepathlen;
254+
int numslash;
253255
StringCchCopyA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan);
254256

255-
if (FAILED(
256-
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\*.chip"))) {
257-
ELOG("Path to chips's dir too long.\n");
257+
filepathlen = GetModuleFileNameA(NULL, filepath, STLINK_ARRAY_SIZE(filepath));
258+
if (filepathlen == 0) {
259+
ELOG("GetModuleFileNameA failed: %u\n", (unsigned)GetLastError());
258260
return;
259261
}
260262

263+
// Chop off exe and bin directory to get installation directory
264+
// 'C:\path-to-stlink\bin\st-util.exe' -> 'C:\path-to-stlink'
265+
numslash = 2;
266+
while (filepathlen > 0 && numslash > 0) {
267+
if (filepath[filepathlen - 1] == '\\') {
268+
numslash--;
269+
}
270+
filepathlen--;
271+
}
272+
if (filepathlen <= 0) {
273+
ELOG("GetModuleFileNameA returned an invalid path: %s\n", filepath);
274+
return;
275+
}
276+
277+
filepath[filepathlen] = '\0';
278+
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\");
279+
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan);
280+
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\*.chip");
281+
261282
hFind = FindFirstFileA(filepath, &ffd);
262283

263284
if (INVALID_HANDLE_VALUE == hFind) {
@@ -266,8 +287,9 @@ void init_chipids(char *dir_to_scan) {
266287
}
267288

268289
do {
269-
memset(filepath, 0, STLINK_ARRAY_SIZE(filepath));
270-
StringCchCopyA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan);
290+
filepath[filepathlen] = '\0';
291+
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\");
292+
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), dir_to_scan);
271293
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), "\\");
272294
StringCchCatA(filepath, STLINK_ARRAY_SIZE(filepath), ffd.cFileName);
273295
process_chipfile(filepath);

0 commit comments

Comments
 (0)