[sword-devel] Win32 FileMgr Subclass

Troy A. Griffitts scribe at crosswire.org
Mon Jul 27 04:41:34 EDT 2020


That crazy cmake line certain did work to configure a cross-compile.  
Someone needs to write that one down somewhere.

So, I've included <wchar.h> in filemgr.cpp and this seems to resolve 
this for mingw.  I get a bunch of .EXEs in utilities, so I think it worked.

I'll commit, and then go back and be sure I haven't broken the build on 
BCB.  I trust Microsoft VC++ has wchar.h available so it shouldn't break 
with the new change.

And now I think we have 3 Microsoft compilers building (I hesitate to 
say "working" until we get confirmation that app using pristine SWORD 
can indeed work in paths above UTF-8 single byte on Windows.

Thanks for your help Greg and Tobias.  It was great to have support 
through this long dreaded task.

Happy Monday!

Troy


On 7/27/20 7:57 AM, Greg Hellings wrote:
> If you're missing dependencies you should be able to do, "dnf builddep 
> mingw-sword".
>
> --Greg
>
> On Mon, Jul 27, 2020 at 1:33 AM Greg Hellings <greg.hellings at gmail.com 
> <mailto:greg.hellings at gmail.com>> wrote:
>
>
>
>     On Sun, Jul 26, 2020 at 4:56 PM Tobias Klein <contact at tklein.info
>     <mailto:contact at tklein.info>> wrote:
>
>         Hi Troy,
>
>         The latest version builds successfully.
>
>         I created a new intermediate release of sword-build-win32 for
>         further testing on Windows:
>
>     It's still failing for me trying to do a cross-compile with MinGW:
>
>     [  6%] Building CXX object
>     CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj
>     /usr/bin/i686-w64-mingw32-g++ -DCLUCENE2 -DCURLAVAILABLE
>     -DCURLSFTPAVAILABLE -DEXCLUDEBZIP2 -DEXCLUDEXZ
>     -DGLOBCONFPATH=\"/usr/i686-w64-mingw32/sys-root/mingw/etc/sword.conf\"
>     -DUSEICUREGEX -DUSELUCENE -DU_USING_ICU_NAMESPACE
>     -D_FTPLIB_NO_COMPAT -D_ICU_ -Dsword_EXPORTS
>     @CMakeFiles/sword.dir/includes_CXX.rsp -D_ICUSWORD_ -g3 -Wall -O0
>     -D_ICUSWORD_ -o CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj -c
>     /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp
>     /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp: In static
>     member function 'static int sword::FileMgr::createParent(const
>     char*)':
>     /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:439:5:
>     error: '_wmkdir' was not declared in this scope; did you mean 'mkdir'?
>       439 |     _wmkdir((const wchar_t *)utf8ToWChar(buf).getRawData());
>           |     ^~~~~~~
>           |     mkdir
>     make[2]: *** [CMakeFiles/sword.dir/build.make:282:
>     CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj] Error 1
>     make[2]: Leaving directory
>     '/builddir/build/BUILD/sword-1.8.900/build_win32'
>     make[1]: Leaving directory
>     '/builddir/build/BUILD/sword-1.8.900/build_win32'
>     make[1]: *** [CMakeFiles/Makefile2:277: CMakeFiles/sword.dir/all]
>     Error 2
>     make: *** [Makefile:152: all] Error 2
>     make: Leaving directory
>     '/builddir/build/BUILD/sword-1.8.900/build_win32'
>
>     Commands to do the build, from Fedora 32, include this lovely
>     invocation of CMake from within a subfolder of the source
>     (build_win32 for the above):
>     /usr/bin/cmake
>     -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw32.cmake
>     -DBUILD_SHARED_LIBS:BOOL=ON
>     -DSYSCONF_INSTALL_DIR:PATH=/usr/i686-w64-mingw32/sys-root/mingw/etc
>     -DSHARE_INSTALL_PREFIX:PATH=/usr/i686-w64-mingw32/sys-root/mingw/share
>     -DCMAKE_INSTALL_PREFIX:PATH=/usr/i686-w64-mingw32/sys-root/mingw
>     -DCMAKE_INSTALL_LIBDIR:PATH=/usr/i686-w64-mingw32/sys-root/mingw/lib
>     -DICU_CONFIG_BIN_PATH=/usr/i686-w64-mingw32/sys-root/mingw/bin
>     -DINCLUDE_INSTALL_DIR:PATH=/usr/i686-w64-mingw32/sys-root/mingw/include
>     -DCMAKE_VERBOSE_MAKEFILE=ON -DLIBSWORD_LIBRARY_TYPE=Shared
>     -DSWORD_BUILD_EXAMPLES=Yes -DCMAKE_BUILD_TYPE=Debug
>     -DICU_CONFIG_OPTS=--noverify -DCROSS_COMPILE_MINGW32=TRUE ..
>
>     Followed by
>
>     make
>
>     --Greg
>
>         https://github.com/tobias-klein/sword-build-win32/releases/tag/v1.8.900-2020-07-26
>
>         Best regards,
>         Tobias
>
>         On 7/26/20 8:37 PM, Troy A. Griffitts wrote:
>>
>>         Thanks Tobias,
>>
>>         I've made these updates and should have fixed the error in
>>         filemgr.cpp on line 410. I appreciate the feedback.  Please
>>         update and try this out and let me know.  Thanks for testing
>>         your compiler.
>>
>>         Troy
>>
>>
>>         On 7/26/20 8:25 PM, Tobias Klein wrote:
>>>
>>>         To address the errors below I had to add the include for
>>>         <windows.h> both in *src/mgr/filemgr.cpp* and in
>>>         *src/modules/commons/zipmgr.cpp*.
>>>
>>>         After that I'm getting the next error:
>>>
>>>         1>C:\Users\tobi\Dev\sword-build-win32\sword\src\mgr\filemgr.cpp(410):
>>>         error C2664: 'BOOL
>>>         FindNextFileA(HANDLE,LPWIN32_FIND_DATAA)': cannot convert
>>>         argument 2 from 'WIN32_FIND_DATAW *' to 'LPWIN32_FIND_DATAA'
>>>         1>C:\Users\tobi\Dev\sword-build-win32\sword\src\mgr\filemgr.cpp(410):
>>>         note: Types pointed to are unrelated; conversion requires
>>>         reinterpret_cast, C-style cast or function-style cast
>>>
>>>         Best regards,
>>>         Tobias
>>>
>>>         On 7/26/20 4:44 PM, Troy A. Griffitts wrote:
>>>>
>>>>         Can one of you guys try simply including <windows.h> at the
>>>>         top of filemgr.cpp and see if this fixes it for you?
>>>>
>>>>
>>>>         On 7/26/20 4:01 PM, Tobias Klein wrote:
>>>>>
>>>>>         I'm getting similar error messages with Visual Studio
>>>>>         2019. Note that I'm also generating the make files via CMake.
>>>>>
>>>>>         First couple of error messages:
>>>>>
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(395,2):
>>>>>         error C2065: 'WIN32_FIND_DATAW': undeclared identifier
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(395,19):
>>>>>         error C2146: syntax error: missing ';' before identifier
>>>>>         'fileData'
>>>>>
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(395,19):
>>>>>         error C2065: 'fileData': undeclared identifier
>>>>>
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(398,2):
>>>>>         error C2065: 'HANDLE': undeclared identifier
>>>>>
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(398,9):
>>>>>         error C2146: syntax error: missing ';' before identifier
>>>>>         'findIterator'
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(398,9):
>>>>>         error C2065: 'findIterator': undeclared identifier
>>>>>         2>D:\a\sword-build-win32\sword-build-win32\sword\src\mgr\filemgr.cpp(398,51):
>>>>>         error C2065: 'fileData': undeclared identifier
>>>>>
>>>>>
>>>>>         Best regards,
>>>>>         Tobias
>>>>>
>>>>>         On 7/26/20 3:00 PM, Greg Hellings wrote:
>>>>>>
>>>>>>
>>>>>>         On Sun, Jul 26, 2020 at 6:42 AM Troy A. Griffitts
>>>>>>         <scribe at crosswire.org <mailto:scribe at crosswire.org>> wrote:
>>>>>>
>>>>>>             I've just committed the last bit for fixing the WIN32
>>>>>>             Unicode issues.  If anyone can try compiling and
>>>>>>             running Xiphos without the Xiphos patch or any other
>>>>>>             projects for Windows, and let me know if things work
>>>>>>             for them in folders which include Unicode character,
>>>>>>             I would appreciate it.  I've tested BibleCS and it
>>>>>>             now works with a SWORD_PATH defined to /books/χαρις. 
>>>>>>             I've tested using and installing modules in this
>>>>>>             configuration and believe all the bugs are squashed,
>>>>>>             but I would love confirmation from other projects.
>>>>>>
>>>>>>             Thanks for any feedback,
>>>>>>
>>>>>>             Troy
>>>>>>
>>>>>>         During cross-compile I'm getting the following errors:
>>>>>>
>>>>>>         [  6%] Building CXX object
>>>>>>         CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj
>>>>>>         /usr/bin/i686-w64-mingw32-g++  -DCLUCENE2 -DCURLAVAILABLE
>>>>>>         -DCURLSFTPAVAILABLE -DEXCLUDEBZIP2 -DEXCLUDEXZ
>>>>>>         -DGLOBCONFPATH=\"/usr/i686-w64-mingw32/sys-root/mingw/etc/sword.conf\"
>>>>>>         -DUSEICUREGEX -DUSELUCENE -DU_USING_ICU_NAMESPACE
>>>>>>         -D_FTPLIB_NO_COMPAT -D_ICU_ -Dsword_EXPORTS
>>>>>>         @CMakeFiles/sword.dir/includes_CXX.rsp -D_ICUSWORD_ -g3
>>>>>>         -Wall -O0 -D_ICUSWORD_   -o
>>>>>>         CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj -c
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:
>>>>>>         In static member function 'static
>>>>>>         std::vector<sword::DirEntry>
>>>>>>         sword::FileMgr::getDirList(const char*, bool, bool)':
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:395:2:
>>>>>>         error: 'WIN32_FIND_DATAW' was not declared in this scope
>>>>>>           395 |  WIN32_FIND_DATAW fileData;
>>>>>>               |  ^~~~~~~~~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:398:2:
>>>>>>         error: 'HANDLE' was not declared in this scope
>>>>>>           398 |  HANDLE findIterator = FindFirstFileW(wcharPath,
>>>>>>         &fileData);
>>>>>>               |  ^~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:399:6:
>>>>>>         error: 'findIterator' was not declared in this scope
>>>>>>           399 |  if (findIterator != INVALID_HANDLE_VALUE) {
>>>>>>               |      ^~~~~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:399:22:
>>>>>>         error: 'INVALID_HANDLE_VALUE' was not declared in this scope
>>>>>>           399 |  if (findIterator != INVALID_HANDLE_VALUE) {
>>>>>>               |  ^~~~~~~~~~~~~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:401:35:
>>>>>>         error: 'fileData' was not declared in this scope
>>>>>>           401 |    SWBuf dirEntName =
>>>>>>         wcharToUTF8(fileData.cFileName);
>>>>>>               |       ^~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:405:49:
>>>>>>         error: 'FILE_ATTRIBUTE_DIRECTORY' was not declared in
>>>>>>         this scope
>>>>>>           405 |     i.isDirectory = fileData.dwFileAttributes &
>>>>>>         FILE_ATTRIBUTE_DIRECTORY;
>>>>>>               | ^~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:409:40:
>>>>>>         error: 'fileData' was not declared in this scope
>>>>>>           409 |   } while (FindNextFile(findIterator, &fileData)
>>>>>>         != 0);
>>>>>>               |            ^~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:409:12:
>>>>>>         error: 'FindNextFile' was not declared in this scope
>>>>>>           409 |   } while (FindNextFile(findIterator, &fileData)
>>>>>>         != 0);
>>>>>>               |            ^~~~~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:410:3:
>>>>>>         error: 'FindClose' was not declared in this scope; did
>>>>>>         you mean '_findclose'?
>>>>>>           410 |   FindClose(findIterator);
>>>>>>               |   ^~~~~~~~~
>>>>>>               |   _findclose
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:397:17:
>>>>>>         warning: unused variable 'wcharPath' [-Wunused-variable]
>>>>>>           397 |  const wchar_t *wcharPath = (const wchar_t
>>>>>>         *)wcharBuf.getRawData();
>>>>>>               |                 ^~~~~~~~~
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:
>>>>>>         In static member function 'static int
>>>>>>         sword::FileMgr::createParent(const char*)':
>>>>>>         /builddir/build/BUILD/sword-1.8.900/src/mgr/filemgr.cpp:436:5:
>>>>>>         error: '_wmkdir' was not declared in this scope; did you
>>>>>>         mean 'mkdir'?
>>>>>>           436 |     _wmkdir((const wchar_t
>>>>>>         *)utf8ToWChar(buf).getRawData());
>>>>>>               |     ^~~~~~~
>>>>>>               |     mkdir
>>>>>>         make[2]: *** [CMakeFiles/sword.dir/build.make:283:
>>>>>>         CMakeFiles/sword.dir/src/mgr/filemgr.cpp.obj] Error 1
>>>>>>
>>>>>>         I'm assuming there's a new package or macro I need to
>>>>>>         define? On my system the WIN32_FIND_DATAW struct is
>>>>>>         defined in both minwinbase.h and shtypes.h. I'm building
>>>>>>         with MinGW which might have a different header structure
>>>>>>         than your compilers, if you're using Borland?
>>>>>>
>>>>>>         --Greg
>>>>>>
>>>>>>
>>>>>>             On 7/20/20 7:18 PM, Greg Hellings wrote:
>>>>>>>             Sorry for the previous blank email - user error when
>>>>>>>             I tried to reply:
>>>>>>>
>>>>>>>             On Sun, Jul 19, 2020 at 2:40 PM Tobias Klein
>>>>>>>             <contact at tklein.info <mailto:contact at tklein.info>>
>>>>>>>             wrote:
>>>>>>>
>>>>>>>                 Thanks for giving me the background on this,
>>>>>>>                 Karl! I appreciate it!
>>>>>>>
>>>>>>>                 Is Xiphos the only frontend that has been
>>>>>>>                 patching Sword for this purpose? Then I suppose
>>>>>>>                 all other frontends suffer from this issue, huh?
>>>>>>>
>>>>>>>
>>>>>>>             When I first encountered this patch in Xiphos I
>>>>>>>             tested with BibleTime and The Sword Project for
>>>>>>>             Windows and both of them do crash under these
>>>>>>>             circumstances.
>>>>>>>
>>>>>>>             Yes, other toolkits such as Qt do have wrappers for
>>>>>>>             this shortcoming already, but none of the other
>>>>>>>             front ends I've worked with have bothered to put in
>>>>>>>             the effort to produce a patched version of Sword to
>>>>>>>             fix the crash.
>>>>>>>
>>>>>>>             --Greg
>>>>>>>
>>>>>>>             _______________________________________________
>>>>>>>             sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>>>>>>             http://www.crosswire.org/mailman/listinfo/sword-devel
>>>>>>>             Instructions to unsubscribe/change your settings at above page
>>>>>>             _______________________________________________
>>>>>>             sword-devel mailing list: sword-devel at crosswire.org
>>>>>>             <mailto:sword-devel at crosswire.org>
>>>>>>             http://www.crosswire.org/mailman/listinfo/sword-devel
>>>>>>             Instructions to unsubscribe/change your settings at
>>>>>>             above page
>>>>>>
>>>>>>
>>>>>>         _______________________________________________
>>>>>>         sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>>>>>         http://www.crosswire.org/mailman/listinfo/sword-devel
>>>>>>         Instructions to unsubscribe/change your settings at above page
>>>>>
>>>>>         _______________________________________________
>>>>>         sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>>>>         http://www.crosswire.org/mailman/listinfo/sword-devel
>>>>>         Instructions to unsubscribe/change your settings at above page
>>>>
>>>>         _______________________________________________
>>>>         sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>>>         http://www.crosswire.org/mailman/listinfo/sword-devel
>>>>         Instructions to unsubscribe/change your settings at above page
>>>
>>>         _______________________________________________
>>>         sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>>         http://www.crosswire.org/mailman/listinfo/sword-devel
>>>         Instructions to unsubscribe/change your settings at above page
>>
>>         _______________________________________________
>>         sword-devel mailing list:sword-devel at crosswire.org  <mailto:sword-devel at crosswire.org>
>>         http://www.crosswire.org/mailman/listinfo/sword-devel
>>         Instructions to unsubscribe/change your settings at above page
>         _______________________________________________
>         sword-devel mailing list: sword-devel at crosswire.org
>         <mailto:sword-devel at crosswire.org>
>         http://www.crosswire.org/mailman/listinfo/sword-devel
>         Instructions to unsubscribe/change your settings at above page
>
>
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/sword-devel/attachments/20200727/df7b7208/attachment-0001.html>


More information about the sword-devel mailing list