@@ -81,6 +81,11 @@ set(GCC_MIN_VERSION "9") # minimum GCC version that is tested in CI
8181project (iqtree)
8282add_definitions (-DIQ_TREE)
8383
84+ # Require position independent code for IQ-TREE to be used as a library
85+ if (BUILD_LIB)
86+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
87+ endif ()
88+
8489# Find Eigen3 library
8590if (NOT EIGEN3_INCLUDE_DIR)
8691 find_package (Eigen3)
@@ -134,7 +139,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Release")
134139 message ("Build mode : Release" )
135140endif ()
136141
137- if (BUILD_LIB STREQUAL "ON" )
142+ if (BUILD_LIB)
138143 message ("Build lib : ON" )
139144else ()
140145 message ("Build lib : OFF" )
@@ -239,11 +244,19 @@ endif()
239244##################################################################
240245# Include the CMAPLE library
241246##################################################################
247+
242248if (NOT WIN32 )
243249 # temporarily disable cmaple for Windows, next to fix for next release
244250 option (USE_CMAPLE "Integrate CMAPLE" ON )
245251endif ()
246252
253+ option (USE_CMAPLE_AA "Integrate CMAPLE-AA" OFF )
254+
255+ if (BUILD_LIB)
256+ set (USE_CMAPLE "OFF" )
257+ set (USE_CMAPLE_AA "OFF" )
258+ endif ()
259+
247260if (USE_CMAPLE STREQUAL "ON" )
248261 message ("Integrate CMAPLE: ON" )
249262 add_definitions (-DUSE_CMAPLE)
@@ -256,7 +269,6 @@ else()
256269 set (TARGET_CMAPLE "" )
257270endif ()
258271
259- option (USE_CMAPLE_AA "Integrate CMAPLE-AA" OFF )
260272
261273if (USE_CMAPLE_AA STREQUAL "ON" )
262274 message ("Integrate CMAPLE_AA: ON" )
@@ -265,6 +277,18 @@ else()
265277 message ("Integrate CMAPLE_AA: OFF" )
266278endif ()
267279
280+ ##################################################################
281+ # build IQTREE library
282+ ##################################################################
283+ option (BUILD_LIB "Build IQTREE library" OFF )
284+
285+ if (BUILD_LIB)
286+ message ("Build IQTREE library: ON" )
287+ add_definitions (-DBUILD_LIB)
288+ else ()
289+ message ("Build IQTREE library: OFF" )
290+ endif ()
291+
268292##################################################################
269293# Detect target platforms
270294##################################################################
@@ -425,6 +449,10 @@ if (__ARM_NEON AND APPLE)
425449 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Dthread_local=" )
426450endif ()
427451
452+ # for list of libraries to combine with for building IQTREE3 static library
453+ SET (STATIC_LIBS "${PROJECT_BINARY_DIR} /libiqtree3.a" )
454+
455+
428456##################################################################
429457# detect 32 or 64 bit binary
430458##################################################################
@@ -502,15 +530,21 @@ if (NOT IQTREE_FLAGS MATCHES "single")
502530 if (CLANG AND APPLE )
503531 if (OSX_NATIVE_ARCHITECTURE STREQUAL "arm64" )
504532 link_directories (${PROJECT_SOURCE_DIR} /libmac_m1)
533+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /libmac_m1/libomp.a" "${PROJECT_SOURCE_DIR} /libmac_m1/libz.a" )
505534 else ()
506- link_directories (${PROJECT_SOURCE_DIR} /libmac)
507- endif ()
535+ link_directories (${PROJECT_SOURCE_DIR} /libmac)
536+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /libmac/libomp.a" "${PROJECT_SOURCE_DIR} /libmac/libz.a" )
537+ endif ()
508538 elseif (UNIX AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" )
509- if (__ARM_NEON)
510- link_directories (${PROJECT_SOURCE_DIR} /liblinux_arm)
511- else ()
512- link_directories (${PROJECT_SOURCE_DIR} /lib)
513- endif ()
539+ if (__ARM_NEON)
540+ link_directories (${PROJECT_SOURCE_DIR} /liblinux_arm)
541+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /liblinux_arm/libomp.a" "${PROJECT_SOURCE_DIR} /liblinux_arm/libz.a" )
542+ elseif (BUILD_LIB)
543+ find_package (OpenMP)
544+ else ()
545+ link_directories (${PROJECT_SOURCE_DIR} /lib)
546+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /lib/libomp.a" "${PROJECT_SOURCE_DIR} /lib/libz.a" )
547+ endif ()
514548 elseif (WIN32 )
515549 link_directories (${PROJECT_SOURCE_DIR} /lib)
516550 endif ()
@@ -794,8 +828,6 @@ if (USE_CMAPLE STREQUAL "ON")
794828 add_subdirectory (cmaple)
795829endif ()
796830
797- add_subdirectory (main)
798-
799831# YAML library
800832option (YAML_CPP_BUILD_TESTS "Enable testing" OFF )
801833option (YAML_CPP_BUILD_TOOLS "Enable parse tools" OFF )
@@ -819,24 +851,25 @@ endif()
819851
820852add_library (kernelsse tree /phylokernelsse.cpp)
821853
822- if (NOT IQTREE_FLAGS MATCHES "novx" )
823- add_library (kernelavx tree /phylotreeavx.cpp)
824- add_library (kernelfma tree /phylokernelfma.cpp)
854+ if (NOT BINARY32 AND NOT IQTREE_FLAGS MATCHES "novx" )
855+ add_library (kernelavx tree /phylotreeavx.cpp)
856+ add_library (kernelfma tree /phylokernelfma.cpp)
825857 if (IQTREE_FLAGS MATCHES "KNL" )
826858 add_library (kernelavx512 tree /phylokernelavx512.cpp)
827859 endif ()
828860endif ()
829861
862+ add_subdirectory (main)
863+
830864##################################################################
831865# build lib file or main executable
832866##################################################################
833- option (BUILD_LIB "Build IQ-TREE2 library" OFF )
834-
835- if (BUILD_LIB STREQUAL "ON" )
867+ if (BUILD_LIB)
836868 add_library (iqtree3
837869 obsolete/parsmultistate.cpp
838870 obsolete/parsmultistate.h
839871 )
872+
840873else ()
841874 add_executable (iqtree3
842875 obsolete/parsmultistate.cpp
@@ -861,6 +894,7 @@ endif(Backtrace_FOUND)
861894
862895if (USE_BOOSTER)
863896 target_link_libraries (iqtree3 booster)
897+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /booster/libbooster.a" )
864898 if (USE_CMAPLE_AA STREQUAL "ON" )
865899 target_link_libraries (iqtree3-aa booster)
866900 endif ()
@@ -917,9 +951,18 @@ if (NOT IQTREE_FLAGS MATCHES "single")
917951 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${PROJECT_SOURCE_DIR} /lib" )
918952 set (THREAD_LIB "pthreadVC2" )
919953 elseif (CLANG AND WIN32 )
920- target_link_libraries (iqtree3 ${PROJECT_SOURCE_DIR} /lib/libiomp5md.dll)
921- if (USE_CMAPLE_AA STREQUAL "ON" )
922- target_link_libraries (iqtree3-aa ${PROJECT_SOURCE_DIR} /lib/libiomp5md.dll)
954+ if (BINARY32)
955+ target_link_libraries (iqtree3 ${PROJECT_SOURCE_DIR} /lib32/libiomp5md.dll)
956+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /lib32/libiomp5md.dll" )
957+ if (USE_CMAPLE_AA STREQUAL "ON" )
958+ target_link_libraries (iqtree3-aa ${PROJECT_SOURCE_DIR} /lib32/libiomp5md.dll)
959+ endif ()
960+ else ()
961+ target_link_libraries (iqtree3 ${PROJECT_SOURCE_DIR} /lib/libiomp5md.dll)
962+ LIST (APPEND STATIC_LIBS "${PROJECT_SOURCE_DIR} /lib/libiomp5md.dll" )
963+ if (USE_CMAPLE_AA STREQUAL "ON" )
964+ target_link_libraries (iqtree3-aa ${PROJECT_SOURCE_DIR} /lib/libiomp5md.dll)
965+ endif ()
923966 endif ()
924967 endif ()
925968endif ()
@@ -928,6 +971,8 @@ endif()
928971target_link_libraries (iqtree3 pll ncl nclextra utils pda lbfgsb whtest sprng vectorclass model
929972 gsl alignment tree simulator terrace yaml-cpp phyloYAML main ${TARGET_CMAPLE} ${PLATFORM_LIB} ${STD_LIB} ${THREAD_LIB} ${ATOMIC_LIB} )
930973
974+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /pll/libpll.a" "${PROJECT_BINARY_DIR} /ncl/libncl.a" "${PROJECT_BINARY_DIR} /nclextra/libnclextra.a" "${PROJECT_BINARY_DIR} /utils/libutils.a" "${PROJECT_BINARY_DIR} /pda/libpda.a" "${PROJECT_BINARY_DIR} /lbfgsb/liblbfgsb.a" "${PROJECT_BINARY_DIR} /whtest/libwhtest.a" "${PROJECT_BINARY_DIR} /sprng/libsprng.a" "${PROJECT_BINARY_DIR} /vectorclass/libvectorclass.a" "${PROJECT_BINARY_DIR} /model/libmodel.a" "${PROJECT_BINARY_DIR} /gsl/libgsl.a" "${PROJECT_BINARY_DIR} /alignment/libalignment.a" "${PROJECT_BINARY_DIR} /tree/libtree.a" "${PROJECT_BINARY_DIR} /simulator/libsimulator.a" "${PROJECT_BINARY_DIR} /terrace/libterrace.a" "${PROJECT_BINARY_DIR} /yaml-cpp/libyaml-cpp.a" "${PROJECT_BINARY_DIR} /phylo-yaml/libphyloYAML.a" "${PROJECT_BINARY_DIR} /main/libmain.a" )
975+
931976if (USE_CMAPLE_AA STREQUAL "ON" )
932977 target_link_libraries (iqtree3-aa pll ncl nclextra utils pda lbfgsb whtest sprng vectorclass model
933978 gsl alignment tree simulator terrace yaml-cpp phyloYAML main-aa maple-aa ${PLATFORM_LIB} ${STD_LIB} ${THREAD_LIB} ${ATOMIC_LIB} )
@@ -950,20 +995,23 @@ endif()
950995
951996if (USE_TERRAPHAST)
952997 target_link_libraries (iqtree3 terracetphast)
998+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /terracetphast/libterracetphast.a" "${PROJECT_BINARY_DIR} /terraphast/libterraphast.a" )
953999 if (USE_CMAPLE_AA STREQUAL "ON" )
9541000 target_link_libraries (iqtree3-aa terracetphast)
9551001 endif ()
9561002endif ()
9571003
9581004if (USE_LSD2)
9591005 target_link_libraries (iqtree3 lsd2)
1006+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /lsd2/liblsd2.a" )
9601007 if (USE_CMAPLE_AA STREQUAL "ON" )
9611008 target_link_libraries (iqtree3-aa lsd2)
9621009 endif ()
9631010endif ()
9641011
9651012if (NOT IQTREE_FLAGS MATCHES "nosse" )
9661013 target_link_libraries (iqtree3 kernelsse)
1014+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /libkernelsse.a" )
9671015 if (USE_CMAPLE_AA STREQUAL "ON" )
9681016 target_link_libraries (iqtree3-aa kernelsse)
9691017 endif ()
@@ -982,11 +1030,13 @@ endif()
9821030# SSE, AVX etc. libraries
9831031if (NOT BINARY32 AND NOT IQTREE_FLAGS MATCHES "novx" )
9841032 target_link_libraries (iqtree3 pllavx kernelavx kernelfma)
1033+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /pll/libpllavx.a" "${PROJECT_BINARY_DIR} /libkernelavx.a" "${PROJECT_BINARY_DIR} /libkernelfma.a" )
9851034 if (USE_CMAPLE_AA STREQUAL "ON" )
9861035 target_link_libraries (iqtree3-aa pllavx kernelavx kernelfma)
9871036 endif ()
9881037 if (IQTREE_FLAGS MATCHES "KNL" )
9891038 target_link_libraries (iqtree3 kernelavx512)
1039+ LIST (APPEND STATIC_LIBS "${PROJECT_BINARY_DIR} /libkernelavx512.a" )
9901040 if (USE_CMAPLE_AA STREQUAL "ON" )
9911041 target_link_libraries (iqtree3-aa kernelavx512)
9921042 endif ()
@@ -1021,7 +1071,7 @@ else()
10211071 set (BINARY_DIR "${PROJECT_BINARY_DIR} " )
10221072endif ()
10231073
1024- if (WIN32 )
1074+ if (NOT BUILD_LIB AND WIN32 )
10251075 if (MSVC )
10261076 if (CLANG_UNDER_VS)
10271077 ADD_CUSTOM_COMMAND (TARGET iqtree3 POST_BUILD COMMAND copy "iqtree3${EXE_SUFFIX} .exe" "iqtree3${EXE_SUFFIX} -click.exe" )
@@ -1042,6 +1092,36 @@ if (WIN32)
10421092 endif ()
10431093endif ()
10441094
1095+ ##############################################################
1096+ # CREATE A STATIC LIBRARY
1097+ ##############################################################
1098+
1099+ if (BUILD_LIB)
1100+ if (APPLE )
1101+ add_custom_command (
1102+ TARGET iqtree3 POST_BUILD
1103+ COMMAND libtool -static -o libiqtree.a ${STATIC_LIBS}
1104+ COMMAND rm libiqtree3.a
1105+ VERBATIM )
1106+ elseif (UNIX )
1107+ add_custom_command (
1108+ TARGET iqtree3 POST_BUILD
1109+ COMMAND mkdir all_libs
1110+ COMMAND ln -s ${STATIC_LIBS} all_libs
1111+ COMMAND ${PROJECT_SOURCE_DIR} /test_scripts/unify-static -libs.sh libiqtree.a all_libs
1112+ COMMAND rm -rf all_libs
1113+ COMMAND rm libiqtree3.a
1114+ VERBATIM )
1115+ elseif (WIN32 )
1116+ add_custom_command (
1117+ TARGET iqtree3 POST_BUILD
1118+ COMMAND ${PROJECT_SOURCE_DIR} /test_scripts/unify-static -libs.bat ${STATIC_LIBS}
1119+ COMMAND ${CMAKE_COMMAND} -E rm -f libiqtree3.a
1120+ COMMAND ${PROJECT_SOURCE_DIR} /test_scripts/make-dll-lib.bat ${PROJECT_SOURCE_DIR} /test_scripts/bridge.cpp
1121+ VERBATIM )
1122+ endif ()
1123+ endif ()
1124+
10451125##############################################################
10461126# add the install targets
10471127##############################################################
0 commit comments