Luciano
Luciano

Reputation: 543

How can I tell my IDE to compile my CMake project a specific way?

I have a CMake (mostly C, with some C++) project whose installation instructions are as follows:

mkdir build
cd build
cmake /*some options*/ ../
make

This works perfectly if I compile from the command-line.

I would like to use an IDE to compile this program so that I may debug it with a graphical debugger. However, when I attempt to compile using the IDE, I get linker errors.

I am unfamiliar with the internal workings of CMake and so am not sure how to achieve the desired behavior. In fact, I'm unsure if this is a CMake question at all; perhaps this is simply a question of IDE configuration. If it helps, the IDE I'm using is JetBrains' CLion.

The error given in the IDE is IDE_error

The CMake file is

set(CMAKE_CXX_COMPILER "/Library/Developer/CommandLineTools/usr/bin/c++")
set(CMAKE_C_COMPILER "/Library/Developer/CommandLineTools/usr/bin/cc")
project(mpmc)
cmake_minimum_required(VERSION 3.8)
option(MPI "Use MPI to parallelize the calculations (requires MPI)" OFF)
option(CUDA "Use CUDA to offload polarization calculations to a GPU (requires CUDA)" OFF)
option(OPENCL "Use OpenCL to offload polarization calculations to a GPU (requires OpenCL)" OFF)
option(QM_ROTATION "Enable Quantum Mechanics Rigid Rotator calculations (requires LAPACK)" OFF)
option(VDW "Enable Coupled-Dipole Van der Waals (requires LAPACK)" OFF)


configure_file (
"${PROJECT_SOURCE_DIR}/src/include/cmake_config.h.in"
"${PROJECT_BINARY_DIR}/src/include/cmake_config.h"
)

set(CMAKE_BUILD_TYPE Release)

if(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall")
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall")
endif()

set(LIB m)

set(INCLUDE src/include/ src/mersenne/ ${PROJECT_BINARY_DIR}/src/include)

set(SRC
src/mc/mc_moves.c
src/mc/surface_fit_arbitrary.c
src/mc/qshift.c
src/mc/single_point.c
src/mc/mc.c
src/mc/replay.c
src/mc/pimc.c
src/mc/surface.c
src/mc/surf_fit.c
src/mc/fugacity.c
src/mc/cavity.c
src/mc/checkpoint.c
src/histogram/histogram.c
src/energy/lj_buffered_14_7.c
src/energy/bessel.c
src/energy/dreiding.c
src/energy/energy.c
src/energy/polar.c
src/energy/pbc.c
src/energy/disp_expansion.c
src/energy/vdw.c
src/energy/pairs.c
src/energy/bond.c
src/energy/coulombic_gwp.c
src/energy/exp_repulsion.c
src/energy/coulombic.c
src/energy/sg.c
src/energy/lj.c
src/energy/axilrod_teller.cpp
src/mersenne/mt.c
src/mersenne/dSFMT.h
src/mersenne/dSFMT.c
src/mersenne/dSFMT-common.h
src/mersenne/dSFMT-params.h
src/main/quaternion.c
src/main/CArng.c
src/main/memnullcheck.c
src/main/main.c
src/main/cleanup.c
src/main/usefulmath.c
src/io/dxwrite.c
src/io/simulation_box.c
src/io/average.c
src/io/output.c
src/io/check_input.c
src/io/input.c
src/io/mpi.c
src/io/read_pqr.c
src/io/setup_ocl.c
src/polarization/thole_field.c
src/polarization/polar_wolf_lookup.c
src/polarization/thole_polarizability.c
src/polarization/thole_matrix.c
src/polarization/polar_ewald.c
src/polarization/thole_iterative.c
)

if(MPI)
    message("-- MPI Enabled")
    find_package(MPI REQUIRED)
    if(NOT MPI_C_FOUND)
        message(FATAL_ERROR "-- MPI not found! Exiting ...")
    endif()
    set(INCLUDE ${INCLUDE} ${MPI_C_INCLUDE_PATH})
    set(LIB ${LIB} ${MPI_C_LIBRARIES})
else()
    message("-- MPI Disabled")
endif()

if(CUDA)
    message("-- CUDA Enabled")
    find_package(CUDA REQUIRED)
    set(SRC ${SRC} src/polarization_gpu/polar_cuda.cu)
else()
    message("-- CUDA Disabled")
endif()

if(OPENCL)
    message("-- OpenCl Enabled")
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
    find_package(OpenCL REQUIRED)
    if(NOT OPENCL_FOUND)
        message(FATAL_ERROR "--OpenCl not found! Exiting ...")
    endif()
    set(SRC ${SRC}
        src/polarization_gpu/polar_ocl.c
        src/io/setup_ocl.c)
    set(INCLUDE ${INCLUDE} ${OpenCL_INCLUDE_DIRS})
    set(LIB ${LIB} ${OpenCL_LIBRARIES})
else()
    message("-- OpenCl Disabled")
endif()

if(QM_ROTATION)
    message("-- QM Rotation Enabled")
    set(SRC ${SRC}
        src/quantum_rotation/rotational_basis.c
        src/quantum_rotation/rotational_eigenspectrum.c
        src/quantum_rotation/rotational_integrate.c
        src/quantum_rotation/rotational_potential.c)
    set(LIB ${LIB} lapack)
else()
    message("-- QM Rotation Disabled")
endif()

if(VDW)
    message("-- CDVDW Enabled")
    if(NOT QM_ROTATION)
        set(LIB ${LIB} lapack)
    endif()
else()
    message("-- CDVDW Disabled")
endif()

include_directories(${INCLUDE})
if(CUDA)
    cuda_add_executable(${PROJECT_NAME} ${SRC})
else()
    add_executable(${PROJECT_NAME} ${SRC})
endif()
target_link_libraries(${PROJECT_NAME} ${LIB})

if(MPI)
    if(MPI_C_COMPILE_FLAGS)
      set_target_properties(${PROJECT_NAME} PROPERTIES
        COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
    endif()

    if(MPI_C_LINK_FLAGS)
      set_target_properties(${PROJECT_NAME} PROPERTIES
        LINK_FLAGS "${MPI_C_LINK_FLAGS}")
    endif()
endif()

And the directory structure is directory_structure

Upvotes: 1

Views: 286

Answers (1)

renefritze
renefritze

Reputation: 2243

You can point CLion to the build directory from your command line compile. Go to "File -> Settings -> Build, Execution, ... -> Cmake" and point the "generation path" to your "original" build directory. Otherwise CLion generates its own dir in "cmake-build-debug". Even after pointing CLion to the other dir it might still changes cmake variables depending on other parameters like "Debug/Release" Configuration on the same settings tab. Since from you cmake setup we can see that "Release" is the default, just switching that can potentially make the difference, without even switching the build dir.

Upvotes: 3

Related Questions