Skip to content

Commit

Permalink
Added support for using mp as a cmake submodule in external projects.
Browse files Browse the repository at this point in the history
  • Loading branch information
mapgccv committed Feb 3, 2021
1 parent 27e65ad commit 75f1d92
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 43 deletions.
32 changes: 29 additions & 3 deletions CMakeLists.txt
Expand Up @@ -32,6 +32,14 @@ if (POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif ()

get_directory_property(hasParent PARENT_DIRECTORY)
if(hasParent)
set(MP_FOLDER_PREFIX "mp/")
else()
set(MP_FOLDER_PREFIX "")
endif()
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

set(MP_VERSION 3.1.0)
if (NOT MP_VERSION MATCHES "^([0-9]+).([0-9]+).([0-9]+)$")
message(FATAL_ERROR "Invalid version format ${MP_VERSION}.")
Expand All @@ -49,6 +57,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

set_property(GLOBAL PROPERTY MP_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
# Set the default Java search path.
if (UNIX)
set(JAVA_HOME /usr/lib/jvm/java-7-oracle)
Expand Down Expand Up @@ -144,6 +153,17 @@ function (add_prefix var prefix)
set(${var} ${result} PARENT_SCOPE)
endfunction ()

# Add files specified as additional arguments to the specified folder.
function (add_to_folder folder)
foreach (target ${ARGN})
if(TARGET ${target})
set_property(TARGET ${target} PROPERTY FOLDER ${folder})
endif()
endforeach ()
endfunction ()



set_cache(AMPL_LIBRARY_DIR bin STRING
"A directory to install AMPL function libraries relative to "
"${CMAKE_INSTALL_PREFIX}")
Expand All @@ -163,12 +183,12 @@ macro(add_ampl_library name)
install(TARGETS ${name} RUNTIME
DESTINATION ${AMPL_LIBRARY_DIR} LIBRARY DESTINATION ${AMPL_LIBRARY_DIR})
endif ()
add_to_folder(${MP_FOLDER_PREFIX}ampl-libraries ${name})
endmacro()

include_directories(include)

set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)

set(MP_DATE 20141202)
set(MP_SYSINFO "${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR}")

Expand Down Expand Up @@ -219,6 +239,9 @@ function (add_mp_library name)
target_link_libraries(${name}-dynrt ${lib}-dynrt)
endif ()
endforeach ()
if(hasParent)
add_to_folder(mp ${name} ${name}-dynrt)
endif()
endfunction ()

# Link target with libraries built with dynamic runtime.
Expand Down Expand Up @@ -259,6 +282,7 @@ else ()
COMMAND ${WINE} $<TARGET_FILE:gen-expr-info> ${MP_EXPR_INFO_FILE}
DEPENDS gen-expr-info)
endif ()
add_to_folder(${MP_FOLDER_PREFIX}util gen-expr-info)

add_prefix(MP_HEADERS include/mp/
arrayref.h basic-expr-visitor.h clock.h common.h error.h expr.h
Expand All @@ -271,7 +295,7 @@ add_prefix(MP_SOURCES src/

add_mp_library(mp ${MP_HEADERS} ${MP_SOURCES} ${MP_EXPR_INFO_FILE}
COMPILE_DEFINITIONS MP_DATE=${MP_DATE} MP_SYSINFO="${MP_SYSINFO}"
INCLUDE_DIRECTORIES src OBJECT_LIBRARIES format)
INCLUDE_DIRECTORIES src include OBJECT_LIBRARIES format)
set_target_properties(mp PROPERTIES
VERSION ${MP_VERSION} SOVERSION ${MP_VERSION_MAJOR})

Expand Down Expand Up @@ -317,18 +341,20 @@ check_cxx_source_compiles("

if (MP_VARIADIC_TEMPLATES)
add_executable(nl-example src/nl-example.cc)
add_to_folder(${MP_FOLDER_PREFIX}util nl-example)
target_link_libraries(nl-example mp)
endif ()

add_subdirectory(doc)
add_subdirectory(src/amplsig)
add_subdirectory(src/asl)
add_subdirectory(src/amplsig)
add_subdirectory(src/cp)
add_subdirectory(solvers)

# Add a target that generates a file with solver and library versions.
set(AMPL_VERSIONS_FILE versions.txt)
add_custom_target(versions cmake -E remove ${AMPL_VERSIONS_FILE})
add_to_folder(${MP_FOLDER_PREFIX}util versions)
foreach (target gsl-info gecode jacop)
if (TARGET ${target})
add_custom_command(TARGET versions POST_BUILD
Expand Down
14 changes: 9 additions & 5 deletions solvers/CMakeLists.txt
Expand Up @@ -33,6 +33,8 @@ function(add_ampl_solver name)
cmake_parse_arguments(add_ampl_solver "DLL_RUNTIME;EXTERNAL"
"MODULE" "INCLUDE_DIRS;LIBRARIES;DEFINITIONS" ${ARGN})

get_property(MP_BASE_DIR GLOBAL PROPERTY MP_BASE_DIR)

set(options)
if (add_ampl_solver_EXTERNAL)
set(options EXTERNAL)
Expand Down Expand Up @@ -82,13 +84,13 @@ function(add_ampl_solver name)
set(use_dll_runtime True)
endif ()

if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name})
if (EXISTS ${MP_BASE_DIR}/solvers/${name})
# Add directory name to sources.
set(sources )
foreach (src ${source_names})
set(sources ${sources} ${name}/${src})
set(sources ${sources} ${MP_BASE_DIR}/solvers/${name}/${src})
endforeach ()
set(dir ${name}/)
set(dir ${MP_BASE_DIR}/solvers/${name}/)
else ()
set(sources ${source_names})
set(dir )
Expand All @@ -99,7 +101,7 @@ function(add_ampl_solver name)
set(static_lib ampl${name}-static)
add_library(${static_lib} STATIC ${sources})
target_include_directories(${static_lib}
PUBLIC ${include_dirs} ${PROJECT_SOURCE_DIR}/solvers)
PUBLIC ${include_dirs} ${MP_BASE_DIR}/solvers)
target_link_libraries(${static_lib} PUBLIC ${libraries})
target_compile_options(${static_lib} PUBLIC ${definitions})

