Help: minor improvements
[far2l.git] / CMakeLists.txt
blob0d376e25ba4350071b21dcd3bd2a509e5733aa9d
1 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
3 cmake_minimum_required (VERSION 3.0.2)
5 project (far2l)
7 set(APP_NAME "far2l")
8 set(APP_IDENTIFIER "com.far2l")
9 set(CPACK_PACKAGE_NAME "far2l")
11 string(ASCII 27 Esc)
12 set(ColorNormal "${Esc}[m")
13 set(ColorRed "${Esc}[1;31m")
15 include(GNUInstallDirs)
17 # just to force reconfigure if packaging/version changed
18 configure_file(${CMAKE_SOURCE_DIR}/packaging/version ${CMAKE_BINARY_DIR}/packaging/version @ONLY)
20 # reconfigure in case .git directory changed to update version correctly
21 IF(EXISTS ${CMAKE_SOURCE_DIR}/.git)
22     set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/.git)
23 endif()
25 file(READ "${CMAKE_SOURCE_DIR}/packaging/version" VERSION)
26 string(REGEX REPLACE "[\r\n\t ]$" "" VERSION "${VERSION}")
27 string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}")
28 string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION}")
29 string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.(.*)" "\\1" VERSION_PATCH "${VERSION}")
31 if("${VERSION_MAJOR}" STREQUAL "" OR "${VERSION_MAJOR}" STREQUAL "${VERSION}"
32     OR "${VERSION_MINOR}" STREQUAL "" OR "${VERSION_MINOR}" STREQUAL "${VERSION}"
33     OR "${VERSION_PATCH}" STREQUAL "" OR "${VERSION_PATCH}" STREQUAL "${VERSION}")
34         message(FATAL_ERROR "${ColorRed}packaging/version is corrupted, please write actual X.Y.Z version into it.${ColorNormal}")
35 endif()
37 find_package(Git)
39 if(GIT_FOUND)
40     execute_process(COMMAND "${GIT_EXECUTABLE}" describe --tag
41         WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
42         OUTPUT_VARIABLE GIT_TAG
43         OUTPUT_STRIP_TRAILING_WHITESPACE)
44 endif()
46 if(NOT "${GIT_TAG}" STREQUAL "v_${VERSION}")
47     if(GIT_FOUND)
48         execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD
49             WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
50             OUTPUT_VARIABLE GIT_HASH
51             OUTPUT_STRIP_TRAILING_WHITESPACE)
52     endif()
53     if(NOT "${GIT_HASH}" STREQUAL "")
54         message(STATUS "git hash: ${GIT_HASH}")
55         set(VERSION_PATCH "${VERSION_PATCH}-${GIT_HASH}")
56     else()
57         message(WARNING "git information unavailable, assuming its a build from v_${VERSION}")
58     endif()
59 endif()
61 set(VERSION_PATCH "${VERSION_PATCH}-beta")
63 set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
65 set(CMAKE_CXX_STANDARD_REQUIRED ON)
66 set(CMAKE_CXX_STANDARD 11)
67 set(CMAKE_CXX_EXTENSIONS OFF)
69 if(NOT CMAKE_BUILD_TYPE)
70    set(CMAKE_BUILD_TYPE "Release")
71 endif()
73 message(STATUS "Build Type: ${CMAKE_BUILD_TYPE} Version: ${VERSION}")
75 if(NOT DEFINED CMAKE_INSTALL_PREFIX)
76    if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
77       set(CMAKE_INSTALL_PREFIX "/usr/local")
78    elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
79       set(CMAKE_INSTALL_PREFIX "/usr/local")
80    else()
81       set(CMAKE_INSTALL_PREFIX "/usr")
82    endif()
83 endif()
85 ##############################
87 if (NOT DEFINED USEWX)
88     set(USEWX "YES")
89 endif()
91 if (NOT DEFINED UNRAR)
92     set(UNRAR "bundled")
93 endif()
95 if (NOT DEFINED USESPDLOG)
96     set(USESPDLOG "NO")
97 endif()
99 # EACP disabled by default for now as FAR's GetCodePageInfo rejects all multibyte charsets due to BUGBUG.
100 # Uncomment EACP-stuff here when that will be fixed. See https://github.com/elfmz/far2l/issues/1179
101 #if (NOT DEFINED EACP)
102 #   set(EACP "YES")
103 #endif()
105 if (NOT DEFINED LEGACY)
106     # TODO: default it to NO  somewhere in 2022, after all obsolete settings
107     # registry-upgrade-to-ini stuff will be safe to remove
108     set(LEGACY "YES")
109 elseif(FARFTP)
110     set(LEGACY "YES")
111     message(STATUS "Force-enable LEGACY due to enabled FARFTP")
112 endif()
114 #if (NOT EACP)
115 #   message(STATUS "${ColorRed}Building without East Asian codepages support due to EACP=${EACP}${ColorNormal}")
116 #endif()
118 # set(RM rm) actually not needed: use $(CMAKE_COMMAND) -E remove
120 if(MUSL)
121     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__MUSL__")
122     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__MUSL__")
123 endif()
125 if(TAR_LIMITED_ARGS)
126     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__TAR_LIMITED_ARGS__")
127     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__TAR_LIMITED_ARGS__")
128 endif()
130 if(${CMAKE_VERSION} VERSION_LESS "3.1.0")
131     message("Please consider to switch to newer CMake")
132     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
133 endif()
135 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -Wno-unused-function -D_FILE_OFFSET_BITS=64") #  -fsanitize=address
136 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=c99 -fPIC -Wno-unused-function -D_FILE_OFFSET_BITS=64") #  -fsanitize=address
137 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2")
138 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O2")
140 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
141     set(APP_DIR ${CMAKE_BINARY_DIR}/install)
142     set(INSTALL_DIR ${APP_DIR}/${APP_NAME}.app/Contents/MacOS)
143     set(EXECUTABLE_NAME ${APP_NAME})
145 else()
146     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
147     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
148     set(INSTALL_DIR ${CMAKE_BINARY_DIR}/install)
149     set(EXECUTABLE_NAME far2l)
151     if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
152         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--gc-sections")
153         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections")
154     endif()
155 endif()
157 if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
158     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=600")
159     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=600")
160     message(STATUS "Running under cygwin, wow!")
161 endif()
163 if (CMAKE_SYSTEM_NAME MATCHES "Haiku")
164     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE -D_DEFAULT_SOURCE -Wno-attributes")
165 endif()
167 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
168 set(CMAKE_C_VISIBILITY_PRESET hidden)
170 if (LEGACY)
171     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPORT_REGISTRY")
172     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPORT_REGISTRY")
173     message(STATUS "Enabling registry support due to enabled LEGACY")
174 else()
175     message(STATUS "LEGACY is not enabled, your old registry settings will be forgotten, if any")
176 endif()
178 if(CMAKE_VERSION VERSION_GREATER "3.3")
179     cmake_policy(SET CMP0063 NEW)
180     cmake_policy(SET CMP0057 NEW)
181 endif()
183 include_directories(utils/include)
185 add_subdirectory (WinPort)
186 add_subdirectory (utils)
187 add_subdirectory (far2l)
189 if (NOT ${USEWX})
190     message(STATUS "Building without GUI/wxWidgets backend due to USEWX=${USEWX}")
191 else()
192     message(STATUS "Building with GUI/wxWidgets backend")
193     if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
194         if (DEFINED wxWidgets_CONFIG_EXECUTABLE)
195             message(STATUS "Using pre-defined wx config: ${wxWidgets_CONFIG_EXECUTABLE}")
197         elseif(EXISTS "/usr/local/bin/wxgtk3u-3.2-config")
198             set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.2-config")
199             set(wxWidgets_wxrc_EXECUTABLE "/usr/local/bin/wxrc-gtk3u-3.2")
200             message(STATUS "Using known location of wx-config 3.2")
202         elseif(EXISTS "/usr/local/bin/wxgtk3u-3.1-config")
203             set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.1-config")
204             set(wxWidgets_wxrc_EXECUTABLE "/usr/local/bin/wxrc-gtk3u-3.1")
205             message(STATUS "Using known location of wx-config 3.1")
207         elseif (EXISTS "/usr/local/bin/wxgtk3u-3.0-config")
208             set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.0-config")
209             set(wxWidgets_wxrc_EXECUTABLE "/usr/local/bin/wxrc-gtk3u-3.0")
210             message(STATUS "Using known location of wx-config 3.0")
212         else()
213             message(STATUS "No wxgtk3u-3.*-config in expected locations")
214         endif()
216     elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
217         if (EXISTS "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.2/bin/wx-config")
218             # MacPorts
219             set(wxWidgets_CONFIG_EXECUTABLE "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.2/bin/wx-config")
220             set(wxWidgets_wxrc_EXECUTABLE "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.2/bin/wxrc")
221             message(STATUS "Using known location of wx-config 3.2")
223         elseif (EXISTS "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.1/bin/wx-config")
224             # MacPorts
225             set(wxWidgets_CONFIG_EXECUTABLE "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.1/bin/wx-config")
226             set(wxWidgets_wxrc_EXECUTABLE "/opt/local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.1/bin/wxrc")
227             message(STATUS "Using known location of wx-config 3.1")
229         else()
230             message(STATUS "No wx-config in expected locations")
231         endif()
232     endif()
234     add_subdirectory(WinPort/src/Backend/WX)
235 endif()
237 if (NOT DEFINED TTYX)
238     find_package(X11)
239     if(X11_FOUND)
240         message(STATUS "Building with TTY X11 extensions due to X11 found")
241         add_subdirectory(WinPort/src/Backend/TTY/TTYX)
242     else()
243         message(STATUS "Building without TTY X11 extensions due to X11 not found")
244     endif()
245 elseif (TTYX)
246     message(STATUS "Building with TTY X11 extensions due to TTYX=${TTYX}")
247     add_subdirectory(WinPort/src/Backend/TTY/TTYX)
248 else()
249     message(STATUS "Building without TTY X11 extensions due to TTYX=${TTYX}")
250 endif()
253 ##############################
254 # plugins directives
256 if (NOT DEFINED ALIGN OR ALIGN)
257     message(STATUS "ALIGN plugin enabled")
258     add_subdirectory (align)
259 else()
260     message(STATUS "${ColorRed}ALIGN plugin disabled due to ALIGN=${ALIGN}${ColorNormal}")
261     install(CODE "
262         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/align/plug/align.far-plug-wide)
263         " COMPONENT system)
264 endif()
266 if (NOT DEFINED AUTOWRAP OR AUTOWRAP)
267     message(STATUS "AUTOWRAP plugin enabled")
268     add_subdirectory (autowrap)
269 else()
270     message(STATUS "${ColorRed}AUTOWRAP plugin disabled due to AUTOWRAP=${AUTOWRAP}${ColorNormal}")
271     install(CODE "
272         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/autowrap/plug/autowrap.far-plug-wide)
273         " COMPONENT system)
274 endif()
276 if (NOT DEFINED CALC OR CALC)
277     message(STATUS "CALC plugin enabled")
278     add_subdirectory (calc)
279 else()
280     message(STATUS "${ColorRed}CALC plugin disabled due to CALC=${CALC}${ColorNormal}")
281     install(CODE "
282         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/calc/plug/calc.far-plug-wide)
283         " COMPONENT system)
284 endif()
286 if (NOT DEFINED COLORER OR COLORER)
287     message(STATUS "COLORER plugin enabled")
288     add_subdirectory (colorer)
289 else()
290     message(STATUS "${ColorRed}COLORER plugin disabled due to COLORER=${COLORER}${ColorNormal}")
291     install(CODE "
292         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/colorer/plug/colorer.far-plug-wide)
293         " COMPONENT system)
294 endif()
296 if (NOT DEFINED COMPARE OR COMPARE)
297     message(STATUS "COMPARE plugin enabled")
298     add_subdirectory (compare)
299 else()
300     message(STATUS "${ColorRed}COMPARE plugin disabled due to COMPARE=${COMPARE}${ColorNormal}")
301     install(CODE "
302         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/compare/plug/compare.far-plug-wide)
303         " COMPONENT system)
304 endif()
306 if (NOT DEFINED DRAWLINE OR DRAWLINE)
307     message(STATUS "DRAWLINE plugin enabled")
308     add_subdirectory (drawline)
309 else()
310     message(STATUS "${ColorRed}DRAWLINE plugin disabled due to DRAWLINE=${DRAWLINE}${ColorNormal}")
311     install(CODE "
312         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/drawline/plug/drawline.far-plug-wide)
313         " COMPONENT system)
314 endif()
316 if (NOT DEFINED EDITCASE OR EDITCASE)
317     message(STATUS "EDITCASE plugin enabled")
318     add_subdirectory (editcase)
319 else()
320     message(STATUS "${ColorRed}EDITCASE plugin disabled due to EDITCASE=${EDITCASE}${ColorNormal}")
321     install(CODE "
322         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/editcase/plug/editcase.far-plug-wide)
323         " COMPONENT system)
324 endif()
326 if (NOT DEFINED EDITORCOMP OR EDITORCOMP)
327     message(STATUS "EDITORCOMP plugin enabled")
328     add_subdirectory (editorcomp)
329 else()
330     message(STATUS "${ColorRed}EDITORCOMP plugin disabled due to EDITORCOMP=${EDITORCOMP}${ColorNormal}")
331     install(CODE "
332         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/editorcomp/plug/editorcomp.far-plug-wide)
333         " COMPONENT system)
334 endif()
336 if (DEFINED FARFTP AND FARFTP)
337     message(STATUS "FARFTP plugin enabled (obsolete)")
338     add_subdirectory (FARStdlib)
339     add_subdirectory (farftp)
340 else()
341     install(CODE "
342         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/farftp/plug/farftp.far-plug-mb)
343         " COMPONENT system)
344 endif()
346 if (NOT DEFINED FILECASE OR FILECASE)
347     message(STATUS "FILECASE plugin enabled")
348     add_subdirectory (filecase)
349 else()
350     message(STATUS "${ColorRed}FILECASE plugin disabled due to FILECASE=${FILECASE}${ColorNormal}")
351     install(CODE "
352         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/filecase/plug/filecase.far-plug-wide)
353         " COMPONENT system)
354 endif()
356 if (NOT DEFINED INCSRCH OR INCSRCH)
357     message(STATUS "INCSRCH plugin enabled")
358     add_subdirectory (incsrch)
359 else()
360     message(STATUS "${ColorRed}Building without <INCSRCH> plugin due to INCSRCH=${INCSRCH}${ColorNormal}")
361     install(CODE "
362         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/incsrch/plug/incsrch.far-plug-wide)
363         " COMPONENT system)
364 endif()
366 if (NOT DEFINED INSIDE OR INSIDE)
367     message(STATUS "INSIDE plugin enabled")
368     add_subdirectory (inside)
369 else()
370     message(STATUS "${ColorRed}INSIDE plugin disabled due to INSIDE=${INSIDE}${ColorNormal}")
371     install(CODE "
372         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/inside/plug/inside.far-plug-mb)
373         " COMPONENT system)
374 endif()
376 if (NOT DEFINED MULTIARC OR MULTIARC)
377     message(STATUS "MULTIARC plugin enabled")
378     find_package(PkgConfig REQUIRED)
379     pkg_search_module(LibArchive QUIET libarchive)
380     if(NOT LibArchive_FOUND)
381         message(WARNING "${ColorRed}libarchive not found, multiarc will have weaker archives support. Its recommended to install libarchive-dev and reconfigure far2l.${ColorNormal}")
382     endif()
384     pkg_search_module(PCRE QUIET libpcre)
385     if(NOT PCRE_FOUND)
386         message(WARNING "${ColorRed}libpcre not found, multiarc will have no regexp support in custom archive format descriptions. Install libpcre and reconfigure far2l if you need that functionality.${ColorNormal}")
387     endif()
389     add_subdirectory (multiarc)
390 else()
391     message(STATUS "${ColorRed}MULTIARC plugin disabled due to MULTIARC=${MULTIARC}${ColorNormal}")
392     install(CODE "
393         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/multiarc/plug/multiarc.far-plug-mb)
394         " COMPONENT system)
395 endif()
397 if (NOT DEFINED NETROCKS OR NETROCKS)
398     message(STATUS "NETROCKS plugin enabled")
399     find_package(OpenSSL)
400     if(OPENSSL_FOUND)
401         message(STATUS "OpenSSL found -> enjoy FTPS support in NetRocks")
402     else()
403         message(WARNING "${ColorRed}OpenSSL not found, NetRocks will not have FTPS protocol support. Install libssl-dev if you want FTPS protocol available in NetRocks.${ColorNormal}")
404     endif(OPENSSL_FOUND)
406     find_package(LibSSH 0.5.0)
407     if(LIBSSH_FOUND)
408         message(STATUS "libssh found -> enjoy SFTP support in NetRocks")
409     else()
410         message(WARNING "${ColorRed}libssh not found, NetRocks will not have SFTP protocol support. Install libssh-dev if you want SFTP protocol available in NetRocks.${ColorNormal}")
411     endif(LIBSSH_FOUND)
413     find_package(Libsmbclient)
414     if(LIBSMBCLIENT_FOUND)
415         message(STATUS "libsmbclient found -> enjoy SMB support in NetRocks")
416     else()
417         message(WARNING "${ColorRed}libsmbclient not found, NetRocks will not have SMB protocol support. Install libsmbclient-dev if you want SMB protocol available in NetRocks.${ColorNormal}")
418     endif(LIBSMBCLIENT_FOUND)
420     find_package(LibNfs)
421     if(LIBNFS_FOUND)
422         message(STATUS "libnfs found -> enjoy NFS support in NetRocks")
423     else()
424         message(WARNING "${ColorRed}libnfs not found, NetRocks will not have NFS protocol support. Install libnfs-dev if you want NFS protocol available in NetRocks.${ColorNormal}")
425     endif(LIBNFS_FOUND)
427     find_package(LibNEON)
428     if(LIBNEON_FOUND)
429         message(STATUS "libneon found -> enjoy WebDav support in NetRocks")
430     else()
431         message(WARNING "${ColorRed}libneon not found, NetRocks will not have WebDav protocol support. Install libneon*-dev if you want WebDav protocol available in NetRocks.${ColorNormal}")
432     endif(LIBNEON_FOUND)
434     add_subdirectory (NetRocks)
435 else()
436     message(STATUS "${ColorRed}NETROCKS plugin disabled due to NETROCKS=${NETROCKS}${ColorNormal}")
437     install(CODE "
438         execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/NetRocks/plug/NetRocks.far-plug-wide)
439         " COMPONENT system)
440 endif()
442 if (DEFINED VIRTUAL_PYTHON)
443     message(STATUS "PYTHON plugin with interpreter from virtualenv enabled")
444     add_subdirectory (python)
445     # Copy this explicitly cuz generic copier command excludes 'far2l'
446     install(DIRECTORY "${INSTALL_DIR}/Plugins/python/plug/far2l"
447         DESTINATION "share/far2l/Plugins/python/plug/" USE_SOURCE_PERMISSIONS
448         COMPONENT base FILES_MATCHING
449         PATTERN "*")
450 else()
451     if (DEFINED PYTHON AND PYTHON)
452         find_package(Python3 COMPONENTS Interpreter Development)
454         if(Python3_FOUND AND Python3_Development_FOUND)
455             message(STATUS "PYTHON plugin enabled")
456             add_subdirectory (python)
457             install(CODE "
458                 execute_process(COMMAND echo Python: preparing virtual environment)
459                 " COMPONENT system)
460             install(CODE "
461                 execute_process(COMMAND ${PYTHON3} -m venv --system-site-packages ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/python/plug/python)
462                 " COMPONENT system)
463             install(CODE "
464                 execute_process(COMMAND echo Python: installing packages)
465                 " COMPONENT system)
466             install(CODE "
467                 execute_process(COMMAND ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/python/plug/python/bin/python -m pip install cffi debugpy)
468                 " COMPONENT system)
470             # Copy this explicitly cuz generic copier command excludes 'far2l'
471             install(DIRECTORY "${INSTALL_DIR}/Plugins/python/plug/far2l"
472                 DESTINATION "share/far2l/Plugins/python/plug/" USE_SOURCE_PERMISSIONS
473                 COMPONENT base FILES_MATCHING
474                 PATTERN "*")
475         else()
476             message(WARNING "${ColorRed}PYTHON plugin disabled due to missing python3 environment${ColorNormal}")
477         endif ()
479     else()
480         message(STATUS "${ColorRed}PYTHON plugin disabled, use -DPYTHON=yes if you need it${ColorNormal}")
481         install(CODE "
482             execute_process(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/python/plug/python.far-plug-wide)
483             " COMPONENT system)
484     endif()
485 endif()
487 if (NOT DEFINED SIMPLEINDENT OR SIMPLEINDENT)
488     message(STATUS "SIMPLEINDENT plugin enabled")
489     add_subdirectory (SimpleIndent)
490 else()
491     message(STATUS "${ColorRed}SIMPLEINDENT plugin disabled due to SIMPLEINDENT=${SIMPLEINDENT}${ColorNormal}")
492     install(CODE "
493         execute_process(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/SimpleIndent/plug/SimpleIndent.far-plug-wide)
494         " COMPONENT system)
495 endif()
497 if (NOT DEFINED TMPPANEL OR TMPPANEL)
498     message(STATUS "TMPPANEL plugin enabled")
499     add_subdirectory (tmppanel)
500 else()
501     message(STATUS "${ColorRed}TMPPANEL plugin disabled due to TMPPANEL=${TMPPANEL}${ColorNormal}")
502     install(CODE "
503         execute_process(COMMAND rm -f ${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/tmppanel/plug/tmppanel.far-plug-wide)
504         " COMPONENT system)
505 endif()
507 ##############################
508 # common install directives
510 add_subdirectory (packaging)
512 add_subdirectory(man)
514 if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
515     set(FIXUP_SCRIPT packaging/osx/FixupBundle.cmake)
516     configure_file(${FIXUP_SCRIPT}.in ${PROJECT_BINARY_DIR}/${FIXUP_SCRIPT} @ONLY)
517     install(DIRECTORY ${APP_DIR}/${APP_NAME}.app DESTINATION . USE_SOURCE_PERMISSIONS COMPONENT app EXCLUDE_FROM_ALL)
518     install(SCRIPT ${PROJECT_BINARY_DIR}/${FIXUP_SCRIPT} COMPONENT app EXCLUDE_FROM_ALL)
519 endif()
521 install(PROGRAMS "${INSTALL_DIR}/${EXECUTABLE_NAME}" DESTINATION "bin" RENAME far2l COMPONENT base)
523 install(DIRECTORY "${INSTALL_DIR}/" DESTINATION "lib/far2l" USE_SOURCE_PERMISSIONS COMPONENT base FILES_MATCHING
524     PATTERN "colorer/base" EXCLUDE
525     PATTERN "far2l_gui.so"
526     PATTERN "far2l_ttyx.broker"
527     PATTERN "plug/*.far-plug-*"
528     PATTERN "plug/*.broker")
530 install(DIRECTORY "${INSTALL_DIR}/" DESTINATION "share/far2l" USE_SOURCE_PERMISSIONS COMPONENT base FILES_MATCHING
531     PATTERN "${EXECUTABLE_NAME}" EXCLUDE
532     PATTERN "far2ledit" EXCLUDE
533     PATTERN "far2l_*" EXCLUDE
534     PATTERN "*.far-plug-*" EXCLUDE
535     PATTERN "*.broker" EXCLUDE
536     PATTERN "python/plug/python" EXCLUDE
537     PATTERN "*")
539 # setup some symlinks and remove deprecated stuff from previous installation
540 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin/far2l ${PROJECT_BINARY_DIR}/far2l/far2l_askpass)
541 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin/far2l ${PROJECT_BINARY_DIR}/far2l/far2l_sudoapp)
542 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink far2l ${PROJECT_BINARY_DIR}/far2l/far2ledit)
543 install(FILES "${PROJECT_BINARY_DIR}/far2l/far2l_askpass" DESTINATION "lib/far2l" COMPONENT system)
544 install(FILES "${PROJECT_BINARY_DIR}/far2l/far2l_sudoapp" DESTINATION "lib/far2l" COMPONENT system)
545 install(FILES "${PROJECT_BINARY_DIR}/far2l/far2ledit" DESTINATION "bin" COMPONENT base)
546 install(CODE "
547     execute_process(COMMAND ${CMAKE_COMMAND} -E remove -f \"\${CMAKE_INSTALL_PREFIX}/lib/far2l/Plugins/objinfo/plug/objinfo.far-plug-mb\")
548     " COMPONENT system)