Autotoolsのスクリプトを書くのが大変なので、CMakeを導入してみた。
とりあえず、boost::asioの練習ついでにhttpクライアントとTCPサーバーをCMakeでビルド。
単純にビルドするだけなら、
/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(AsioTest)
#Boostディレクトリの設定
IF(WIN32 AND NOT UNIX)
SET(BOOST_INCLUDEDIR C:/MinGW32/msys/1.0/local/include)
SET(BOOST_LIBRARYDIR C:/MinGW32/msys/1.0/local/lib)
ELSE(WIN32 AND NOT UNIX)
ENDIF(WIN32 AND NOT UNIX)
#boost::systemの捜索
FIND_PACKAGE(Boost COMPONENTS system REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
#サブディレクトリの設定
ADD_SUBDIRECTORY(httpClient)
ADD_SUBDIRECTORY(server)
/httpClient/CMakeLists.txt
ADD_EXECUTABLE(http src/main.cpp)
TARGET_LINK_LIBRARIES(http ${Boost_LIBRARIES})
IF(WIN32 AND NOT UNIX)
#Windowsの場合は、winsock2とmswsockが必要
find_library(WS2_32_LIBRARY ws2_32)
TARGET_LINK_LIBRARIES(http ${WS2_32_LIBRARY})
find_library(MSWSOCK_LIBRARY mswsock)
TARGET_LINK_LIBRARIES(http ${MSWSOCK_LIBRARY})
ELSE(WIN32 AND NOT UNIX)
#Linux系はpthreadが必要
find_library(PTHREAD_LIBRARY pthread)
TARGET_LINK_LIBRARIES(http ${PTHREAD_LIBRARY})
endif(WIN32 AND NOT UNIX)
/server/CMakeLists.txt
ADD_EXECUTABLE(server src/main.cpp src/server.cpp src/user.cpp)
TARGET_LINK_LIBRARIES(server ${Boost_LIBRARIES})
IF(WIN32 AND NOT UNIX)
#Windowsの場合は、winsock2とmswsockが必要
FIND_LIBRARY(WS2_32_LIBRARY ws2_32)
TARGET_LINK_LIBRARIES(server ${WS2_32_LIBRARY})
FIND_LIBRARY(MSWSOCK_LIBRARY mswsock)
TARGET_LINK_LIBRARIES(server ${MSWSOCK_LIBRARY})
ELSE(WIN32 AND NOT UNIX)
#Linux系はpthreadが必要
FIND_LIBRARY(PTHREAD_LIBRARY pthread)
TARGET_LINK_LIBRARIES(server ${PTHREAD_LIBRARY})
ENDIF(WIN32 AND NOT UNIX)
これだけ。
boost::asioを要求するため、FIND_PACKAGEでパッケージ探したり、boost::asioが要求するライブラリがOSごとに違っているけど、そこはIFで分岐してFIND_LIBRARYで探してやればOK。
cygwinだけ何かしたい場合は、「IF (CYGWIN)~ENDIF(CYGWIN)」でいいっぽい。
設定次第ではインストーラーも作れるみたい。
こっちはちょっとややこしいけど、WindowsならNSISが、Linux系ならDEBが作れるらしい。
ビルドするときに、/buildを作って、cd。cmake ..ってやると、オブジェクトファイルもリンク済みバイナリも/build以下にできるから、
SET(CPACK_SOURCE_IGNORE_FILES "/build/" "/.svn/" "/.deps/" "/.settings/" ".cproject" ".project")
でパック指定から外してやれば、make package-sourceでソースパッケージを作っても、余計なものが入らなくて便利。
公式のWin32バイナリは-Gで指定しないとVisual Studioのslnを出力しようとするから、MSYSでビルドしたければ、-G”MSYS Makefiles”がいるのに注意。
CMakeLists.txtを書くのなら、vimかEclipse + CMakeEdが便利。