Expand All @@ -111,7 +113,7 @@ function(add_ampl_solver name)

# Add a solver shared library.
set(shared_lib ampl${name})
add_library(${shared_lib} SHARED ${PROJECT_SOURCE_DIR}/src/solver-c.cc)
add_library(${shared_lib} SHARED ${MP_BASE_DIR}/src/solver-c.cc)
target_compile_definitions(${shared_lib} PRIVATE MP_SOLVER=${name})
target_link_libraries(${shared_lib} PRIVATE ${static_lib})

Expand All @@ -120,6 +122,8 @@ function(add_ampl_solver name)
target_link_libraries(${name} PRIVATE ${static_lib})

install(TARGETS ${name} DESTINATION bin)

add_to_folder(${name} ampl${name}-static ${shared_lib} ${name})
endfunction()

if (NOT MSVC)
Expand Down
6 changes: 4 additions & 2 deletions src/amplsig/CMakeLists.txt
@@ -1,5 +1,8 @@
# CMake build script for the amplsig library.

if(NOT build_asl)
message(STATUS "Not building ASL, skipping amplsig")
return()
endif()
if (NOT WIN32)
# amplsig is only needed on Windows due to broken implementation
# of signals on this platform.
Expand All @@ -14,6 +17,5 @@ find_library(WS2_32_LIBRARY Ws2_32
PATHS ${WIN_LIBRARY_DIR} NO_DEFAULT_PATH)
if (WS2_32_LIBRARY)
add_ampl_library(amplsig amplsig.cc)
message(WS2_32_LIBRARY ${WS2_32_LIBRARY})
target_link_libraries(amplsig mp ${WS2_32_LIBRARY})
endif ()
19 changes: 9 additions & 10 deletions src/asl/CMakeLists.txt
@@ -1,17 +1,19 @@
check_module(asl build_asl)
set(build_asl ${build_asl} PARENT_SCOPE)

if (NOT build_asl)
return ()
return()
endif ()

add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/asl
${CMAKE_CURRENT_BINARY_DIR}/asl)

# Check if an asl target is already available (in case mp is used as a submodule
# or we have an imported library). If not, build it.
if(NOT TARGET asl)
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/asl
${CMAKE_CURRENT_BINARY_DIR}/asl)
endif()

include(CheckSymbolExists)
include(CheckLibraryExists)



# Public ASL headers.
set(ASL_HEADERS aslbuilder.h aslexpr.h aslexpr-visitor.h
aslproblem.h aslinterface.h)
Expand All @@ -25,9 +27,6 @@ if (NOT HAVE_MKSTEMPS)
set(ASL_SOURCES ${ASL_SOURCES} mkstemps.c)
endif ()




