I am trying to build a project using CMake instead of a given Makefile. I need to do this since I want to wrap the C++ Code via Julias CxxWrap, which also has a build recipe using CMake. However I am not sure how to get all the compiler flags and so on translated properly.
The Makefile is the following:
================= Libraries and Includes ====================================
INOUT_INCLUDE_DIR = ./InOut/include
STRUCT_INCLUDE_DIR = ./DataStruct/include
DELCX_INCLUDE_DIR = ./Delcx/include
ALFCX_INCLUDE_DIR = ./Alphacx/include
VOLUMES_INCLUDE_DIR = ./Volumes/include
INCLUDE_DIRS = -I$(INC_DIR) -I$(INOUT_INCLUDE_DIR) -I$(STRUCT_INCLUDE_DIR)\
-I$(DELCX_INCLUDE_DIR) -I$(ALFCX_INCLUDE_DIR) -I$(VOLUMES_INCLUDE_DIR)
GMP_LIB_DIR =
LIB_DIRS =
GMP_LIBS = -lgmp
LIBS = $(GMP_LIBS) -lstdc++
# ================= Project Directories ====================================
INC_DIR = ./project/include
SRC_DIR = ./project/src
OBJ_DIR = ./project/src
BIN_DIR = ./bin
# ================= Project Name ===========================================
EXT=
NAME=AlphaMol
NAMEOBJ=$(OBJ_DIR)/$(NAME).o
NAMEBIN=$(BIN_DIR)/$(NAME)$(EXT)
# ================= Compilers and Flags ====================================
CPP := g++
CPPFLAGS := -c -O3 -Wdeprecated-declarations -Wuninitialized -ansi -Werror -Wunused -std=c++11
LOAD_LIB_PATH =
LD_FLAGS = -O3
# ================= Pattern rules ==========================================
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CPP) $(CPPFLAGS) $(INCLUDE_DIRS) $< -o $@
# ================= Compile source code ====================================
OBJECTS = \
$(NAMEOBJ)
# ================= Generate Executable ====================================
$(NAMEBIN) : $(OBJECTS)
$(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)
all: $(OBJECTS)
$(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)
clean:
touch $(OBJ_DIR)/junk.o; rm -f $(OBJ_DIR)/*.o $(NAMEBIN)
$(OBJECTS):
My attempt at doing "the same thing but including CxxWrap via CMake looks like this:
project(AlphaMol)
cmake_minimum_required(VERSION 2.8.12)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gdwarf-3")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
#JLCXX
find_package(JlCxx)
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")
message(STATUS "Found JlCxx at ${JlCxx_location}")
add_library(AlphaMol SHARED AlphaMol.cpp)
target_link_libraries(AlphaMol JlCxx::cxxwrap_julia)
#GMP
set(GMP_PREFIX "" CACHE PATH "path ")
find_path(GMP_INCLUDE_DIR gmp.h gmpxx.h
PATHS ${GMP_PREFIX}/include /usr/include /usr/local/include )
find_library(GMP_LIBRARY NAMES gmp libgmp
PATHS ${GMP_PREFIX}/lib /usr/lib /usr/local/lib)
if(GMP_INCLUDE_DIR AND GMP_LIBRARY)
get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARY} PATH)
set(GMP_FOUND TRUE)
endif()
if(GMP_FOUND)
if(NOT GMP_FIND_QUIETLY)
MESSAGE(STATUS "Found GMP: ${GMP_LIBRARY}")
endif()
elseif(GMP_FOUND)
if(GMP_FIND_REQUIRED)
message(FATAL_ERROR "Could not find GMP")
endif()
endif()
target_link_libraries(AlphaMol ${GMP_LIBRARY})
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
$<INSTALL_INTERFACE:../include>
)
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Alphacx/include>
$<INSTALL_INTERFACE:/../../Alphacx/include>
)
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../DataStruct/include>
$<INSTALL_INTERFACE:/../../DataStruct/include>
)
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Delcx/include>
$<INSTALL_INTERFACE:/../../Delcx/include>
)
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../InOut/include>
$<INSTALL_INTERFACE:/../../InOut/include>
)
target_include_directories(AlphaMol PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../Volumes/include>
$<INSTALL_INTERFACE:/../../Volumes/include>
)
install(TARGETS
AlphaMol
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION lib)
I understand that this is still a good way from being finished, but I am a proper C++ noob and any help would be greatly appreciated!
The c++ project is available on github: [https://github.com/pkoehl/AlphaMol] Thanks in advance
Vlad
I ended up with the following CMake File which gets the job done. Note that I am now building a Shared library. Furthermore, I actually did not specify any compiler flags. In the end it was just a matter of linking the correct libraries.
cmake_minimum_required(VERSION 3.1.0)
project(alphamol)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Try to find the GNU Multiple Precision Arithmetic Library (GMP)
find_path(GMP_INCLUDE_DIR gmp.h
PATHS /usr/include /usr/local/include )
find_library(GMP_LIBRARY NAMES gmp
PATHS /usr/lib /usr/local/lib)
if(GMP_INCLUDE_DIR AND GMP_LIBRARY)
get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARY} PATH)
set(GMP_FOUND TRUE)
endif()
if(GMP_FOUND)
if(NOT GMP_FIND_QUIETLY)
MESSAGE(STATUS "Found GMP: ${GMP_LIBRARY}")
endif()
elseif(GMP_FOUND)
if(GMP_FIND_REQUIRED)
message(FATAL_ERROR "Could not find GMP")
endif()
endif()
# Include JLCxx
find_package(JlCxx)
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")
message(STATUS "Found JlCxx at ${JlCxx_location}")
# AlphaMol includes
list(APPEND ALPHAMOL_INCLUDE_DIRS "DataStruct/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Delcx/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Alphacx/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "InOut/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "Volumes/include")
list(APPEND ALPHAMOL_INCLUDE_DIRS "project/include")
# build app
file(GLOB ALPHAMOL_SOURCE "project/src/*.cpp")
include_directories(${ALPHAMOL_INCLUDE_DIRS} ${GMP_INCLUDE_DIR})
add_library(AlphaMol SHARED ${ALPHAMOL_SOURCE})
target_link_libraries(AlphaMol gmp JlCxx::cxxwrap_julia)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.