diff --git a/CMakeLists.txt b/CMakeLists.txt index cd6468dddf..dc2f65330c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -340,35 +340,43 @@ set( KICAD_TEMPLATE ${KICAD_DATA}/template CACHE PATH "Location of KiCad template files." ) if( APPLE ) - # Everything without leading / is relative to CMAKE_INSTALL_PREFIX. + # everything without leading / is relative to CMAKE_INSTALL_PREFIX. # CMAKE_INSTALL_PREFIX is root of .dmg image set( KICAD_BIN ${CMAKE_INSTALL_PREFIX} CACHE PATH "Location of KiCad binaries." FORCE ) + # some paths to single app bundle + set( OSX_BUNDLE_MAIN "kicad.app" ) + set( OSX_BUNDLE_BIN_DIR "Contents/MacOS" ) + set( OSX_BUNDLE_LIB_DIR "Contents/Frameworks" ) + set( OSX_BUNDLE_KIFACE_DIR "Contents/Plugins" ) + set( OSX_BUNDLE_SUP_DIR "Contents/SharedSupport" ) + set( OSX_BUNDLE_BUILD_DIR "${CMAKE_BINARY_DIR}/kicad/${OSX_BUNDLE_MAIN}" ) + set( OSX_BUNDLE_BUILD_BIN_DIR "${OSX_BUNDLE_BUILD_DIR}/${OSX_BUNDLE_BIN_DIR}" ) + set( OSX_BUNDLE_BUILD_LIB_DIR "${OSX_BUNDLE_BUILD_DIR}/${OSX_BUNDLE_LIB_DIR}" ) + set( OSX_BUNDLE_BUILD_KIFACE_DIR "${OSX_BUNDLE_BUILD_DIR}/${OSX_BUNDLE_KIFACE_DIR}" ) + set( OSX_BUNDLE_INSTALL_DIR "${KICAD_BIN}/${OSX_BUNDLE_MAIN}" ) + set( OSX_BUNDLE_INSTALL_BIN_DIR "${OSX_BUNDLE_INSTALL_DIR}/${OSX_BUNDLE_BIN_DIR}" ) + set( OSX_BUNDLE_INSTALL_LIB_DIR "${OSX_BUNDLE_INSTALL_DIR}/${OSX_BUNDLE_LIB_DIR}" ) + set( OSX_BUNDLE_INSTALL_KIFACE_DIR "${OSX_BUNDLE_INSTALL_DIR}/${OSX_BUNDLE_KIFACE_DIR}" ) + # everything provided with the application bundle goes into # kicad.app/Contents/SharedSupport => accessible via GetDataDir() # everything else to the .dmg image - set( KICAD_DATA ${CMAKE_INSTALL_PREFIX}/kicad.app/Contents/SharedSupport + set( KICAD_DATA ${OSX_BUNDLE_INSTALL_DIR}/${OSX_BUNDLE_SUP_DIR} CACHE PATH "Location of KiCad data files." FORCE ) + set( KICAD_TEMPLATE ${KICAD_DATA}/template + CACHE PATH "Location of KiCad template files." FORCE ) set( KICAD_PLUGINS ${KICAD_DATA}/plugins CACHE PATH "Location of KiCad plugins." FORCE ) set( KICAD_DOCS doc CACHE PATH "Location of KiCad documentation files." FORCE ) - set( KICAD_TEMPLATE ${KICAD_DATA}/template - CACHE PATH "Location of KiCad template files." FORCE ) set( KICAD_DEMOS demos CACHE PATH "Location of KiCad demo files." FORCE ) # used to set DEFAULT_FP_LIB_PATH in config.h.cmake, but then never used # set it to correct value just in case (see common.cpp) set( KICAD_FP_LIB_INSTALL_PATH "~/Library/Preferences/kicad" ) - - # path to binaries in single app bundle - set( OSX_BUNDLE_BUILD_BIN_DIR "${CMAKE_BINARY_DIR}/kicad/kicad.app/Contents/MacOS" ) - set( OSX_BUNDLE_INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/kicad.app/Contents/MacOS" ) - - # plugins/libs to additionally relocate during fixup_bundle (e.g., *.kiface added in subfolders) - set( OSX_BUNDLE_PLUGINS "" ) endif() mark_as_advanced( KICAD_BIN @@ -400,13 +408,7 @@ add_definitions( -DWX_COMPATIBILITY ) # See line 41 of CMakeModules/FindwxWidgets.cmake set( wxWidgets_CONFIG_OPTIONS --static=no ) -# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base -# Seems no longer needed on wx-3 -if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) ) - find_package( wxWidgets 3.0.0 COMPONENTS gl adv html core net base xml REQUIRED ) -else() - find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml REQUIRED ) -endif() +find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml REQUIRED ) # Include wxWidgets macros. include( ${wxWidgets_USE_FILE} ) @@ -606,7 +608,18 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) endif() endif() - set( PYTHON_DEST "${PYTHON_SITE_PACKAGE_PATH}" CACHE PATH "Python module install path." ) + if( NOT APPLE ) + set( PYTHON_DEST "${PYTHON_SITE_PACKAGE_PATH}" + CACHE PATH "Python module install path." + ) + else() + # relative path for python in bundle + set( PYTHON_LIB_DIR "python" ) + # install into bundle Frameworks folder + set( PYTHON_DEST "${OSX_BUNDLE_BUILD_LIB_DIR}/${PYTHON_LIB_DIR}" + CACHE PATH "Python module install path." + ) + endif() mark_as_advanced( PYTHON_DEST ) message( STATUS "Python module install path: ${PYTHON_DEST}" ) diff --git a/Documentation/compiling/mac-osx.txt b/Documentation/compiling/mac-osx.txt index e6430ec99a..5570e87efc 100644 --- a/Documentation/compiling/mac-osx.txt +++ b/Documentation/compiling/mac-osx.txt @@ -1,8 +1,8 @@ Compiling KiCad on Apple Mac OS X ================================= -Building on OSX is very similar to building on Linux. This document will provide a -complete walk-through on what to do but it will focus on OSX specific things. +Building on OSX is very similar to building on Linux. This document will provide +a complete walk-through on what to do but it will focus on OSX specific things. See general documentation on non-OSX specific KiCad build switches, etc. @@ -21,25 +21,34 @@ Mandatory library dependencies needed to compile KiCad: * GLEW - The OpenGL Extension Wrangler Library * cairo - 2D graphics library * wxWidgets - Cross-Platform GUI Library + OR + wxPython - A blending of the wxWidgets C++ class library with the Python + programming language Optional library dependencies, depends on used KiCad features * OpenSSL - The Open Source toolkit for SSL/TLS => Needed for github plugin -All tools (except XCode, of course) and all dependencies except wxWidgets can be compiled -manually, but it is advised to install them using your favorite package manager for OSX -like MacPorts or Homebrew. -Depending on the package manager the development packages of the library dependencies -may have to be installed (usually something like -dev or -devel). -Further, depending on the configuration of your package manager packages might have to -be compiled with special flags/variants to support the correct architecture. E.g., some -packages of MacPorts need to have the "+universal" variant set to also include the -x86_64 variant that might be chosen automatically by KiCad build process. +All tools (except XCode, of course) and all dependencies except wxWidgets/wxPython +can be compiled manually, but it is advised to install them using your favorite +package manager for OSX like MacPorts or Homebrew. +Depending on the package manager the development packages of the library +dependencies may have to be installed (usually something like -dev or +-devel). +Further, depending on the configuration of your package manager packages might +have to be compiled with special flags/variants to support the correct +architecture. E.g., some packages of MacPorts need to have the "+universal" +variant set to also include the x86_64 variant that might be chosen +automatically by KiCad build process. IMPORTANT: -At the moment you *must not* use a wxWidgets version installed by any package manager. -KiCad on OSX needs overlay support and some other fixes, which are not yet contained in -mainline wxWidgets sources and builds. +At the moment you *must not* use a wxWidgets/wxPython version installed by any +package manager. +KiCad on OSX needs overlay support and some other fixes, which are not yet +contained in mainline wxWidgets/wxPython sources and builds. +If you don't use a patched wxWidgets you will get graphical artifacts (something +like a magnifying glass effect in the upper left corner of KiCad windows) or +KiCad will just crash on start (due to duplicate libraries). Install now the tools and library dependencies as mentioned above. @@ -47,15 +56,15 @@ Install now the tools and library dependencies as mentioned above. Folder Structure ---------------- -This documentation will use the following folder structure as an example, but it is not -mandatory to do it like that: +This documentation will use the following folder structure as an example, but it +is not mandatory to do it like that: KiCad/ +-- kicad/ KiCad source folder +-- build/ KiCad build folder +-- bin/ KiCad binaries folder - +-- wx-src/ wxWidgets source folder - +-- wx-build/ wxWidgets build folder - +-- wx-bin/ wxWidgets binaries folder + +-- wx-src/ wxWidgets/wxPython source folder + +-- wx-build/ wxWidgets/wxPython build folder + +-- wx-bin/ wxWidgets/wxPython binaries folder Get KiCad sources @@ -67,24 +76,46 @@ Create your work root "KiCad" wherever you like and sync KiCad sources to it: # bzr branch lp:kicad -Compiling wxWidgets -------------------- +Compiling wxWidgets / wxPython +------------------------------ + +If you don't intend to build KiCad with scripting support then you only need +wxWidgets, otherwise you need wxPython (which also contains wxWidgets). Get wxWidgets sources from http://www.wxwidgets.org/downloads/ -and unpack them to the wx-src folder. -It's recommended to use the latest stable (at the time of this writing 3.0.1) version. +or wxPython sources from + http://www.wxpython.org/download.php#source +and unpack it to the wx-src folder. +It is recommended to use the latest stable version. As of this writing this is +3.0.2 for wxWidgets or 3.0.1.1 for wxPython. -Apply the patches needed for KiCad: - # cd wx-src +There is a little helper script osx_build_wx.sh in kicad/scripts that does all +the patching/configuring/compiling of wxWidgets or wxPython for you. +Go to your working root "KiCad" and run: + # kicad/scripts/osx_build_wx.sh wx-src wx-bin kicad "-j4" + +First parameter is the source folder of wxWidgets/wxPython, second parameter the +target folder for compiled binaries, third parameter is the kicad folder, and +the last optional parameter are make options used during the build (in this +case for building with 4 jobs in parallel). +The script will automatically detect if you are compiling wxWidgets or wxPython. +CAUTION: The script will erase existing wx-build and target folders (wx-bin) +without any confirmation! + +If everything went fine during compilation you will now have a working +wxWidgets/wxPython installation in the wx-bin folder. +For building KiCad it is sufficient to keep the wx-bin folder. + +The script doesn't have to be used, the usual "configure/make/make install" will +also work. If you do so, be sure to apply the patches needed for KiCad: # patch -p0 < ../kicad/patches/wxwidgets-3.0.0_macosx.patch # patch -p0 < ../kicad/patches/wxwidgets-3.0.0_macosx_bug_15908.patch # patch -p0 < ../kicad/patches/wxwidgets-3.0.0_macosx_soname.patch +The same patches apply both for wxWidgets and for wxPython. -Configure: - # cd .. - # mkdir wx-build - # cd wx-build +The script uses the following configure command/options for wxWidgets known to +work: # ../wx-src/configure \ --prefix=`pwd`/../wx-bin \ --with-opengl \ @@ -100,31 +131,22 @@ Configure: --with-expat=builtin \ --without-liblzma \ --with-macosx-version-min=10.5 \ + --enable-universal-binary=i386,x86_64 \ CPPFLAGS="-stdlib=libstdc++" \ LDFLAGS="-stdlib=libstdc++" \ CC=clang \ CXX=clang++ - -Build & Install: - # make - ... will take some time ... - # make install - -If everything went fine you will now have a working wxWidgets installation in the wx-bin -folder. -For building KiCad it is sufficient to keep the wx-bin folder. -The above configuration of wxWidgets is known to work, if you know what you are doing -you of course can use different settings. +If you know what you are doing, you can of course use different settings. -Compiling KiCad (without scripting support) -------------------------------------------- +Compiling KiCad +--------------- Change to your working root "KiCad" and create the build folder there: # mkdir build - -Configure KiCad: # cd build + +Now, configure KiCad without scripting support: # cmake ../kicad \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ @@ -135,16 +157,42 @@ Configure KiCad: -DCMAKE_INSTALL_PREFIX=../bin \ -DCMAKE_BUILD_TYPE=Release -Now KiCad is configured using default features/build-switches without scripting support. -See Documentation/compiling/build-config.txt for a list of all CMake options available -when compiling KiCad. +or, configure KiCad with scripting support: + # cmake ../kicad \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DwxWidgets_CONFIG_EXECUTABLE=../wx-bin/bin/wx-config \ + -DPYTHON_EXECUTABLE=`which python` \ + -DPYTHON_SITE_PACKAGE_PATH=`pwd`/../wx-bin/lib/python2.7/site-packages \ + -DKICAD_SCRIPTING=ON \ + -DKICAD_SCRIPTING_MODULES=ON \ + -DKICAD_SCRIPTING_WXPYTHON=ON \ + -DCMAKE_INSTALL_PREFIX=../bin \ + -DCMAKE_BUILD_TYPE=Release +Note, that depending on your python version the "python2.7" part of the +"-DPYTHON_SITE_PACKAGE_PATH" variable might have to be adjusted to what has +been generated when compiling/installing wxPython. If you want to use a specific +python, you can also specify it via "-DPYTHON_EXECUTABLE" instead of using +`which python` (this one will just detect/use you default python). + +Now KiCad is configured using default features/build-switches. +See Documentation/compiling/build-config.txt for a list of all CMake options +available when compiling KiCad. Build & Install: # make ... will take some time ... # make install -Again, if everything went fine you will now have KiCad binaries in the "bin" folder. -KiCad application can be directly run from there to test. -If everything is OK, you can create a .dmg image of your "bin" folder or just copy/install -the KiCad binaries and/or support files (like demos or documentation) wherever you want. +Again, if everything went fine you will now have KiCad binaries in the "bin" +folder. KiCad application can be directly run from there to test. +If everything is OK, you can create a .dmg image of your "bin" folder or just +copy/install the KiCad binaries and/or support files (like demos or +documentation) wherever you want. + +If you resync to newer versions of KiCad you don't have to rebuild wxWidgets or +other dependencies. +CMake should pick up the changes automatically and build correctly. However, it +is advised that you make a clean build to be sure (just delete the build folder +and go again through the configure/build steps). + diff --git a/common/kiway.cpp b/common/kiway.cpp index 9562945030..770e074c20 100644 --- a/common/kiway.cpp +++ b/common/kiway.cpp @@ -114,6 +114,11 @@ const wxString KIWAY::dso_full_path( FACE_T aFaceId ) } wxFileName fn = wxStandardPaths::Get().GetExecutablePath(); +#ifdef __WXMAC__ + // we have the dso's in @executable_path/../Plugins in OSX bundle + fn.RemoveLastDir(); + fn.AppendDir( wxT( "Plugins" ) ); +#endif fn.SetName( name ); diff --git a/cvpcb/CMakeLists.txt b/cvpcb/CMakeLists.txt index 3777db416e..64cca8fc36 100644 --- a/cvpcb/CMakeLists.txt +++ b/cvpcb/CMakeLists.txt @@ -146,10 +146,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( cvpcb_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_cvpcb.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS cvpcb diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index f2c201d44b..4bf4035b09 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -297,10 +297,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( eeschema_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_eeschema.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS eeschema diff --git a/gerbview/CMakeLists.txt b/gerbview/CMakeLists.txt index bbf2a9c566..24ddb5273e 100644 --- a/gerbview/CMakeLists.txt +++ b/gerbview/CMakeLists.txt @@ -140,10 +140,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( gerbview_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_gerbview.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS gerbview diff --git a/kicad/CMakeLists.txt b/kicad/CMakeLists.txt index 6924417a59..31b4875b7f 100644 --- a/kicad/CMakeLists.txt +++ b/kicad/CMakeLists.txt @@ -81,12 +81,46 @@ install( TARGETS kicad COMPONENT binary ) if( APPLE ) + # "install( CODE ... )" will launch its own CMake, so no variables from + # this CMake instance are accessible... use helper to transfer + if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) + set( SCRIPTING_HELPER "1" ) + else() + set( SCRIPTING_HELPER "0" ) + endif() + + # make bundle relocatable install( CODE " - include(BundleUtilities) - fixup_bundle(\"${OSX_BUNDLE_INSTALL_BIN_DIR}/kicad\" - \"${OSX_BUNDLE_PLUGINS}\" - \"\" - ) - " COMPONENT Runtime - ) + # find all libs and modules + file( GLOB BUNDLE_FIX_LIBS ${OSX_BUNDLE_INSTALL_KIFACE_DIR}/*.kiface ) + if( ${SCRIPTING_HELPER} ) + file( GLOB PYTHON_SCRIPTING_SO ${OSX_BUNDLE_INSTALL_LIB_DIR}/${PYTHON_LIB_DIR}/*.so ) + set( BUNDLE_FIX_LIBS \${BUNDLE_FIX_LIBS} \${PYTHON_SCRIPTING_SO} ) + file( GLOB PYTHON_SCRIPTING_SO ${OSX_BUNDLE_INSTALL_LIB_DIR}/${PYTHON_LIB_DIR}/wx/*.so ) + set( BUNDLE_FIX_LIBS \${BUNDLE_FIX_LIBS} \${PYTHON_SCRIPTING_SO} ) + endif() + + # override default embedded path settings + function( gp_item_default_embedded_path_override item default_embedded_path_var ) + # by default, embed things right next to the main bundle executable: + set( path \"@executable_path/../../Contents/MacOS\" ) + set( overridden 0 ) + + # embed .dylibs right next to the main bundle executable: + if( item MATCHES \"\\\\.dylib$\" ) + set( path \"@executable_path/../Frameworks\" ) + set( overridden 1 ) + endif() + + set( \${default_embedded_path_var} \"\${path}\" PARENT_SCOPE ) + endfunction(gp_item_default_embedded_path_override) + + # do all the work + include( BundleUtilities ) + fixup_bundle( ${OSX_BUNDLE_INSTALL_BIN_DIR}/kicad + \"\${BUNDLE_FIX_LIBS}\" + \"\" + ) + " COMPONENT Runtime + ) endif() diff --git a/pagelayout_editor/CMakeLists.txt b/pagelayout_editor/CMakeLists.txt index 691398995e..28141199c2 100644 --- a/pagelayout_editor/CMakeLists.txt +++ b/pagelayout_editor/CMakeLists.txt @@ -115,10 +115,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( pl_editor_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_pl_editor.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS pl_editor diff --git a/pcb_calculator/CMakeLists.txt b/pcb_calculator/CMakeLists.txt index 1fca832700..642eb573b8 100644 --- a/pcb_calculator/CMakeLists.txt +++ b/pcb_calculator/CMakeLists.txt @@ -113,10 +113,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( pcb_calculator_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_pcb_calculator.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS pcb_calculator diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index e3919b5bac..1a6180ae55 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -417,8 +417,9 @@ if( KICAD_SCRIPTING_MODULES ) if( ${OPENMP_FOUND} ) set_property( TARGET _pcbnew APPEND_STRING - PROPERTY LINK_FLAGS " ${OpenMP_CXX_FLAGS}" ) - endif() + PROPERTY LINK_FLAGS " ${OpenMP_CXX_FLAGS}" + ) + endif() endif() @@ -597,10 +598,7 @@ if( USE_KIWAY_DLLS ) RUNTIME_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} ) set_target_properties( pcbnew_kiface PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_BIN_DIR} - ) - set( OSX_BUNDLE_PLUGINS ${OSX_BUNDLE_PLUGINS} "${OSX_BUNDLE_INSTALL_BIN_DIR}/_pcbnew.kiface" - PARENT_SCOPE + LIBRARY_OUTPUT_DIRECTORY ${OSX_BUNDLE_BUILD_KIFACE_DIR} ) else() install( TARGETS pcbnew @@ -686,43 +684,20 @@ add_dependencies( pcbnew lib-dependencies ) if( KICAD_SCRIPTING ) - add_custom_target( FixSwigImportsScripting ALL - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/scripting/build_tools/fix_swig_imports.py ${CMAKE_CURRENT_BINARY_DIR}/pcbnew.py - DEPENDS pcbnew - COMMENT "Fixing swig_import_helper in Kicad scripting" - ) - - install( FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py DESTINATION ${PYTHON_DEST} ) - - if( APPLE ) - # copies all into PYTHON_DEST then all into the bundle ! - add_custom_target( _pcbnew_py_copy ALL - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py "${PYTHON_DEST}/wx-3.0-osx_cocoa/" - DEPENDS FixSwigImportsScripting - COMMENT "Copying pcbnew.py into PYTHON_DEST/wx-3.0-osx_cocoa/" + if( NOT APPLE ) + install( FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py DESTINATION ${PYTHON_DEST} ) + else() + # put into bundle at build time, it is relocated at install + add_custom_target( ScriptingPcbnewPyCopy ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py" "${PYTHON_DEST}" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pcbnew.py + COMMENT "Copying pcbnew.py into ${PYTHON_DEST}" ) - - add_custom_target( pcbnew_copy_wxpython_scripting ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBWXPYTHON_ROOT}/wxPython/ ${CMAKE_SOURCE_DIR}/pcbnew/pcbnew.app/Contents/Frameworks/wxPython/ - DEPENDS FixSwigImportsScripting _pcbnew_py_copy - COMMENT "Copying wxPython into pcbnew.app Framework" + # scripting plugins + install( DIRECTORY ${PROJECT_SOURCE_DIR}/pcbnew/scripting/plugins/ + DESTINATION ${KICAD_DATA}/scripting/plugins + COMPONENT binary ) - - add_custom_target( pcbnew_copy_plugins ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/pcbnew/scripting/plugins ${PROJECT_SOURCE_DIR}/pcbnew/pcbnew.app/Contents/PlugIns/scripting/plugins - DEPENDS pcbnew_copy_wxpython_scripting - COMMENT "Copying plugins into bundle" - ) - - # fix bundle after copying wxpython, fixing and copying - add_dependencies( osx_fix_bundles pcbnew_copy_wxpython_scripting ) - - if ( KICAD_SCRIPTING_MODULES ) - #they do more or less the same job, avoid race between them - #Cmake copy goes in error otherwise - add_dependencies( pcbnew_copy_wxpython_scripting pcbnew_copy_wxpython_module ) - endif() - endif() endif() @@ -733,33 +708,43 @@ if( KICAD_SCRIPTING_MODULES ) COMMENT "Fixing swig_import_helper in Kicad scripting modules" ) - install( FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py DESTINATION ${PYTHON_DEST} ) + if( NOT APPLE ) + install( FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py DESTINATION ${PYTHON_DEST} ) + else() + # put everything into bundle at build time, it is relocated at install + add_custom_target( ScriptingModulesPcbnewPyCopy ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py" "${PYTHON_DEST}" + DEPENDS FixSwigImportsModuleScripting + COMMENT "Copying pcbnew.py into ${PYTHON_DEST}" + ) + endif() if( MINGW ) install( FILES ${CMAKE_BINARY_DIR}/pcbnew/_pcbnew.pyd DESTINATION ${PYTHON_DEST} ) + elseif( APPLE ) + # put everything into bundle at build time, it is relocated at install + add_custom_target( ScriptingModulesPcbnewSoCopy ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/pcbnew/_pcbnew.so" "${PYTHON_DEST}" + DEPENDS _pcbnew + COMMENT "Copying _pcbnew.so into ${PYTHON_DEST}" + ) else() install( FILES ${CMAKE_BINARY_DIR}/pcbnew/_pcbnew.so DESTINATION ${PYTHON_DEST} ) endif() +endif() - if( APPLE ) - # copies needed files into PYTHON_DEST then copy all into the bundle ! - add_custom_target( _pcbnew_so_copy ALL - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/pcbnew/_pcbnew.so "${PYTHON_DEST}" - DEPENDS _pcbnew FixSwigImportsModuleScripting - COMMENT "Copying _pcbnew.so into PYTHON_DEST" - ) - - add_custom_target( pcbnew_copy_wxpython_module ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBWXPYTHON_ROOT}/wxPython/ ${PROJECT_SOURCE_DIR}/pcbnew/pcbnew.app/Contents/Frameworks/wxPython/ - DEPENDS FixSwigImportsModuleScripting _pcbnew_so_copy - COMMENT "Copying wxPython into pcbnew.app Frameworks" - ) - - if( KICAD_BUILD_DYNAMIC ) - # Tell that we have to run osx_fix_bundles fix after building _pcbnew and migrating wxPython - add_dependencies( osx_fix_bundles pcbnew_copy_wxpython_module ) - add_dependencies( osx_fix_bundles _pcbnew ) +if( APPLE ) + if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) + # find wx-X.Y-osx_cocoa path below PYTHON_SITE_PACKAGE_PATH + file( GLOB WXPYTHON_PATH ${PYTHON_SITE_PACKAGE_PATH}/wx-?.?-osx_cocoa ) + if( NOT WXPYTHON_PATH ) + message( FATAL_ERROR "Could not find 'wx-?.?-osx_cocoa' in '${PYTHON_SITE_PACKAGE_PATH}'" ) endif() + # copy contents + add_custom_target( ScriptingWxpythonCopy ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory "${WXPYTHON_PATH}" "${PYTHON_DEST}" + COMMENT "Copying wxPython into ${PYTHON_DEST}" + ) endif() endif() diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index 9c68633ef8..8eda1ac809 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -217,7 +217,7 @@ static bool scriptingSetup() { wxString path_frag; - #ifdef __MINGW32__ +#ifdef __MINGW32__ // force python environment under Windows: const wxString python_us( "python27_us" ); @@ -261,32 +261,36 @@ static bool scriptingSetup() // [KICAD_PATH]/scripting/plugins // Add this default search path: path_frag = Pgm().GetExecutablePath() + wxT( "scripting/plugins" ); - #else +#elif defined __WXMAC__ + // User plugin folder is ~/Library/Application Support/kicad/scripting/plugins + path_frag = wxStandardPaths::Get().GetUserDataDir() + wxT( "/scripting/plugins" ); + + // Add default paths to PYTHONPATH + wxString pypath; + // User scripting folder (~/Library/Application Support/kicad/scripting/plugins) + pypath = wxStandardPaths::Get().GetUserDataDir() + wxT( "/scripting/plugins" ); + // Machine scripting folder (/Library/Application Support/kicad/scripting/plugins) + pypath += wxT( ":/Library/Application Support/kicad/scripting/plugins" ); + // Bundle scripting folder (/Contents/SharedSupport/scripting/plugins) + pypath += wxT( ":" ) + wxStandardPaths::Get().GetDataDir() + wxT( "/scripting/plugins" ); + // Bundle wxPython folder (/Contents/Frameworks/python) + wxFileName fn = wxFileName( wxStandardPaths::Get().GetExecutablePath() ); + fn.RemoveLastDir(); + fn.AppendDir( wxT( "Frameworks" ) ); + fn.AppendDir( wxT( "python" ) ); + pypath += wxT( ":" ) + fn.GetPath(); + // Original content of PYTHONPATH + if( wxGetenv("PYTHONPATH") != NULL ) + { + pypath += wxT( ":" ) + wxString( wxGetenv("PYTHONPATH") ); + } + + // set $PYTHONPATH + wxSetEnv( "PYTHONPATH", pypath ); +#else // Add this default search path: path_frag = wxT( "/usr/local/kicad/bin/scripting/plugins" ); - - #ifdef __WXMAC__ - // OSX - // System Library first - // User Library then - // (TODO) Bundle package ? where to place ? Shared Support ? - path_frag = wxT( "/Library/Application Support/kicad/scripting" ); - path_frag = wxString( wxGetenv("HOME") ) + wxT( "/Library/Application Support/kicad/scripting" ); - - // Get pcbnew.app/Contents directory - wxFileName bundledir( wxStandardPaths::Get().GetExecutablePath() ) ; - bundledir.RemoveLastDir(); - - // Prepend in PYTHONPATH the content of the bundle libraries ! - wxSetEnv( "PYTHONPATH", ((wxGetenv("PYTHONPATH") != NULL ) ? (wxString(wxGetenv("PYTHONPATH")) + ":") : wxString("")) + - bundledir.GetPath() + - "/Frameworks/wxPython/lib/python2.6/site-packages/wx-3.0-osx_cocoa" + ":" + - "/Library/Application Support/kicad/" + ":" + - bundledir.GetPath() + "/PlugIns" + ":" + - wxString( wxGetenv("HOME") ) + "/Library/Application Support/kicad/" - ); - #endif - #endif +#endif // On linux and osx, 2 others paths are // [HOME]/.kicad_plugins/ diff --git a/scripts/osx_build_wx.sh b/scripts/osx_build_wx.sh new file mode 100644 index 0000000000..0d2a48605a --- /dev/null +++ b/scripts/osx_build_wx.sh @@ -0,0 +1,162 @@ +#!/bin/bash +# +# Small helper script for patching/compiling wxWidgets/wxPython on OSX +# +# Params +# $1 wxWidgets/wxPython source folder (relative to current dir) +# $2 Target bin folder +# $3 KiCad source folder (relative to current dir) +# $4 Make options (e.g., "-j4") + +createPaths() { + echo "*** Creating/wiping build and bin folder..." + + rm -rf wx-build + rm -rf $1 + mkdir wx-build + mkdir $1 +} + +doPatch() { + cwd=$(pwd) + cd $1 + + patchcmd="patch -p0 -RN --dry-run < $cwd/$2" + eval $patchcmd &> /dev/null + if [ $? -eq 0 ]; + then + echo "*** Patch '$2' already applied, skipping..." + else + echo "*** Applying patch '$2'..." + + patch -p0 < $cwd/$2 + if [ $? -ne 0 ]; + then + cd $cwd + exit 1 + fi + fi + + cd $cwd +} + +wxWidgets_configure() { + echo "*** Configuring wxWidgets..." + cwd=$(pwd) + cd wx-build + + ../$1/configure \ + --prefix=$cwd/$2 \ + --with-opengl \ + --enable-aui \ + --enable-utf8 \ + --enable-html \ + --enable-stl \ + --with-libjpeg=builtin \ + --with-libpng=builtin \ + --with-regex=builtin \ + --with-libtiff=builtin \ + --with-zlib=builtin \ + --with-expat=builtin \ + --without-liblzma \ + --with-macosx-version-min=10.5 \ + --enable-universal-binary=i386,x86_64 \ + CPPFLAGS="-stdlib=libstdc++" \ + LDFLAGS="-stdlib=libstdc++" \ + CC=clang \ + CXX=clang++ + if [ $? -ne 0 ]; + then + cd .. + exit 1 + fi + + cd .. +} + +wxWidgets_buildInst() { + echo "*** Building wxWidgets..." + cd wx-build + + make $1 install + if [ $? -ne 0 ]; + then + cd .. + exit 1 + fi + + cd .. +} + +wxPython_buildInst() { + cwd=$(pwd) + cd $1/wxPython + + # build params + WXPYTHON_BUILD_OPTS="WX_CONFIG=$cwd/$2/bin/wx-config \ + BUILD_BASE=$cwd/wx-build \ + UNICODE=1 \ + WXPORT=osx_cocoa" + + # build + python setup.py build_ext $WXPYTHON_BUILD_OPTS + if [ $? -ne 0 ]; + then + cd $cwd + exit 1 + fi + + # install + python setup.py install --prefix=$cwd/$2 $WXPYTHON_BUILD_OPTS + if [ $? -ne 0 ]; + then + cd $cwd + exit 1 + fi + + cd $cwd +} + + +# check parameters +if [ "$#" -lt 3 ]; +then + echo "OSX wxWidgets/wxPython build script" + echo + echo "Usage:" + echo " osx_build_wx.sh " + echo " wxWidgets/wxPython source folder" + echo " Destination folder" + echo " KiCad folder" + echo " Optional: make options for building wxWidgets (e.g., -j4)" + exit 1 +fi + +# create build paths +createPaths "$2" + +# patch wxWidgets sources +echo "*** Patching wxWidgets..." +doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx.patch" +doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx_bug_15908.patch" +doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx_soname.patch" + +# configure and build wxWidgets +wxWidgets_configure "$1" "$2" +wxWidgets_buildInst "$4" + +# check if source is wxPython +if [ -d $1/wxPython ]; +then + echo "*** Source is wxPython, now building wxPython stuff..." + wxPython_buildInst "$1" "$2" +fi + +# remove build dir +echo "*** Removing build folder" +rm -rf wx-build + +# done +echo "*** Finished building!" + +