Thread Previous • Date Previous • Date Next • Thread Next |
Hello,I have updated my patch for this problem and managed to get it into CMake upstream. Since it will be included in CMake 3.9 and I think KiCAD is not going to switch to new version of CMake soon, I think it might be useful to include this patch also in the KiCADs copy of FindwxWidgets.cmake.
Patch attached. Honza Dne 20.3.2017 v 20:49 Jan Mrázek napsal(a):
Hi,I have taken your points in account and made a much nicer solution (patch attached).Dne 20.3.2017 v 18:33 Wayne Stambaugh napsal(a):On 3/20/2017 11:15 AM, Jan Mrázek wrote:There are no missing headers, only some parts of the headers are #ifdefed out. This is the reason I looked for the build configuration.According to guys from wxWidgets team, #ifdefed parts of the headers aredefined by the packed libraries.I wasn't talking about the #ifdefed out parts of the wx headers. If libwxbase3.0-dev is not installed, none of the wx header are installed even though wx-config is installed. That is the fundamental problem. Finding the libraries will not resolve the build issues.I agree with you, that the solution is not ideal and the ideal solution is probably out-of KiCAD's scope. But on the other hand, I think it is not a good situation, when project build can fail with a mysteriouserror on two commonly-spread distributions. Maybe just showing a warningin CMake ("Following libraries are missing. Please check that your distribution of wxWidgets.") might be a good compromise?The config should always fail when there are missing build dependencies. What really should happen is the cmake find() macros should be used to confirm the appropriate library and header files are install on the system. You could use wx-config to determine to appropriate install paths and library names but you still need to use find() to verify they actually exist on the system.Dne 20.3.2017 v 15:55 Wayne Stambaugh napsal(a):I'm confused as to why you are checking for just the libraries ratherthan the missing headers which cause the build error. The libraries can be present and the headers still missing since libwxbase3.0-dev is not adependency of libwxbase3.0 so kicad will fail to build in this case. The opposite cannot happen as libwxbase3.0 is a dependency for libwxbase3.0-dev. This is the way wxwidgets is packaged in Debain so I'm guessing Ubuntu is the same.IMO, the real problem lies in the packaging of wxwidgets. The wx-configfile is part of the wxcommon package which doesn't make much sense to me. Should it not be distributed with the libwxbase3.0-dev package? AFAICK, wx-config is used to determine the build configuration forwxwidgets. What other purpose would it be used for? I would think thatthe only reason you would need to call wx-config is when compiling a program that depends on wxwidgets which would require both the headers and libraries. The other issue I see with this patch is that it depends on the help output of wx-config. I would think that depending on this to be consistent might be wishful thinking leading to maintenance issues. I am not thrilled with the idea of patching our build config to fix what seems to me to be a packaging issue. On 3/20/2017 10:16 AM, Jan Mrázek wrote:Both official one and KiCad one version of FindwxWidgets.cmake do not check if all the required components are part of the wxWidgets build. This couses trouble on Ubuntu when user misses libwxgtk3.0-dev package - CMake succeeds, build does not. Probably only posibility to get a list of components is to grep output of wx-config. Base component is removed from the dependencies as it is not present on GUI builds of wxWidgets. Fixes: lp:1630020 * https://bugs.launchpad.net/kicad/+bug/1630020 --- CMakeLists.txt | 2 +- CMakeModules/FindwxWidgets.cmake | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18f2052e1..63f5b17a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -511,7 +511,7 @@ add_definitions( -DWX_COMPATIBILITY ) # See line 41 of CMakeModules/FindwxWidgets.cmake set( wxWidgets_CONFIG_OPTIONS ${wxWidgets_CONFIG_OPTIONS} --static=no ) -find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml stc REQUIRED ) +find_package( wxWidgets 3.0.0 REQUIRED gl aui adv html core net xml stc ) # Include wxWidgets macros. include( ${wxWidgets_USE_FILE} ) diff --git a/CMakeModules/FindwxWidgets.cmake b/CMakeModules/FindwxWidgets.cmake index 9a6e56f7b..cb13bf93a 100644 --- a/CMakeModules/FindwxWidgets.cmake +++ b/CMakeModules/FindwxWidgets.cmake @@ -141,6 +141,7 @@ # # Miguel A. Figueroa-Villanueva (miguelf at ieee dot org). # Jan Woetzel (jw at mip.informatik.uni-kiel.de). +# Jan Mrázek (email at honzamrazek.cz) # # Based on previous works of: # Jan Woetzel (FindwxWindows.cmake), @@ -728,6 +729,38 @@ else() endforeach() endmacro() + # + # Check if all the required libraries are present in the build. The only way + # to find out the list of libraries is to run wx-config and grep its output + # - libraries are hardcoded in the help text. + # + macro(WX_CONFIG_CHECK_LIBS) + execute_process( + COMMAND "${wxWidgets_CONFIG_EXECUTABLE}" + OUTPUT_VARIABLE _wx_selected_config + ERROR_VARIABLE _wx_selected_config + RESULT_VARIABLE _wx_result + ERROR_QUIET + ) + string(REGEX MATCH "Available libraries in this build are:\n(.*)\n" + _wx_available_libs ${_wx_selected_config}) + string(REGEX REPLACE "Available libraries in this build are:\n(.*)\n" + "\\1" _wx_available_libs ${_wx_available_libs}) + string(STRIP _wx_available_libs ${_wx_available_libs}) + string(REPLACE " " ";" _wx_available_libs "${_wx_available_libs}") + foreach(lib ${wxWidgets_FIND_COMPONENTS}) + list(FIND _wx_available_libs "${lib}" _index) + if (${_index} LESS 0) + list(APPEND _missing ${lib}) + DBG_MSG("Library ${lib} not found") + endif() + endforeach() + if (_missing) + string(REPLACE ";" " " _missing "${_missing}") + message(FATAL_ERROR "Missing following wxWidgets libraris: ${_missing}") + endif() + endmacro() + #----------------------------------------------------------------- # UNIX: Start actual work. #----------------------------------------------------------------- @@ -741,6 +774,9 @@ else() if(wxWidgets_CONFIG_EXECUTABLE) set(wxWidgets_FOUND TRUE) + # check if current build supports all required libraries + WX_CONFIG_CHECK_LIBS() + # get defaults based on "wx-config --selected-config" WX_CONFIG_SELECT_GET_DEFAULT()_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp
>From 0632545ddc6bf42082049a13a52060bf6ce95566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Mr=C3=A1zek?= <email@xxxxxxxxxxxxxx> Date: Sun, 19 Mar 2017 20:26:53 +0100 Subject: [PATCH] Check required libraries in FindwxWidgets.cmake Both official one and KiCad one version of FindwxWidgets.cmake do not check if all the required components are part of the wxWidgets build. This couses trouble on Ubuntu when user misses libwxgtk3.0-dev package - CMake succeeds, build does not. This fix was accepted also to the CMake 3.9 upstream (https://gitlab.kitware.com/cmake/cmake/merge_requests/704). Fixes: lp:1630020 * https://bugs.launchpad.net/kicad/+bug/1630020 --- CMakeModules/FindwxWidgets.cmake | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CMakeModules/FindwxWidgets.cmake b/CMakeModules/FindwxWidgets.cmake index 9a6e56f7b..6a8dc90e7 100644 --- a/CMakeModules/FindwxWidgets.cmake +++ b/CMakeModules/FindwxWidgets.cmake @@ -141,6 +141,7 @@ # # Miguel A. Figueroa-Villanueva (miguelf at ieee dot org). # Jan Woetzel (jw at mip.informatik.uni-kiel.de). +# Jan Mrázek (email at honzamrazek.cz) # # Based on previous works of: # Jan Woetzel (FindwxWindows.cmake), @@ -880,6 +881,27 @@ else() endif() endif() +# Check that all libraries are present, as wx-config does not check it +foreach(_wx_lib_ ${wxWidgets_LIBRARIES}) + if("${_wx_lib_}" MATCHES "^-l(.*)") + set(_wx_lib_name "${CMAKE_MATCH_1}") + unset(_wx_lib_found CACHE) + find_library(_wx_lib_found NAMES ${_wx_lib_name} HINTS ${wxWidgets_LIBRARY_DIRS}) + if(_wx_lib_found STREQUAL _wx_lib_found-NOTFOUND) + list(APPEND _wx_lib_missing ${_wx_lib_name}) + endif() + unset(_wx_lib_found CACHE) + endif() +endforeach() + +if (_wx_lib_missing) + string(REPLACE ";" " " _wx_lib_missing "${_wx_lib_missing}") + DBG_MSG_V("wxWidgets not found due to following missing libraries: ${_wx_lib_missing}") + set(wxWidgets_FOUND FALSE) + unset(wxWidgets_LIBRARIES) +endif() + + # Check if a specfic version was requested by find_package(). if(wxWidgets_FOUND) find_file(_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS} NO_DEFAULT_PATH) -- 2.11.0
Thread Previous • Date Previous • Date Next • Thread Next |