summaryrefslogtreecommitdiff
path: root/cmake/FindPoly.cmake
blob: 3556a9d63f9ad1af4d5ad26529aac468c012dc2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#####################
## FindPoly.cmake
## Top contributors (to current version):
##   Gereon Kremer
## This file is part of the CVC4 project.
## Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
## in the top-level source directory and their institutional affiliations.
## All rights reserved.  See the file COPYING in the top-level source
## directory for licensing information.
##
# Find LibPoly
# Poly_FOUND - should always be true
# Poly - target for the libpoly library
# Polyxx - target for the C++ interface of libpoly, also links Poly

include(deps-helper)

find_path(Poly_INCLUDE_DIR NAMES poly/poly.h)
find_library(Poly_LIBRARIES NAMES poly)
find_library(PolyXX_LIBRARIES NAMES polyxx)

set(Dummy_FOUND_SYSTEM FALSE)
if(Poly_INCLUDE_DIR
   AND Poly_LIBRARIES
   AND PolyXX_LIBRARIES
)
  set(Poly_FOUND_SYSTEM TRUE)

  file(STRINGS ${Poly_INCLUDE_DIR}/poly/version.h Poly_VERSION
       REGEX "^#define[\t ]+LIBPOLY_VERSION [0-9+]+"
  )
  string(REGEX MATCH "[0-9.]+" Poly_VERSION "${Poly_VERSION}")

  check_system_version("Poly")
endif()

if(NOT Poly_FOUND_SYSTEM)
  include(ExternalProject)

  # TODO(#4706): Use proper release, after the next release
  set(Poly_VERSION "bae67639726f63ed508a30845108bfdac4a77546")

  check_if_cross_compiling(CCWIN "Windows" "")
  if(CCWIN)
    # Roughly following https://stackoverflow.com/a/44383330/2375725
    set(patchcmd
        PATCH_COMMAND
        patch
        <SOURCE_DIR>/src/CMakeLists.txt
        ${CMAKE_CURRENT_LIST_DIR}/deps-utils/Poly-patch-cmake.patch
        # Avoid %z and %llu format specifiers
        COMMAND find <SOURCE_DIR>/ -type f -exec
                sed -i.orig "s/%z[diu]/%\" PRIu64 \"/g" {} +
        COMMAND find <SOURCE_DIR>/ -type f -exec
                sed -i.orig "s/%ll[du]/%\" PRIu64 \"/g" {} +
        # Make sure the new macros are available
        COMMAND find <SOURCE_DIR>/ -type f -exec
                sed -i.orig "s/#include <stdio.h>/#include <stdio.h>\\n#include <inttypes.h>/" {} +
        COMMAND find <SOURCE_DIR>/ -type f -exec
                sed -i.orig "s/#include <cstdio>/#include <cstdio>\\n#include <inttypes.h>/" {} +
    )
  else()
    unset(patchcmd)
  endif()

  ExternalProject_Add(
    Poly-EP
    PREFIX ${DEPS_PREFIX}
    URL https://github.com/SRI-CSL/libpoly/archive/${Poly_VERSION}.tar.gz
    URL_HASH SHA1=2e79d5220d3ecbb40811463fcf12c5ddbd4b9f30
    DOWNLOAD_NAME libpoly.tar.gz
    ${patchcmd}
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
               -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
               -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
               -DLIBPOLY_BUILD_PYTHON_API=OFF
               -DLIBPOLY_BUILD_STATIC=ON
               -DLIBPOLY_BUILD_STATIC_PIC=ON
    BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} static_pic_poly static_pic_polyxx
    INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install
    COMMAND ${CMAKE_COMMAND} -E copy src/libpicpoly.a
            <INSTALL_DIR>/lib/libpicpoly.a
    COMMAND ${CMAKE_COMMAND} -E copy src/libpicpolyxx.a
            <INSTALL_DIR>/lib/libpicpolyxx.a
    BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libpicpoly.a
                     <INSTALL_DIR>/lib/libpicpolyxx.a
  )
  ExternalProject_Add_Step(
    Poly-EP cleanup
    DEPENDEES install
    COMMAND ${CMAKE_COMMAND} -E remove_directory <SOURCE_DIR>/test/
    COMMAND ${CMAKE_COMMAND} -E remove_directory <BINARY_DIR>/test/
  )
  add_dependencies(Poly-EP GMP)

  set(Poly_INCLUDE_DIR "${DEPS_BASE}/include/")
  set(Poly_LIBRARIES "${DEPS_BASE}/lib/libpicpoly.a")
  set(PolyXX_LIBRARIES "${DEPS_BASE}/lib/libpicpolyxx.a")
endif()

set(Poly_FOUND TRUE)

add_library(Poly STATIC IMPORTED GLOBAL)
set_target_properties(Poly PROPERTIES IMPORTED_LOCATION "${Poly_LIBRARIES}")
set_target_properties(
  Poly PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${Poly_INCLUDE_DIR}"
)

add_library(Polyxx STATIC IMPORTED GLOBAL)
set_target_properties(Polyxx PROPERTIES IMPORTED_LOCATION "${PolyXX_LIBRARIES}")
set_target_properties(
  Polyxx PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${Poly_INCLUDE_DIR}"
)
set_target_properties(Polyxx PROPERTIES INTERFACE_LINK_LIBRARIES Poly)

mark_as_advanced(Poly_FOUND)
mark_as_advanced(Poly_FOUND_SYSTEM)
mark_as_advanced(Poly_INCLUDE_DIR)
mark_as_advanced(Poly_LIBRARIES)
mark_as_advanced(PolyXX_LIBRARIES)

if(Poly_FOUND_SYSTEM)
  message(STATUS "Found Poly ${Poly_VERSION}: ${Poly_LIBRARIES}")
else()
  message(STATUS "Building Poly ${Poly_VERSION}: ${Poly_LIBRARIES}")
  add_dependencies(Poly Poly-EP)
  add_dependencies(Polyxx Poly-EP)
endif()
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback