cmake_minimum_required(VERSION 3.21.0) project(KGC LANGUAGES C) include(GNUInstallDirs) set(MIRACL_INSTALL_INCLUDEDIR ${CMAKE_CURRENT_BINARY_DIR}/output/include) set(MIRACL_INSTALL_LIBDIR ${CMAKE_CURRENT_BINARY_DIR}/output/temp) set(MIRACL_INSTALL_BINDIR ${CMAKE_CURRENT_BINARY_DIR}/output/temp) add_subdirectory(miracl) aux_source_directory(. APP_SRC) # 创建 KGC 静态库并链接 Miracl add_library(${PROJECT_NAME} STATIC ${APP_SRC}) target_link_libraries(${PROJECT_NAME} PUBLIC Miracl) target_include_directories(${PROJECT_NAME} PUBLIC include ${CMAKE_CURRENT_SOURCE_DIR} ) file(GLOB_RECURSE MIRACL_HEADER_FILES ${CMAKE_CURRENT_BINARY_DIR}/miracl/*.h) file(COPY ${MIRACL_HEADER_FILES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/output/include") file(GLOB HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h) file(COPY ${HEADER_FILES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/output/include") if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a" OR "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.lib") if(MSVC) file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.lib) else() file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a) endif() endif() if(APPLE) add_custom_command(OUTPUT lib${PROJECT_NAME}All COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/lib" COMMAND libtool -static -o "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a" $ $ DEPENDS ${PROJECT_NAME} Miracl) elseif(MSVC) add_custom_command(OUTPUT lib${PROJECT_NAME}All COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/lib" COMMAND lib.exe "-OUT:${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.lib" $ $ DEPENDS ${PROJECT_NAME} Miracl) elseif(WIN32) add_custom_command(OUTPUT lib${PROJECT_NAME}All COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/lib" COMMAND ${CMAKE_COMMAND} -E copy $ $ "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND cd "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND ${CMAKE_AR} x "${CMAKE_CURRENT_BINARY_DIR}/output/temp/libMiracl.a" COMMAND ${CMAKE_AR} x "${CMAKE_CURRENT_BINARY_DIR}/output/temp/lib${PROJECT_NAME}.a" COMMAND ${CMAKE_AR} crs "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a" "*.obj" DEPENDS ${PROJECT_NAME} Miracl ) else() add_custom_command(OUTPUT lib${PROJECT_NAME}All COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output/lib" COMMAND ${CMAKE_COMMAND} -E copy $ $ "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND cd "${CMAKE_CURRENT_BINARY_DIR}/output/temp" COMMAND ${CMAKE_AR} x "${CMAKE_CURRENT_BINARY_DIR}/output/temp/libMiracl.a" COMMAND ${CMAKE_AR} x "${CMAKE_CURRENT_BINARY_DIR}/output/temp/lib${PROJECT_NAME}.a" COMMAND ${CMAKE_AR} crs "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a" "*.o" DEPENDS ${PROJECT_NAME} Miracl ) endif() add_custom_target(${PROJECT_NAME}All ALL DEPENDS lib${PROJECT_NAME}All) if(KGC_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR ${KGC_INSTALL_BINDIR}) endif() if(KGC_INSTALL_LIBDIR) set(CMAKE_INSTALL_LIBDIR ${KGC_INSTALL_LIBDIR}) endif() if(KGC_INSTALL_INCLUDEDIR) set(CMAKE_INSTALL_INCLUDEDIR ${KGC_INSTALL_INCLUDEDIR}) endif() install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if(MSVC) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.lib" DESTINATION ${CMAKE_INSTALL_LIBDIR}) else() install(FILES "${CMAKE_CURRENT_BINARY_DIR}/output/lib/lib${PROJECT_NAME}All.a" DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() file(GLOB HEADER_FILES ${CMAKE_CURRENT_BINARY_DIR}/output/include/*.h) install(FILES ${HEADER_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})