diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..25c0630 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,347 @@ +cmake_minimum_required(VERSION 3.16) +project(nwflaim LANGUAGES CXX) + +include(GNUInstallDirs) + +option(NWFLAIM_BUILD_SHARED "Build shared nwflaim libraries" ON) +option(NWFLAIM_BUILD_STATIC "Build static nwflaim libraries" OFF) +option(NWFLAIM_BUILD_SQL "Build SQL FLAIM library" ON) +option(NWFLAIM_WITH_OPENSSL "Build FTK legacy OpenSSL/TLS helpers" ON) +option(NWFLAIM_USE_NICI "Build FLAIM NICI/CCS encrypted-storage path" OFF) +set(NWFLAIM_SSL_TARGET "" CACHE STRING "Optional SSL/Crypto target, for example mars_nwe::ssl") +set(NWFLAIM_NICI_INCLUDE_DIR "" CACHE PATH "Optional private NICI/CCS compatibility include directory") +set(NWFLAIM_LIBRARY_PREFIX nw CACHE STRING "Library output prefix used to avoid system FLAIM collisions") + +if(NOT NWFLAIM_BUILD_SHARED AND NOT NWFLAIM_BUILD_STATIC) + message(FATAL_ERROR "Enable at least one of NWFLAIM_BUILD_SHARED or NWFLAIM_BUILD_STATIC") +endif() + +set(_nwflaim_common_defs + N_PLAT_UNIX + _LARGEFILE64_SOURCE + _FILE_OFFSET_BITS=64 + _REENTRANT) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + list(APPEND _nwflaim_common_defs FLM_64BIT) +endif() +if(NWFLAIM_USE_NICI) + list(APPEND _nwflaim_common_defs FLM_USE_NICI) +endif() + +find_package(Threads REQUIRED) +find_library(NWFLAIM_RT_LIBRARY rt) +find_library(NWFLAIM_DL_LIBRARY dl) +find_package(Curses QUIET) + +set(_nwflaim_ssl_target "") +if(NWFLAIM_WITH_OPENSSL) + if(NOT NWFLAIM_SSL_TARGET STREQUAL "") + if(NOT TARGET ${NWFLAIM_SSL_TARGET}) + message(FATAL_ERROR "NWFLAIM_SSL_TARGET=${NWFLAIM_SSL_TARGET} is not a CMake target") + endif() + set(_nwflaim_ssl_target ${NWFLAIM_SSL_TARGET}) + elseif(TARGET mars_nwe::ssl) + set(_nwflaim_ssl_target mars_nwe::ssl) + else() + find_package(OpenSSL REQUIRED COMPONENTS SSL Crypto) + set(_nwflaim_ssl_target OpenSSL::SSL OpenSSL::Crypto) + endif() + list(APPEND _nwflaim_common_defs FLM_OPENSSL) +endif() + +set(NWFLAIM_FTK_SOURCES + ftk/src/ftkarg.cpp + ftk/src/ftkbtree.cpp + ftk/src/ftkcmem.cpp + ftk/src/ftkcoll.cpp + ftk/src/ftkcsum.cpp + ftk/src/ftkdir.cpp + ftk/src/ftkdynbtree.cpp + ftk/src/ftkerror.cpp + ftk/src/ftkfsys.cpp + ftk/src/ftkhttp.cpp + ftk/src/ftkini.cpp + ftk/src/ftkiobuf.cpp + ftk/src/ftklock.cpp + ftk/src/ftklog.cpp + ftk/src/ftkmem.cpp + ftk/src/ftkmfh.cpp + ftk/src/ftkmisc.cpp + ftk/src/ftknet.cpp + ftk/src/ftknlm.cpp + ftk/src/ftkntab.cpp + ftk/src/ftkprntf.cpp + ftk/src/ftkrand.cpp + ftk/src/ftkrset.cpp + ftk/src/ftksem.cpp + ftk/src/ftkstrm.cpp + ftk/src/ftksupr.cpp + ftk/src/ftktext.cpp + ftk/src/ftkthrd.cpp + ftk/src/ftktime.cpp + ftk/src/ftkunix.cpp + ftk/src/ftkwin.cpp + ftk/src/ftkxml.cpp) + +if(CURSES_FOUND) + list(APPEND NWFLAIM_FTK_SOURCES ftk/src/ftkftx.cpp) +else() + message(STATUS "Curses not found; building libnwflaimtk without console FTX helpers") +endif() + +set(NWFLAIM_FLAIM_SOURCES + flaim/src/checksum.cpp + flaim/src/fblob.cpp + flaim/src/fcs.cpp + flaim/src/fdbcnfig.cpp + flaim/src/fdbcopy.cpp + flaim/src/fdb.cpp + flaim/src/fdbremov.cpp + flaim/src/fdbrenam.cpp + flaim/src/fdict.cpp + flaim/src/ffilehdr.cpp + flaim/src/fgedcom.cpp + flaim/src/flbackup.cpp + flaim/src/flchkdb.cpp + flaim/src/flclose.cpp + flaim/src/flconvrt.cpp + flaim/src/flcreate.cpp + flaim/src/fldbglog.cpp + flaim/src/flerror.cpp + flaim/src/flindex.cpp + flaim/src/flkeyret.cpp + flaim/src/flmimon.cpp + flaim/src/flmstat.cpp + flaim/src/flopen.cpp + flaim/src/flrddrct.cpp + flaim/src/flreduce.cpp + flaim/src/flsweep.cpp + flaim/src/flupdate.cpp + flaim/src/flverify.cpp + flaim/src/fmisc.cpp + flaim/src/f_nici.cpp + flaim/src/fntable.cpp + flaim/src/fnumber.cpp + flaim/src/fqcur.cpp + flaim/src/fqdecl.cpp + flaim/src/fqeval.cpp + flaim/src/fqget.cpp + flaim/src/fqkeys.cpp + flaim/src/fqlog.cpp + flaim/src/fqopt.cpp + flaim/src/fqparse.cpp + flaim/src/fqprep.cpp + flaim/src/fqread.cpp + flaim/src/fqsrch.cpp + flaim/src/fqstack.cpp + flaim/src/frebuild.cpp + flaim/src/frec.cpp + flaim/src/frecset.cpp + flaim/src/fsblk_u.cpp + flaim/src/fscomblk.cpp + flaim/src/fsconvrt.cpp + flaim/src/fscounts.cpp + flaim/src/fscursor.cpp + flaim/src/fsdatacu.cpp + flaim/src/fsdelelm.cpp + flaim/src/fsinselm.cpp + flaim/src/fslfile.cpp + flaim/src/fslfileu.cpp + flaim/src/fsnext.cpp + flaim/src/fsprev.cpp + flaim/src/fsrecget.cpp + flaim/src/fsrecupd.cpp + flaim/src/fsrefspl.cpp + flaim/src/fsrefupd.cpp + flaim/src/fssearch.cpp + flaim/src/fssplblk.cpp + flaim/src/fsv.cpp + flaim/src/fsysdata.cpp + flaim/src/ftext.cpp + flaim/src/ftrans.cpp + flaim/src/furl.cpp + flaim/src/imonbase.cpp + flaim/src/imonchk.cpp + flaim/src/imonerr.cpp + flaim/src/imonfact.cpp + flaim/src/imonfdb.cpp + flaim/src/imonffil.cpp + flaim/src/imonfhsh.cpp + flaim/src/imonfram.cpp + flaim/src/imonfsys.cpp + flaim/src/imonix.cpp + flaim/src/imonlhdr.cpp + flaim/src/imonqury.cpp + flaim/src/imonrche.cpp + flaim/src/imonrec.cpp + flaim/src/imonscfg.cpp + flaim/src/imonsche.cpp + flaim/src/imonsel.cpp + flaim/src/imonstat.cpp + flaim/src/imonutil.cpp + flaim/src/kybuild.cpp + flaim/src/kycollat.cpp + flaim/src/kyget.cpp + flaim/src/lock.cpp + flaim/src/rcache.cpp + flaim/src/recover.cpp + flaim/src/rfl.cpp + flaim/src/scache.cpp + flaim/src/translog.cpp) + +set(NWFLAIM_SQL_SOURCES + sql/src/btreeinfo.cpp + sql/src/checksum.cpp + sql/src/createdatabase.cpp + sql/src/createindex.cpp + sql/src/createtable.cpp + sql/src/deleterow.cpp + sql/src/dropdatabase.cpp + sql/src/dropindex.cpp + sql/src/droptable.cpp + sql/src/f_btpool.cpp + sql/src/f_btree.cpp + sql/src/fbtrset.cpp + sql/src/fcollate.cpp + sql/src/fdbcnfig.cpp + sql/src/fdbcopy.cpp + sql/src/fdbrenam.cpp + sql/src/fdict.cpp + sql/src/fdllmain.cpp + sql/src/fdynbuf.cpp + sql/src/ffilehdr.cpp + sql/src/flbackup.cpp + sql/src/flclose.cpp + sql/src/flconvrt.cpp + sql/src/fldbglog.cpp + sql/src/flerror.cpp + sql/src/flgethdr.cpp + sql/src/flindex.cpp + sql/src/flkeyret.cpp + sql/src/flmstat.cpp + sql/src/flog.cpp + sql/src/flreduce.cpp + sql/src/fltrabrt.cpp + sql/src/fltrbeg.cpp + sql/src/fltrcmit.cpp + sql/src/f_nici.cpp + sql/src/fnumber.cpp + sql/src/frestore.cpp + sql/src/frow.cpp + sql/src/fsblk_u.cpp + sql/src/fscursor.cpp + sql/src/fsdatacu.cpp + sql/src/fslfile.cpp + sql/src/fslfileu.cpp + sql/src/fsrefupd.cpp + sql/src/fsysdata.cpp + sql/src/funicode.cpp + sql/src/fvector.cpp + sql/src/insertrow.cpp + sql/src/kybldkey.cpp + sql/src/kybuild.cpp + sql/src/kycollat.cpp + sql/src/kyeword.cpp + sql/src/kyqsort.cpp + sql/src/kyunlock.cpp + sql/src/opendatabase.cpp + sql/src/recover.cpp + sql/src/rfl.cpp + sql/src/scache.cpp + sql/src/select.cpp + sql/src/sqleval.cpp + sql/src/sqloptimize.cpp + sql/src/sqlstatement.cpp + sql/src/translog.cpp + sql/src/updaterow.cpp + sql/src/whereclause.cpp) + +function(nwflaim_common_target target_name public_include_dir) + target_compile_features(${target_name} PUBLIC cxx_std_98) + target_compile_definitions(${target_name} PRIVATE ${_nwflaim_common_defs}) + target_include_directories(${target_name} + PUBLIC + "$" + "$" + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/ftk/src" + "${CMAKE_CURRENT_SOURCE_DIR}/flaim/src" + "${CMAKE_CURRENT_SOURCE_DIR}/sql/src") + if(NWFLAIM_USE_NICI AND NOT NWFLAIM_NICI_INCLUDE_DIR STREQUAL "") + target_include_directories(${target_name} PRIVATE "${NWFLAIM_NICI_INCLUDE_DIR}") + endif() + target_link_libraries(${target_name} PUBLIC Threads::Threads) + if(CURSES_INCLUDE_DIRS) + target_include_directories(${target_name} PRIVATE ${CURSES_INCLUDE_DIRS}) + elseif(CURSES_INCLUDE_DIR) + target_include_directories(${target_name} PRIVATE ${CURSES_INCLUDE_DIR}) + endif() + if(CURSES_LIBRARIES) + target_link_libraries(${target_name} PUBLIC ${CURSES_LIBRARIES}) + endif() + if(NWFLAIM_RT_LIBRARY) + target_link_libraries(${target_name} PUBLIC "${NWFLAIM_RT_LIBRARY}") + endif() + if(NWFLAIM_DL_LIBRARY) + target_link_libraries(${target_name} PUBLIC "${NWFLAIM_DL_LIBRARY}") + endif() +endfunction() + +function(nwflaim_add_library logical_name output_base public_include_dir) + if(NWFLAIM_BUILD_SHARED) + add_library(${logical_name} SHARED ${ARGN}) + add_library(NWFlaim::${logical_name} ALIAS ${logical_name}) + set_target_properties(${logical_name} PROPERTIES OUTPUT_NAME "${NWFLAIM_LIBRARY_PREFIX}${output_base}") + nwflaim_common_target(${logical_name} ${public_include_dir}) + endif() + if(NWFLAIM_BUILD_STATIC) + add_library(${logical_name}_static STATIC ${ARGN}) + add_library(NWFlaim::${logical_name}_static ALIAS ${logical_name}_static) + set_target_properties(${logical_name}_static PROPERTIES OUTPUT_NAME "${NWFLAIM_LIBRARY_PREFIX}${output_base}") + nwflaim_common_target(${logical_name}_static ${public_include_dir}) + endif() +endfunction() + +nwflaim_add_library(flaimtk flaimtk ftk/src ${NWFLAIM_FTK_SOURCES}) +if(TARGET flaimtk AND NWFLAIM_WITH_OPENSSL) + target_link_libraries(flaimtk PUBLIC ${_nwflaim_ssl_target}) +endif() +if(TARGET flaimtk_static AND NWFLAIM_WITH_OPENSSL) + target_link_libraries(flaimtk_static PUBLIC ${_nwflaim_ssl_target}) +endif() + +nwflaim_add_library(flaim flaim flaim/src ${NWFLAIM_FLAIM_SOURCES}) +if(TARGET flaim) + target_link_libraries(flaim PUBLIC flaimtk) +endif() +if(TARGET flaim_static) + target_link_libraries(flaim_static PUBLIC flaimtk_static) +endif() + +if(NWFLAIM_BUILD_SQL) + nwflaim_add_library(flaimsql flaimsql sql/src ${NWFLAIM_SQL_SOURCES}) + if(TARGET flaimsql) + target_link_libraries(flaimsql PUBLIC flaimtk) + endif() + if(TARGET flaimsql_static) + target_link_libraries(flaimsql_static PUBLIC flaimtk_static) + endif() +endif() + +install(TARGETS flaimtk flaim + EXPORT nwflaim-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +if(TARGET flaimsql) + install(TARGETS flaimsql + EXPORT nwflaim-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() +install(FILES ftk/src/flaimtk.h flaim/src/flaim.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +if(NWFLAIM_BUILD_SQL) + install(FILES sql/src/flaimsql.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() +install(EXPORT nwflaim-targets NAMESPACE NWFlaim:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nwflaim)