comparison CMakeLists.txt @ 17:41dd962abdd1

*: allow compiling vec in a C++ translation unit this is stupid, but whatever
author Paper <paper@tflc.us>
date Wed, 20 Nov 2024 12:02:15 -0500
parents e05c257c6a23
children e26874655738
comparison
equal deleted inserted replaced
16:9da2aba90c87 17:41dd962abdd1
1 cmake_minimum_required(VERSION 3.5) 1 cmake_minimum_required(VERSION 3.23)
2 2
3 project(vec VERSION 2.0.0 DESCRIPTION "a tiny C99 SIMD vector library") 3 project(vec VERSION 2.0.0 DESCRIPTION "a tiny C99 SIMD vector library")
4 4
5 add_library(vec SHARED src/vec.c) 5 add_library(vec SHARED src/vec.c)
6
7 target_sources(vec PUBLIC
8 $<INSTALL_INTERFACE:vec/vec.h>
9 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/vec/vec.h>
10 $<INSTALL_INTERFACE:vec/impl/integer.h>
11 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/vec/impl/integer.h>
12 )
6 13
7 include(CheckCCompilerFlag) 14 include(CheckCCompilerFlag)
8 15
9 if(MSVC) 16 if(MSVC)
10 # TODO ? 17 # TODO ?
33 if(COMPILER_HAS_AVX512F) 40 if(COMPILER_HAS_AVX512F)
34 target_compile_options(vec PRIVATE "-mavx512f") 41 target_compile_options(vec PRIVATE "-mavx512f")
35 endif() 42 endif()
36 endif() 43 endif()
37 44
45 #########################################################################
46 # integer types
38 47
39 set_target_properties(vec PROPERTIES PUBLIC_HEADER include/vec/vec.h C_STANDARD 99) 48 include(CheckTypeSize)
40 49
41 target_include_directories(vec PRIVATE include) 50 check_type_size("int16_t" INT16_T_SIZE LANGUAGE C)
51 check_type_size("uint16_t" UINT16_T_SIZE LANGUAGE C)
52 check_type_size("u_int16_t" U_INT16_T_SIZE LANGUAGE C)
53 check_type_size("int32_t" INT32_T_SIZE LANGUAGE C)
54 check_type_size("uint32_t" UINT32_T_SIZE LANGUAGE C)
55 check_type_size("u_int32_t" U_INT32_T_SIZE LANGUAGE C)
56 check_type_size("int64_t" INT64_T_SIZE LANGUAGE C)
57 check_type_size("uint64_t" UINT64_T_SIZE LANGUAGE C)
58 check_type_size("u_int64_t" U_INT64_T_SIZE LANGUAGE C)
59 check_type_size("short" SHORT_SIZE LANGUAGE C)
60 check_type_size("int" INT_SIZE LANGUAGE C)
61 check_type_size("long" LONG_SIZE LANGUAGE C)
62 check_type_size("long long" LONG_LONG_SIZE LANGUAGE C)
63 check_type_size("uintptr_t" UINTPTR_T_SIZE LANGUAGE C)
64
65 if(INT16_T_SIZE EQUAL 2)
66 set(SIZE16 "int16_t")
67 elseif(SHORT_SIZE EQUAL 2)
68 set(SIZE16 "short")
69 elseif(INT_SIZE EQUAL 2)
70 set(SIZE16 "int")
71 endif()
72
73 if(UINT16_T_SIZE EQUAL 2)
74 set(USIZE16 "uint16_t")
75 elseif(U_INT16_T_SIZE EQUAL 2)
76 set(USIZE16 "u_int16_t")
77 elseif(SHORT_SIZE EQUAL 2)
78 set(USIZE16 "unsigned short")
79 elseif(INT_SIZE EQUAL 2)
80 set(USIZE16 "unsigned int")
81 endif()
82
83 if(INT32_T_SIZE EQUAL 4)
84 set(SIZE32 "int32_t")
85 elseif(SHORT_SIZE EQUAL 4)
86 set(SIZE32 "short")
87 elseif(INT_SIZE EQUAL 4)
88 set(SIZE32 "int")
89 elseif(LONG_SIZE EQUAL 4)
90 set(SIZE32 "long")
91 endif()
92
93 if(UINT32_T_SIZE EQUAL 4)
94 set(USIZE32 "uint32_t")
95 elseif(U_INT32_T_SIZE EQUAL 4)
96 set(USIZE32 "u_int32_t")
97 elseif(SHORT_SIZE EQUAL 4)
98 set(USIZE32 "unsigned short")
99 elseif(INT_SIZE EQUAL 4)
100 set(USIZE32 "unsigned int")
101 elseif(LONG_SIZE EQUAL 4)
102 set(USIZE32 "unsigned long")
103 endif()
104
105 if(INT64_T_SIZE EQUAL 8)
106 set(SIZE64 "int64_t")
107 elseif(SHORT_SIZE EQUAL 8)
108 set(SIZE64 "short")
109 elseif(INT_SIZE EQUAL 8)
110 set(SIZE64 "int")
111 elseif(LONG_SIZE EQUAL 8)
112 set(SIZE64 "long")
113 elseif(LONG_LONG_SIZE EQUAL 8)
114 set(SIZE64 "long long")
115 endif()
116
117 if(UINT64_T_SIZE EQUAL 8)
118 set(USIZE64 "uint64_t")
119 elseif(U_INT64_T_SIZE EQUAL 8)
120 set(USIZE64 "u_int64_t")
121 elseif(SHORT_SIZE EQUAL 8)
122 set(USIZE64 "unsigned short")
123 elseif(INT_SIZE EQUAL 8)
124 set(USIZE64 "unsigned int")
125 elseif(LONG_SIZE EQUAL 8)
126 set(USIZE64 "unsigned long")
127 elseif(LONG_LONG_SIZE EQUAL 8)
128 set(USIZE64 "unsigned long long")
129 endif()
130
131 if(CMAKE_SIZEOF_VOID_P EQUAL UINTPTR_T_SIZE)
132 set(USIZEPTR "uintptr_t")
133 elseif(CMAKE_SIZEOF_VOID_P EQUAL 1)
134 set(USIZEPTR "unsigned char")
135 elseif(CMAKE_SIZEOF_VOID_P EQUAL 2)
136 set(USIZEPTR "${USIZE16}")
137 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
138 set(USIZEPTR "${USIZE32}")
139 elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
140 set(USIZEPTR "${USIZE64}")
141 endif()
142
143 configure_file(include/vec/impl/integer.h.in include/vec/impl/integer.h @ONLY)
144
145 target_compile_definitions(vec PRIVATE "VEC_HAVE_IMPL_INTEGER_H")
146
147 #########################################################################
148
149 target_compile_features(vec PRIVATE $<IF:$<COMPILE_FEATURES:c_std_11>,c_std_11,c_std_99>)
150 target_include_directories(vec PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR}/include/vec")
42 151
43 # Installing 152 # Installing
44 153
45 include(GNUInstallDirs) 154 include(GNUInstallDirs)
46 155
47 install(TARGETS vec 156 install(TARGETS vec LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
48 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 157
49 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 158 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/vec/vec.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/vec")
159 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/vec/impl/integer.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/vec/impl")
50 160
51 # pkg-config 161 # pkg-config
52 configure_file(vec.pc.in vec.pc @ONLY) 162 configure_file(vec.pc.in vec.pc @ONLY)
53 install(FILES ${CMAKE_BINARY_DIR}/vec.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig) 163 install(FILES ${CMAKE_BINARY_DIR}/vec.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)