diff --git a/CMakeLists.txt b/CMakeLists.txt index ae8bb5b..b87fcb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -196,6 +196,9 @@ target_link_libraries(openFPGALoader if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") # winsock provides ntohs target_link_libraries(openFPGALoader ws2_32) + + target_sources(openFPGALoader PRIVATE src/pathHelper.cpp) + list(APPEND OPENFPGALOADER_HEADERS src/pathHelper.hpp) endif() # libusb_attach_kernel_driver is only available on Linux. diff --git a/scripts/msys2/PKGBUILD b/scripts/msys2/PKGBUILD index 1b4638c..51376e9 100644 --- a/scripts/msys2/PKGBUILD +++ b/scripts/msys2/PKGBUILD @@ -27,7 +27,7 @@ build() { -G "MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${MINGW_PREFIX}" \ ../../../.. - cmake --build . + MSYS2_ARG_CONV_EXCL="-DDATA_DIR=" cmake --build . } check() { diff --git a/src/altera.cpp b/src/altera.cpp index 70d0d67..fdef8c3 100644 --- a/src/altera.cpp +++ b/src/altera.cpp @@ -14,6 +14,9 @@ #include "epcq.hpp" #include "progressBar.hpp" #include "rawParser.hpp" +#if defined (_WIN64) || defined (_WIN32) +#include "pathHelper.hpp" +#endif #define IDCODE 6 #define USER0 0x0C @@ -181,6 +184,11 @@ bool Altera::load_bridge() bitname += _device_package + ".rbf"; #endif +#if defined (_WIN64) || defined (_WIN32) + /* Convert relative path embedded at compile time to an absolute path */ + bitname = PathHelper::absolutePath(bitname); +#endif + std::cout << "use: " << bitname << std::endl; /* first: load spi over jtag */ diff --git a/src/pathHelper.cpp b/src/pathHelper.cpp new file mode 100644 index 0000000..301ddc7 --- /dev/null +++ b/src/pathHelper.cpp @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 +/* + * Copyright (C) 2022 Greg Davill + */ + +#if defined (_WIN64) || defined (_WIN32) +#include "pathHelper.hpp" + +#include +#include +#include +#include +#include + +std::string PathHelper::absolutePath(std::string input_path) { + + /* Attempt to execute cygpath */ + std::string cmd = std::string("cygpath -m " + input_path); + + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); + if (!pipe) { + /* If cygpath fails to run, return original path */ + return input_path; + } + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + + /* Trim trailing newline */ + static const std::regex tws{"[[:space:]]*$", std::regex_constants::extended}; + return std::regex_replace(result, tws, ""); +} + +#endif \ No newline at end of file diff --git a/src/pathHelper.hpp b/src/pathHelper.hpp new file mode 100644 index 0000000..203653f --- /dev/null +++ b/src/pathHelper.hpp @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +/* + * Copyright (C) 2022 Greg Davill + */ + +#if defined (_WIN64) || defined (_WIN32) +#include + +class PathHelper{ + public: + static std::string absolutePath(std::string input_path); +}; +#endif diff --git a/src/xilinx.cpp b/src/xilinx.cpp index 580b3bd..e67f53f 100644 --- a/src/xilinx.cpp +++ b/src/xilinx.cpp @@ -24,6 +24,9 @@ #include "xilinxMapParser.hpp" #include "part.hpp" #include "progressBar.hpp" +#if defined (_WIN64) || defined (_WIN32) +#include "pathHelper.hpp" +#endif Xilinx::Xilinx(Jtag *jtag, const std::string &filename, const std::string &file_type, @@ -323,6 +326,11 @@ bool Xilinx::load_bridge() std::string bitname = DATA_DIR "/openFPGALoader/spiOverJtag_"; bitname += _device_package + ".bit.gz"; +#if defined (_WIN64) || defined (_WIN32) + /* Convert relative path embedded at compile time to an absolute path */ + bitname = PathHelper::absolutePath(bitname); +#endif + std::cout << "use: " << bitname << std::endl; /* first: load spi over jtag */