aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/CMakeLists.txt44
-rw-r--r--libcrystfel/config.h.cmake.in19
-rw-r--r--libcrystfel/crystfel.pc.in6
-rw-r--r--libcrystfel/src/index.c2
-rw-r--r--libcrystfel/src/symmetry.c11
5 files changed, 73 insertions, 9 deletions
diff --git a/libcrystfel/CMakeLists.txt b/libcrystfel/CMakeLists.txt
index 5d0ee069..1fba6624 100644
--- a/libcrystfel/CMakeLists.txt
+++ b/libcrystfel/CMakeLists.txt
@@ -1,4 +1,28 @@
-project(libcrystfel)
+project(libcrystfel VERSION ${CRYSTFEL_VERSION} LANGUAGES C)
+
+find_package(Curses)
+find_package(FFTW)
+find_package(CBF)
+find_package(XGANDALF)
+find_package(PINKINDEXER)
+find_package(NBP)
+find_package(FDIP)
+
+set(HAVE_CURSES ${CURSES_FOUND})
+set(HAVE_FFTW ${FFTW_FOUND})
+set(HAVE_XGANDALF ${XGANDALF_FOUND})
+set(HAVE_FDIP ${FDIP_FOUND})
+set(HAVE_CBFLIB ${CBF_FOUND})
+
+# Check for CPU affinity functions (Linux-specific)
+set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
+check_symbol_exists(sched_setaffinity "sched.h" HAVE_CPU_AFFINITY)
+unset(CMAKE_REQUIRED_DEFINITIONS)
+
+# Check for nice clock function
+check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME)
+
+configure_file(config.h.cmake.in config.h)
set(LIBCRYSTFEL_SOURCES
src/reflist.c
@@ -76,10 +100,18 @@ add_library(${PROJECT_NAME} SHARED
${LIBCRYSTFEL_FFTW_SOURCES}
${LIBCRYSTFEL_HEADERS})
+set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)
+
+set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${CRYSTFEL_API_VERSION})
+set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${CRYSTFEL_VERSION})
+
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
target_include_directories(${PROJECT_NAME} INTERFACE ${PROJECT_SOURCE_DIR}/src)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+add_definitions(-DHAVE_CONFIG_H)
+
target_include_directories(${PROJECT_NAME} PRIVATE ${HDF5_INCLUDE_DIRS})
-target_link_libraries(${PROJECT_NAME} PRIVATE util ${HDF5_C_LIBRARIES})
+target_link_libraries(${PROJECT_NAME} PRIVATE util ${HDF5_C_LIBRARIES} Threads::Threads GSL::gsl m)
if (XGANDALF_FOUND)
target_include_directories(${PROJECT_NAME} PRIVATE ${XGANDALF_INCLUDES})
@@ -119,5 +151,9 @@ endif (CURSES_FOUND)
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
install (TARGETS libcrystfel
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION lib)
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
+# crystfel.pc
+configure_file(crystfel.pc.in crystfel.pc)
+install(FILES ${CMAKE_BINARY_DIR}/libcrystfel/crystfel.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
diff --git a/libcrystfel/config.h.cmake.in b/libcrystfel/config.h.cmake.in
new file mode 100644
index 00000000..36bbba60
--- /dev/null
+++ b/libcrystfel/config.h.cmake.in
@@ -0,0 +1,19 @@
+/* config.h for libcrystfel */
+
+#cmakedefine HAVE_CLOCK_GETTIME
+#cmakedefine HAVE_CPU_AFFINITY
+#cmakedefine HAVE_FFTW
+#cmakedefine HAVE_CL_CL_H
+#cmakedefine HAVE_XGANDALF
+#cmakedefine HAVE_FDIP
+#cmakedefine HAVE_CURSES
+
+/* We avoid adding the full path to cbf.h, because CBFlib unhelpfully installs
+ * some conflicting HDF5 headers which we want to keep out of the include path.
+ * Unfortunately, sometimes CBFlib installs cbf/cbf.h, other times cbflib/cbf.h.
+ * These defines tell whether we have CBFlib at all, and if so, what to #include */
+#cmakedefine HAVE_CBFLIB
+#cmakedefine HAVE_CBF_CBF_H
+#cmakedefine HAVE_CBFLIB_CBF_H
+
+#define CRYSTFEL_VERSIONSTRING "${PROJECT_VERSION}+${GIT_SHA1}"
diff --git a/libcrystfel/crystfel.pc.in b/libcrystfel/crystfel.pc.in
index 7539cad1..3a355f06 100644
--- a/libcrystfel/crystfel.pc.in
+++ b/libcrystfel/crystfel.pc.in
@@ -5,7 +5,7 @@ includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}
Name: CrystFEL
Description: Useful routines for crystallography using a free-electron laser
-Version: ${PROJECT_VERSION}+${GIT_SHA1}
-Cflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR} -pthread
+Version: ${PROJECT_VERSION}
+Cflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR}
Libs: -L${CMAKE_INSTALL_FULL_LIBDIR} -lcrystfel
-Requires: gsl
+Requires.private: gsl
diff --git a/libcrystfel/src/index.c b/libcrystfel/src/index.c
index b20c689a..ff84c629 100644
--- a/libcrystfel/src/index.c
+++ b/libcrystfel/src/index.c
@@ -474,8 +474,6 @@ void cleanup_indexing(IndexingPrivate *ipriv)
}
- n++;
-
}
free(ipriv->methods);
diff --git a/libcrystfel/src/symmetry.c b/libcrystfel/src/symmetry.c
index 897d134f..5f3b67f2 100644
--- a/libcrystfel/src/symmetry.c
+++ b/libcrystfel/src/symmetry.c
@@ -981,6 +981,7 @@ static SymOpList *getpg_arbitrary_ua(const char *sym, size_t s)
char *pg_type;
SymOpList *pg;
IntegerMatrix *t;
+ char *new_name;
if ( strncmp(sym+s, "ua", 2) == 0 ) {
ua = sym[s+2];
@@ -1037,6 +1038,16 @@ static SymOpList *getpg_arbitrary_ua(const char *sym, size_t s)
transform_ops(pg, t);
intmat_free(t);
+ new_name = malloc(64);
+ if ( new_name == NULL ) {
+ ERROR("Couldn't allocate space for PG name\n");
+ return NULL;
+ }
+
+ snprintf(new_name, 64, "%s_ua%c", pg->name, ua);
+ free(pg->name);
+ pg->name = new_name;
+
return pg;
}