diff --git a/CMakeLists.txt b/CMakeLists.txt index f38613e..bc42082 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ if(UNIX) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR}) endforeach() else() - # Currently Only support static build for windows + # Default to static build for non-unix option(BUILD_SHARED_LIBS "Build shared libraries (.dll)." OFF) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) @@ -70,3 +70,66 @@ include(c) option(BUILD_EXAMPLES "Build examples" ON) message(STATUS "Build examples: ${BUILD_EXAMPLES}") add_subdirectory(examples) + +option(ODBC "enable MathProg ODBC support" OFF) +message(STATUS "enable MathProg ODBC support: ${ODBC}") +if(ODBC) + find_package(ODBC) + if(ODBC_FOUND) + if(ODBC_CONFIG) + execute_process(COMMAND "${ODBC_CONFIG} --cflags" + RESULT_VARIABLE ODBC_RESULT + OUTPUT_VARIABLE ODBC_OUTPUT + ERROR_VARIABLE ODBC_ERROR) + if(ODBC_OUTPUT AND (NOT ODBC_ERROR)) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ODBC_OUTPUT}") + elseif(ODBC_ERROR) + message(FATAL_ERROR "'${ODBC_CONFIG} --cflags' returned ${ODBC_RESULT}: ${ODBC_ERROR}") + else() + message(FATAL_ERROR "'${ODBC_CONFIG} --cflags' produced no output") + endif() + else() + message(FATAL_ERROR "Could not run 'odbc-config --cflags' or 'iodbc-config --cflags'") + endif() + string(REGEX MATCH "/[^/\\]+$/gm" ODBC_LIB_NAME "${ODBC_LIBRARIES}") # regexr.com/698ls strips the preceding path from the actual lib name + if (ODBC_LIB_NAME) + target_compile_definitions(GLPK PUBLIC ODBC_DLNAME=${ODBC_LIB_NAME}) + target_link_libraries(GLPK PRIVATE ODBC::ODBC) + else() + message(FATAL_ERROR "Could not determine ODBC/iODBC library name") + endif() + else() + message(FATAL_ERROR "ODBC/iODBC library not found") + endif() +endif() + +include(CMakeDependentOption) +cmake_dependent_option(MYSQL "enable MathProg MySQL support" OFF "BUILD_SHARED_LIBS" OFF) +message(STATUS "enable MathProg MySQL support: ${MYSQL}") +if(MYSQL) + find_package(MySQL) + if(MYSQL_FOUND) + target_link_libraries(GLPK GMP_LIBRARIES) + target_include_directories(GLPK MYSQL_INCLUDE_DIRS) + else() + message(FATAL_ERROR "MySQL not found") + endif() +endif() + +option(IS_REENTRANT "enable reentrancy support" ON) +message(STATUS "enable reentrancy support: ${IS_REENTRANT}") +if(IS_REENTRANT) + if ( + (CMAKE_C_COMPILER_ID MATCHES "Clang") OR # matches AppleClang and Clang + (CMAKE_C_COMPILER_ID STREQUAL "GNU") OR + (CMAKE_C_COMPILER_ID STREQUAL "Intel") + ) + set(TLS "__thread") + elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC") + set(TLS "__declspec(thread)") + else() + message(WARNING "compiler-specific spec for thread local storage not found; if your build breaks, set 'IS_REENTRANT' option to 'OFF'") + set(TLS "_Thread_local") # default to C11 standard, may break some builds if thread local storage isn't supported + endif() + target_compile_definitions(GLPK PUBLIC TLS=${TLS}) +endif() \ No newline at end of file diff --git a/cmake/FindGMP.cmake b/cmake/FindGMP.cmake new file mode 100644 index 0000000..a5ead13 --- /dev/null +++ b/cmake/FindGMP.cmake @@ -0,0 +1,180 @@ +#### LICENSE #### +# This file is copied from the Dune project (http://dune-project.org/), specifically the dune-project/dune-common git +# repo (https://github.com/dune-project/dune-common), and is thus licensed under a modified GPLv2 license. A copy of +# that license can be found in this directory as `dune-common-gplv2.md`. +# +# The original file can be found at https://github.com/dune-project/dune-common/blob/v2.8.0/cmake/modules/FindGMP.cmake +# +# Copyright holders: +# ================== +# +# 2015--2017 Marco Agnese +# 2015 Martin Alkämper +# 2003--2019 Peter Bastian +# 2004--2020 Markus Blatt +# 2013 Andreas Buhr +# 2020--2021 Samuel Burbulla +# 2011--2020 Ansgar Burchardt +# 2004--2005 Adrian Burri +# 2014 Benjamin Bykowski (may appear in the logs as "Convex Function") +# 2014 Marco Cecchetti +# 2018 Matthew Collins +# 2006--2021 Andreas Dedner +# 2019--2021 Nils-Arne Dreier +# 2003 Marc Droske +# 2003--2021 Christian Engwer +# 2004--2020 Jorrit Fahlke +# 2016 Thomas Fetzer +# 2008--2017 Bernd Flemisch +# 2013--2014 Christoph Gersbacher +# 2017--2020 Janick Gerstenberger +# 2015 Stefan Girke +# 2005--2021 Carsten Gräser +# 2015--2017 Felix Gruber +# 2010--2021 Christoph Grüninger +# 2006 Bernhard Haasdonk +# 2015--2018 Claus-Justus Heine +# 2015--2020 René Heß +# 2017--2019 Stephan Hilb +# 2017--2021 Lasse Hinrichsen +# 2012--2013 Olaf Ippisch +# 2020 Patrick Jaap +# 2020 Liam Keegan +# 2013--2021 Dominic Kempf +# 2009 Leonard Kern +# 2017--2018 Daniel Kienle +# 2013 Torbjörn Klatt +# 2003--2021 Robert Klöfkorn +# 2017--2021 Timo Koch +# 2005--2007 Sreejith Pulloor Kuttanikkad +# 2012--2016 Arne Morten Kvarving +# 2010--2014 Andreas Lauser +# 2016--2019 Tobias Leibner +# 2015 Lars Lubkoll +# 2012--2017 Tobias Malkmus +# 2007--2011 Sven Marnach +# 2010--2017 Rene Milk +# 2019--2020 Felix Müller +# 2011--2019 Steffen Müthing +# 2018 Lisa Julia Nebel +# 2003--2006 Thimo Neubauer +# 2011 Rebecca Neumann +# 2008--2018 Martin Nolte +# 2014 Andreas Nüßing +# 2004--2005 Mario Ohlberger +# 2019--2020 Santiago Ospina De Los Rios +# 2014 Steffen Persvold +# 2008--2017 Elias Pipping +# 2021 Joscha Podlesny +# 2011 Dan Popovic +# 2017--2021 Simon Praetorius +# 2009 Atgeirr Rasmussen +# 2017--2020 Lukas Renelt +# 2006--2014 Uli Sack +# 2003--2020 Oliver Sander +# 2006 Klaus Schneider +# 2004 Roland Schulz +# 2015 Nicolas Schwenck +# 2016 Linus Seelinger +# 2009--2014 Bård Skaflestad +# 2019 Henrik Stolzmann +# 2012 Matthias Wohlmuth +# 2011--2016 Jonathan Youett + +#[=======================================================================[.rst: +FindGMP +------- + +Find the GNU MULTI-Precision Bignum (GMP) library +and the corresponding C++ bindings GMPxx. + +This module searches for both libraries and only considers the package +found if both can be located. It then defines separate targets for the C +and the C++ library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``GMP::gmp`` + Library target of the C library. +``GMP::gmpxx`` + Library target of the C++ library, which also links to the C library. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``GMP_FOUND`` + True if the GMP library, the GMPxx headers and + the GMPxx library were found. + +Cache Variables +^^^^^^^^^^^^^^^ + +You may set the following variables to modify the behaviour of +this module: + +``GMP_INCLUDE_DIR`` + The directory containing ``gmp.h``. +``GMP_LIB`` + The path to the gmp library. +``GMPXX_INCLUDE_DIR`` + The directory containing ``gmpxx.h``. +``GMPXX_LIB`` + The path to the gmpxx library. + +#]=======================================================================] + +# Add a feature summary for this package +include(FeatureSummary) +set_package_properties(GMP PROPERTIES + DESCRIPTION "GNU multi-precision library" + URL "https://gmplib.org" + ) + +# Try finding the package with pkg-config +find_package(PkgConfig QUIET) +pkg_check_modules(PKG QUIET gmp gmpxx) + +# Try to locate the libraries and their headers, using pkg-config hints +find_path(GMP_INCLUDE_DIR gmp.h HINTS ${PKG_gmp_INCLUDEDIR}) +find_library(GMP_LIB gmp HINTS ${PKG_gmp_LIBDIR}) + +find_path(GMPXX_INCLUDE_DIR gmpxx.h HINTS ${PKG_gmpxx_INCLUDEDIR}) +find_library(GMPXX_LIB gmpxx HINTS ${PKG_gmpxx_LIBDIR}) + +# Remove these variables from cache inspector +mark_as_advanced(GMP_INCLUDE_DIR GMP_LIB GMPXX_INCLUDE_DIR GMPXX_LIB) + +# Report if package was found +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GMP + DEFAULT_MSG + GMPXX_LIB GMPXX_INCLUDE_DIR GMP_INCLUDE_DIR GMP_LIB + ) + +# Set targets +if(GMP_FOUND) + # C library + if(NOT TARGET GMP::gmp) + add_library(GMP::gmp UNKNOWN IMPORTED) + set_target_properties(GMP::gmp PROPERTIES + IMPORTED_LOCATION ${GMP_LIB} + INTERFACE_INCLUDE_DIRECTORIES ${GMP_INCLUDE_DIR} + ) + endif() + + # C++ library, which requires a link to the C library + if(NOT TARGET GMP::gmpxx) + add_library(GMP::gmpxx UNKNOWN IMPORTED) + set_target_properties(GMP::gmpxx PROPERTIES + IMPORTED_LOCATION ${GMPXX_LIB} + INTERFACE_INCLUDE_DIRECTORIES ${GMPXX_INCLUDE_DIR} + INTERFACE_LINK_LIBRARIES GMP::gmp + ) + endif() + +endif() \ No newline at end of file diff --git a/cmake/FindMySQL.cmake b/cmake/FindMySQL.cmake new file mode 100644 index 0000000..0d5df4b --- /dev/null +++ b/cmake/FindMySQL.cmake @@ -0,0 +1,75 @@ +# https://gist.github.com/RenatoUtsch/1623340 +# - Try to find MySQL. +# Once done this will define: +# MYSQL_FOUND - If false, do not try to use MySQL. +# MYSQL_INCLUDE_DIRS - Where to find mysql.h, etc. +# MYSQL_LIBRARIES - The libraries to link against. +# MYSQL_VERSION_STRING - Version in a string of MySQL. +# +# Created by RenatoUtsch based on eAthena implementation. +# +# Please note that this module only supports Windows and Linux officially, but +# should work on all UNIX-like operational systems too. +# +#============================================================================= +# Copyright 2012 RenatoUtsch +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) +if( WIN32 ) + find_path( MYSQL_INCLUDE_DIR + NAMES "mysql.h" + PATHS "$ENV{PROGRAMFILES}/MySQL/*/include" + "$ENV{PROGRAMFILES\(x86\)}/MySQL/*/include" + "$ENV{SYSTEMDRIVE}/MySQL/*/include" ) + + find_library( MYSQL_LIBRARY + NAMES "mysqlclient" "mysqlclient_r" + PATHS "$ENV{PROGRAMFILES}/MySQL/*/lib" + "$ENV{PROGRAMFILES\(x86\)}/MySQL/*/lib" + "$ENV{SYSTEMDRIVE}/MySQL/*/lib" ) +else() + find_path( MYSQL_INCLUDE_DIR + NAMES "mysql.h" + PATHS "/usr/include/mysql" + "/usr/local/include/mysql" + "/usr/mysql/include/mysql" ) + + find_library( MYSQL_LIBRARY + NAMES "mysqlclient" "mysqlclient_r" + PATHS "/lib/mysql" + "/lib64/mysql" + "/usr/lib/mysql" + "/usr/lib64/mysql" + "/usr/local/lib/mysql" + "/usr/local/lib64/mysql" + "/usr/mysql/lib/mysql" + "/usr/mysql/lib64/mysql" ) +endif() + +if( MYSQL_INCLUDE_DIR AND EXISTS "${MYSQL_INCLUDE_DIRS}/mysql_version.h" ) + file( STRINGS "${MYSQL_INCLUDE_DIRS}/mysql_version.h" + MYSQL_VERSION_H REGEX "^#define[ \t]+MYSQL_SERVER_VERSION[ \t]+\"[^\"]+\".*$" ) + string( REGEX REPLACE + "^.*MYSQL_SERVER_VERSION[ \t]+\"([^\"]+)\".*$" "\\1" MYSQL_VERSION_STRING + "${MYSQL_VERSION_H}" ) +endif() + +# handle the QUIETLY and REQUIRED arguments and set MYSQL_FOUND to TRUE if +# all listed variables are TRUE +include( FindPackageHandleStandardArgs ) +find_package_handle_standard_args( MYSQL DEFAULT_MSG + REQUIRED_VARS MYSQL_LIBRARY MYSQL_INCLUDE_DIR + VERSION_VAR MYSQL_VERSION_STRING ) + +set( MYSQL_INCLUDE_DIRS ${MYSQL_INCLUDE_DIR} ) +set( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) + +mark_as_advanced( MYSQL_INCLUDE_DIR MYSQL_LIBRARY ) diff --git a/cmake/c.cmake b/cmake/c.cmake index 47d1d1e..51e2057 100644 --- a/cmake/c.cmake +++ b/cmake/c.cmake @@ -83,7 +83,8 @@ function(add_c_example FILE_NAME) target_include_directories(${EXAMPLE_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_features(${EXAMPLE_NAME} PRIVATE c_std_11) target_link_libraries(${EXAMPLE_NAME} PRIVATE - ${PROJECT_NAMESPACE}::GLPK) + ${PROJECT_NAMESPACE}::GLPK + $<$>:m>) include(GNUInstallDirs) install(TARGETS ${EXAMPLE_NAME}) diff --git a/cmake/dune-common-gplv2.md b/cmake/dune-common-gplv2.md new file mode 100644 index 0000000..6d1a984 --- /dev/null +++ b/cmake/dune-common-gplv2.md @@ -0,0 +1,443 @@ +Copyright holders: +================== + +2015--2017 Marco Agnese +2015 Martin Alkämper +2003--2019 Peter Bastian +2004--2020 Markus Blatt +2013 Andreas Buhr +2020--2021 Samuel Burbulla +2011--2020 Ansgar Burchardt +2004--2005 Adrian Burri +2014 Benjamin Bykowski (may appear in the logs as "Convex Function") +2014 Marco Cecchetti +2018 Matthew Collins +2006--2021 Andreas Dedner +2019--2021 Nils-Arne Dreier +2003 Marc Droske +2003--2021 Christian Engwer +2004--2020 Jorrit Fahlke +2016 Thomas Fetzer +2008--2017 Bernd Flemisch +2013--2014 Christoph Gersbacher +2017--2020 Janick Gerstenberger +2015 Stefan Girke +2005--2021 Carsten Gräser +2015--2017 Felix Gruber +2010--2021 Christoph Grüninger +2006 Bernhard Haasdonk +2015--2018 Claus-Justus Heine +2015--2020 René Heß +2017--2019 Stephan Hilb +2017--2021 Lasse Hinrichsen +2012--2013 Olaf Ippisch +2020 Patrick Jaap +2020 Liam Keegan +2013--2021 Dominic Kempf +2009 Leonard Kern +2017--2018 Daniel Kienle +2013 Torbjörn Klatt +2003--2021 Robert Klöfkorn +2017--2021 Timo Koch +2005--2007 Sreejith Pulloor Kuttanikkad +2012--2016 Arne Morten Kvarving +2010--2014 Andreas Lauser +2016--2019 Tobias Leibner +2015 Lars Lubkoll +2012--2017 Tobias Malkmus +2007--2011 Sven Marnach +2010--2017 Rene Milk +2019--2020 Felix Müller +2011--2019 Steffen Müthing +2018 Lisa Julia Nebel +2003--2006 Thimo Neubauer +2011 Rebecca Neumann +2008--2018 Martin Nolte +2014 Andreas Nüßing +2004--2005 Mario Ohlberger +2019--2020 Santiago Ospina De Los Rios +2014 Steffen Persvold +2008--2017 Elias Pipping +2021 Joscha Podlesny +2011 Dan Popovic +2017--2021 Simon Praetorius +2009 Atgeirr Rasmussen +2017--2020 Lukas Renelt +2006--2014 Uli Sack +2003--2020 Oliver Sander +2006 Klaus Schneider +2004 Roland Schulz +2015 Nicolas Schwenck +2016 Linus Seelinger +2009--2014 Bård Skaflestad +2019 Henrik Stolzmann +2012 Matthias Wohlmuth +2011--2016 Jonathan Youett + +This Licence does not cover the header files taken from the +[pybind11 project][pybind11] which are included here +(`dune/python/pybind11`) together with their own [licence file][pybind11Licence]. + +The DUNE library and headers are licensed under version 2 of the GNU +General Public License (see below), with a special exception for +linking and compiling against DUNE, the so-called "runtime exception." +The license is intended to be similar to the GNU Lesser General +Public License, which by itself isn't suitable for a template library. + +The exact wording of the exception reads as follows: + +As a special exception, you may use the DUNE source files as part +of a software library or application without restriction. +Specifically, if other files instantiate templates or use macros or +inline functions from one or more of the DUNE source files, or you +compile one or more of the DUNE source files and link them with +other files to produce an executable, this does not by itself cause +the resulting executable to be covered by the GNU General Public +License. This exception does not however invalidate any other +reasons why the executable file might be covered by the GNU General +Public License. + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + +5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + +7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation; we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +[pybind11]: https://github.com/pybind/pybind11 +[pybind11Licence]: https://github.com/pybind/pybind11/blob/master/LICENSE \ No newline at end of file diff --git a/cmake/examples.cmake b/cmake/examples.cmake new file mode 100644 index 0000000..3d36334 --- /dev/null +++ b/cmake/examples.cmake @@ -0,0 +1,66 @@ +function(add_example_folder EXAMPLE_SRC_DIRECTORY) + #get example dir relative to source root + string(REPLACE ${CMAKE_SOURCE_DIR} "" EXAMPLE_RELATIVE_DIR ${EXAMPLE_SRC_DIRECTORY}) + #remove any leading slash + string(REGEX REPLACE "^[/|\\]+" "" EXAMPLE_RELATIVE_DIR ${EXAMPLE_RELATIVE_DIR}) + + # change runtime output dir for examples + # multi-cfg builds + foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES) + string(TOUPPER ${OutputConfig} OUTPUTCONFIG) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${EXAMPLE_RELATIVE_DIR}) + endforeach() + # single-cfg builds + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${EXAMPLE_RELATIVE_DIR}) + + # compile example executables + file(GLOB C_SRCS "*.c" LIST_DIRECTORIES false) + list(FILTER C_SRCS EXCLUDE REGEX ".*/glpsol.c") # project non-example executable target + list(FILTER C_SRCS EXCLUDE REGEX ".*/netgen.c") # no license + foreach(FILE_NAME IN LISTS C_SRCS) + if(NOT (IS_DIRECTORY ${FILE_NAME})) # `LIST_DIRECTORIES false` not reliable + add_c_test(${FILE_NAME}) + endif() + endforeach() + configure_example_data(${EXAMPLE_SRC_DIRECTORY}) +endfunction() + +function(configure_example_data EXAMPLE_SRC_DIRECTORY) + #get example dir relative to source root + string(REPLACE ${CMAKE_SOURCE_DIR} "" EXAMPLE_RELATIVE_DIR ${EXAMPLE_SRC_DIRECTORY}) + #remove any leading slash + string(REGEX REPLACE "^[/|\\]+" "" EXAMPLE_RELATIVE_DIR ${EXAMPLE_RELATIVE_DIR}) + # copy example data to build output folder + # using `configure_file` creates a data dependence + # i.e. changes in the example data will reflect in the output folder + file(GLOB EXAMPLE_DATA_FILES "*" LIST_DIRECTORIES false) + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*\\.[c|h]") # remove *.c and *.h files + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*\\.am") # remove automake files + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*\\.bat") # remove batch files + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*/CMakeLists\\.txt") # remove CMakeLists.txt + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*/Makefile") # remove Makefiles + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*/Makefile.in") # remove Makefile templates + list(FILTER EXAMPLE_DATA_FILES EXCLUDE REGEX ".*/build\\.sh") # remove build scripts + foreach(EXAMPLE_DATA_FILE IN LISTS EXAMPLE_DATA_FILES) + get_filename_component(EXAMPLE_DATA_NAME ${EXAMPLE_DATA_FILE} NAME) + if(NOT (IS_DIRECTORY ${EXAMPLE_DATA_FILE})) # `LIST_DIRECTORIES false` not reliable + configure_file( + ${EXAMPLE_DATA_FILE} + ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${EXAMPLE_RELATIVE_DIR}/${EXAMPLE_DATA_NAME} + COPYONLY + ) + endif() + endforeach() +endfunction() + +# https://stackoverflow.com/questions/7787823/cmake-how-to-get-the-name-of-all-subdirectories-of-a-directory +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6ef6844..f1a03ee 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -15,13 +15,32 @@ add_executable(${PROJECT_NAMESPACE}::glpsol ALIAS glpsol) install(TARGETS glpsol EXPORT ${PROJECT_NAME}Targets) +add_subdirectory(tsp) + +# GPSOL tests +add_test( + NAME + glpsol_version + COMMAND + glpsol --version +) +add_test( + NAME + glpsol_solve + COMMAND + glpsol --mps ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/examples/murtagh.mps --max +) + if(NOT BUILD_EXAMPLES) return() endif() -file(GLOB C_SRCS "*.c") -list(FILTER C_SRCS EXCLUDE REGEX ".*/glpsol.c") # need input file -list(FILTER C_SRCS EXCLUDE REGEX ".*/netgen.c") # no license -foreach(FILE_NAME IN LISTS C_SRCS) - add_c_example(${FILE_NAME}) -endforeach() +include(examples) +add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) + +# get example subdirectories and add them +SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}) +list(REMOVE_ITEM SUBDIRS "tsp") # already added +foreach(SUBDIR IN LISTS SUBDIRS) + add_subdirectory(${SUBDIR}) +endforeach() \ No newline at end of file diff --git a/examples/cplex/CMakeLists.txt b/examples/cplex/CMakeLists.txt new file mode 100644 index 0000000..2491c64 --- /dev/null +++ b/examples/cplex/CMakeLists.txt @@ -0,0 +1,6 @@ +# This example folder requires external dependencies to build (see README) +return() + +#include(examples) +# +#add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/csv/CMakeLists.txt b/examples/csv/CMakeLists.txt new file mode 100644 index 0000000..1782437 --- /dev/null +++ b/examples/csv/CMakeLists.txt @@ -0,0 +1,3 @@ +include(examples) + +add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/dbf/CMakeLists.txt b/examples/dbf/CMakeLists.txt new file mode 100644 index 0000000..1782437 --- /dev/null +++ b/examples/dbf/CMakeLists.txt @@ -0,0 +1,3 @@ +include(examples) + +add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/oldapi/CMakeLists.txt b/examples/oldapi/CMakeLists.txt new file mode 100644 index 0000000..ac3514f --- /dev/null +++ b/examples/oldapi/CMakeLists.txt @@ -0,0 +1,6 @@ +#The examples in this directory do not compile due to a code error at examples/oldapi/lpx.c:1502 +return() + +#include(examples) +# +#add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/pbn/CMakeLists.txt b/examples/pbn/CMakeLists.txt new file mode 100644 index 0000000..1782437 --- /dev/null +++ b/examples/pbn/CMakeLists.txt @@ -0,0 +1,3 @@ +include(examples) + +add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/sql/CMakeLists.txt b/examples/sql/CMakeLists.txt new file mode 100644 index 0000000..1782437 --- /dev/null +++ b/examples/sql/CMakeLists.txt @@ -0,0 +1,3 @@ +include(examples) + +add_example_folder(${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/examples/threads/CMakeLists.txt b/examples/threads/CMakeLists.txt new file mode 100644 index 0000000..5684f6e --- /dev/null +++ b/examples/threads/CMakeLists.txt @@ -0,0 +1,26 @@ +if(APPLE) + set(CMAKE_INSTALL_RPATH + "@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path") +elseif(UNIX) + set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:$ORIGIN") +endif() + +add_executable(multiseed multiseed.c) +target_compile_features(multiseed PRIVATE c_std_11) +if (UNIX) + find_package(Threads REQUIRED) +endif() +target_link_libraries(multiseed PRIVATE + ${PROJECT_NAMESPACE}::GLPK + $<$>:m> + $<$>:Threads::Threads> +) + +install(TARGETS multiseed) + +add_test( + NAME + c_examples_multiseed + COMMAND + multiseed clustering.mod 20 +) \ No newline at end of file diff --git a/examples/threads/multiseed.c b/examples/threads/multiseed.c index eb5d215..e9cf60d 100644 --- a/examples/threads/multiseed.c +++ b/examples/threads/multiseed.c @@ -32,7 +32,7 @@ */ #include -#include +//#include //deprecated, use stdlib.h #include #include #include diff --git a/examples/tsp/CMakeLists.txt b/examples/tsp/CMakeLists.txt new file mode 100644 index 0000000..1c0e56b --- /dev/null +++ b/examples/tsp/CMakeLists.txt @@ -0,0 +1,36 @@ +include(examples) + +add_library(tsplib tsplib.c misc.c mincut.c maxflow.c) +target_include_directories(tsplib PUBLIC $) +target_compile_features(tsplib PRIVATE c_std_11) +target_link_libraries(tsplib PRIVATE + ${PROJECT_NAMESPACE}::GLPK +# misc + $<$>:m>) +add_library(${PROJECT_NAMESPACE}::tsplib ALIAS tsplib) +install(TARGETS tsplib + EXPORT ${PROJECT_NAME}Targets) + +set_target_properties(tsplib PROPERTIES PREFIX "") + +add_executable(tspsol main.c mincut.c maxflow.c) +target_include_directories(tspsol PUBLIC $) +target_compile_features(tspsol PRIVATE c_std_11) +target_link_libraries(tspsol PRIVATE + ${PROJECT_NAMESPACE}::GLPK + ${PROJECT_NAMESPACE}::tsplib + $<$>:m>) + +include(GNUInstallDirs) +install(TARGETS tspsol + EXPORT ${PROJECT_NAME}Targets) + +configure_example_data(${CMAKE_CURRENT_SOURCE_DIR}) + +if(BUILD_TESTING) + #get current dir relative to source root + string(REPLACE ${CMAKE_SOURCE_DIR} "" RELATIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + #remove any leading slash + string(REGEX REPLACE "^[/|\\]+" "" RELATIVE_DIR ${RELATIVE_DIR}) + add_test(NAME tspsol_solve COMMAND tspsol "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${RELATIVE_DIR}/sample.tsp") +endif() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 33dc226..e54948b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -42,6 +42,34 @@ target_link_libraries(GLPK $<$>:m>) add_library(${PROJECT_NAMESPACE}::GLPK ALIAS GLPK) +# check system libs functions and headers + +# define if windows environment +if(MSVC) + target_compile_definitions(GLPK PUBLIC __WOE__=1) +else() + # sys/time.h + include(CheckIncludeFile) + check_include_file(sys/time.h HAS_TIME_H) + if(HAS_TIME_H) + target_compile_definitions(GLPK PUBLIC HAVE_SYS_TIME_H=1) + include(CheckSymbolExists) + check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY_FUNC) + if(HAVE_GETTIMEOFDAY_FUNC) + target_compile_definitions(GLPK PUBLIC HAVE_GETTIMEOFDAY=1) + endif() + endif() +endif() + +# libgmp/gmp.h +find_package(GMP) +if(GMP_FOUND) + target_link_libraries(GLPK PRIVATE GMP::gmp) + target_compile_definitions(GLPK PUBLIC HAVE_GMP=1) +else() + message(AUTHOR_WARNING "gmp.h/libgmp not found") +endif() + #add_subdirectory(tests) # Install diff --git a/src/amd/CMakeLists.txt b/src/amd/CMakeLists.txt index e231731..ae71474 100644 --- a/src/amd/CMakeLists.txt +++ b/src/amd/CMakeLists.txt @@ -14,4 +14,4 @@ target_sources(GLPK amd_post_tree.c amd_preprocess.c amd_valid.c -) +) \ No newline at end of file diff --git a/src/api/CMakeLists.txt b/src/api/CMakeLists.txt index c19d4a9..5e2f7ed 100644 --- a/src/api/CMakeLists.txt +++ b/src/api/CMakeLists.txt @@ -55,4 +55,4 @@ target_sources(GLPK wrmip.c wrprob.c wrsol.c -) +) \ No newline at end of file diff --git a/src/bflib/CMakeLists.txt b/src/bflib/CMakeLists.txt index 47a77e7..0fc3c3b 100644 --- a/src/bflib/CMakeLists.txt +++ b/src/bflib/CMakeLists.txt @@ -22,4 +22,4 @@ target_sources(GLPK sgf.h sva.c sva.h -) +) \ No newline at end of file diff --git a/src/colamd/CMakeLists.txt b/src/colamd/CMakeLists.txt index 76e4cc4..a8899d8 100644 --- a/src/colamd/CMakeLists.txt +++ b/src/colamd/CMakeLists.txt @@ -2,4 +2,4 @@ target_sources(GLPK PRIVATE colamd.c colamd.h -) +) \ No newline at end of file diff --git a/src/draft/CMakeLists.txt b/src/draft/CMakeLists.txt index 669f4f4..ad49331 100644 --- a/src/draft/CMakeLists.txt +++ b/src/draft/CMakeLists.txt @@ -30,4 +30,4 @@ target_sources(GLPK ios.h lux.c lux.h -) +) \ No newline at end of file diff --git a/src/intopt/CMakeLists.txt b/src/intopt/CMakeLists.txt index 83fb2db..b973325 100644 --- a/src/intopt/CMakeLists.txt +++ b/src/intopt/CMakeLists.txt @@ -12,4 +12,4 @@ target_sources(GLPK mirgen.c spv.c spv.h -) +) \ No newline at end of file diff --git a/src/minisat/CMakeLists.txt b/src/minisat/CMakeLists.txt index 9465504..c87d3d7 100644 --- a/src/minisat/CMakeLists.txt +++ b/src/minisat/CMakeLists.txt @@ -2,4 +2,4 @@ target_sources(GLPK PRIVATE minisat.c minisat.h -) +) \ No newline at end of file diff --git a/src/misc/CMakeLists.txt b/src/misc/CMakeLists.txt index a10333f..a3d2c35 100644 --- a/src/misc/CMakeLists.txt +++ b/src/misc/CMakeLists.txt @@ -56,4 +56,4 @@ target_sources(GLPK wclique1.h wclique.c wclique.h -) +) \ No newline at end of file diff --git a/src/mpl/CMakeLists.txt b/src/mpl/CMakeLists.txt index e42f0db..c434463 100644 --- a/src/mpl/CMakeLists.txt +++ b/src/mpl/CMakeLists.txt @@ -9,4 +9,4 @@ target_sources(GLPK mpl.h mplsql.c mplsql.h -) +) \ No newline at end of file diff --git a/src/proxy/CMakeLists.txt b/src/proxy/CMakeLists.txt index 6331909..838d3c0 100644 --- a/src/proxy/CMakeLists.txt +++ b/src/proxy/CMakeLists.txt @@ -4,4 +4,4 @@ target_sources(GLPK proxy1.c proxy.c proxy.h -) +) \ No newline at end of file