add_mp_library(aslmp STATIC ${ASL_SOURCES} ${ASL_HEADERS}
LIBRARIES mp asl
INCLUDE_DIRECTORIES ${ASL1_INCLUDE_DIRS}
Expand Down
7 changes: 4 additions & 3 deletions src/cp/CMakeLists.txt
@@ -1,4 +1,5 @@
# CMake build script for the cp library.

add_ampl_library(cp cp.cc)
target_link_libraries(cp mp)
if(build_asl)
add_ampl_library(cp cp.cc)
target_link_libraries(cp mp)
endif()
5 changes: 2 additions & 3 deletions support/cmake/FindGUROBI.cmake
Expand Up @@ -4,16 +4,15 @@
# https://support.gurobi.com/hc/en-us/articles/360039499751-CMake-C-C-compilation-of-Gurobi-projects
# on March 11, 2020


find_path(GUROBI_INCLUDE_DIRS
NAMES gurobi_c.h
HINTS ${GUROBI_DIR} $ENV{GUROBI_HOME}
PATH_SUFFIXES include)

find_library(GUROBI_LIBRARY
NAMES gurobi gurobi81 gurobi90
NAMES gurobi gurobi81 gurobi90 gurobi91
HINTS ${GUROBI_DIR} $ENV{GUROBI_HOME}
PATH_SUFFIXES lib)
PATH_SUFFIXES lib lib/linux64 lib/osx64 lib/win64)

if(CXX)
if(MSVC)
Expand Down
19 changes: 12 additions & 7 deletions test/CMakeLists.txt
Expand Up @@ -21,6 +21,7 @@ add_prefix(GTEST_SRC ../thirdparty/gmock/ gmock-gtest-all.cc gmock.h)
set(GTEST_SRC ${GTEST_SRC}
gtest-extra.cc gtest-extra.h util.cc util.h test-main.cc)
add_library(gtest-extra STATIC ${GTEST_SRC})
add_to_folder(${MP_FOLDER_PREFIX}test gtest-extra)
target_compile_definitions(gtest-extra PUBLIC FMT_USE_FILE_DESCRIPTORS)
target_compile_options(gtest-extra PUBLIC ${MP_CXX11_FLAG})
find_package(Threads)
Expand Down Expand Up @@ -64,22 +65,26 @@ function(add_mp_test name)
target_compile_definitions(${name} PRIVATE
MP_TEST_DATA_DIR="${PROJECT_SOURCE_DIR}/test/data")
add_test(NAME ${name} COMMAND $<TARGET_FILE:${name}>)
add_to_folder(${MP_FOLDER_PREFIX}test ${name})
endfunction()
if(build_asl)
add_ampl_library(testlib PRIVATE testlib.cc)
add_library(function STATIC function.cc function.h)
add_to_folder(${MP_FOLDER_PREFIX}test function)
target_link_libraries(function asl)

add_ampl_library(testlib PRIVATE testlib.cc)
add_library(function STATIC function.cc function.h)
target_link_libraries(function asl)

add_mp_test(function-test function-test.cc LIBS function aslmp)
add_mp_test(cp-test cp-test.cc LIBS function aslmp)
add_dependencies(cp-test cp)
add_mp_test(function-test function-test.cc LIBS function aslmp)
add_mp_test(cp-test cp-test.cc LIBS function aslmp)
add_dependencies(cp-test cp)
endif()

add_subdirectory(asl)
add_subdirectory(solvers)

add_mp_test(util-test util-test.cc)

add_executable(test-helper test-helper.cc)
add_to_folder(${MP_FOLDER_PREFIX}test test-helper)
target_link_libraries(test-helper mp)
if (MINGW)
set_target_properties(test-helper PROPERTIES
Expand Down
22 changes: 12 additions & 10 deletions test/asl/CMakeLists.txt
@@ -1,12 +1,14 @@
add_mp_test(aslexpr-test aslexpr-test.cc no-unordered-map-test.cc)
target_link_libraries(aslexpr-test aslmp)
if(build_asl)
add_mp_test(aslexpr-test aslexpr-test.cc no-unordered-map-test.cc)
target_link_libraries(aslexpr-test aslmp)
add_mp_test(aslbuilder-test aslbuilder-test.cc LIBS aslmp)
add_mp_test(aslproblem-test aslproblem-test.cc stderr-redirect.h LIBS aslmp)

add_mp_test(aslbuilder-test aslbuilder-test.cc LIBS aslmp)
add_mp_test(aslproblem-test aslproblem-test.cc stderr-redirect.h LIBS aslmp)
add_library(ampltestsolver SHARED
testsolver.cc ${PROJECT_SOURCE_DIR}/src/solver-c.cc)
add_to_folder(mp/mp-testampltestsolver)
target_link_libraries(ampltestsolver aslmp)
target_compile_definitions(ampltestsolver PRIVATE MP_SOLVER=testsolver)

add_library(ampltestsolver SHARED
testsolver.cc ${PROJECT_SOURCE_DIR}/src/solver-c.cc)
target_link_libraries(ampltestsolver aslmp)
target_compile_definitions(ampltestsolver PRIVATE MP_SOLVER=testsolver)

add_mp_test(solver-c-test solver-c-test.cc LIBS ampltestsolver)
add_mp_test(solver-c-test solver-c-test.cc LIBS ampltestsolver)
endif()

0 comments on commit 75f1d92

Please sign in to comment.