
КонстрПЗ_ПI_ЛР2014_ч2
.pdf11
–, make-*
(COMPILER_FILE_SET, LIQKER_FILE_SET, BUILD_PATH, PRODUCT_QAME);
–, , -
0;
? * K .
< , * build.cmd
:
@echo off
setlocal enabledelayedexpansion
call :check_environment
rem Project configuration set SRC_PATH=./src
set BUILD_PATH=./build set CONFIG_PATH=./config set PRODUCT_NAME=myAPI set ARGS_FILE=args.mak
rem LIB W-/ 3.G2G**+6 /1.QTG*и6, X 1/-/./0 n.+*и-,6 3Q-] 1 1+-+5/PQ, X 1/-/./2 5и*1G. \QSG- и,1+-]
rem \и\5и/-G1и S56 .+Y.GbG*и6 ,X6YRX+*и6 set LIB="%CPP_BUILDER_HOME%/static_data"
set PATH=%PATH%;%CPP_BUILDER_HOME%/dynamic_data
rem Z/SSG.TиX+G2RG +.PQ2G*-R Y+3Q,1+. set DLL_DEBUG_ARG=dll_debug
set DLL_RELEASE_ARG=dll_release set HELP_ARG=help
set DEFAULT_ARG=%DLL_DEBUG_ARG%
rem Z./XG.6G2, \R5/ 5и Y+S+* +.PQ2G*- 3.и Y+3Q,1G. h,5и *G-, \QSG2 XR3/5*6-] DEFAULT_ARG.
set CURRENT_ARG=%1
if "" == "%CURRENT_ARG%" (
set CURRENT_ARG=!DEFAULT_ARG!
)
rem g\.+\/-1+ +.PQ2G*-/X Y+3Q,1+.
if %DLL_DEBUG_ARG% equ %CURRENT_ARG% ( call :clean
call :build_makefile_args call :build_dll_debug
12
) else if "%DLL_RELEASE_ARG%" equ "%CURRENT_ARG%" ( call :clean
call :build_makefile_args call :build_dll_release
) else if "%HELP_ARG%" equ "%CURRENT_ARG%" ( call :usage
) else (
echo Argument %CURRENT_ARG% is not supported. call :usage
)
exit
rem -------------------------------------------------------
:check_environment
if "" == "%CPP_BUILDER_HOME%" (
echo CPP_BUILDER_HOME not defined. Exiting...
exit
)
exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:clean
rmdir /Q /S "%BUILD_PATH%" 2>nul mkdir "%BUILD_PATH%"
exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:build_makefile_args
call :clean_makefile_args call :build_compiler_args call :build_linker_args
exit /b %ERRORLEVEL% rem ------------------------------------
-------------------
rem -------------------------------------------------------
:clean_makefile_args
del "%CONFIG_PATH%\%ARGS_FILE%" 2>nul exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:build_compiler_args
for /R "%SRC_PATH%" %%i in ("*.cpp") do ( set CURRENT_ARG=%%~dpi
13
rem vG*6G2 .+,bи.G*иG *+ obj. set TEMP=%%~nxi
set TEMP=!TEMP:cpp=obj!
set CURRENT_ARG=!CURRENT_ARG!!TEMP!
rem w/YS+G2 X %CONFIG_PATH% N+05 , и2G*G2 %ARGS_FILE% , rem ,/SG.Tи2R2 XиS+:
rem COMPILER_FILE_SET=./first_dir/first.cpp\
rem |
./first_dir/second_dir/second.cpp\ |
rem |
etc |
if not exist %CONFIG_PATH%/%ARGS_FILE% ( echo
COMPILER_FILE_SET="!CURRENT_ARG!"\>"%CONFIG_PATH%/%ARGS_FILE%
"
) else if "" equ "!LAST_COMPILER_ARG!" ( set LAST_COMPILER_ARG=!CURRENT_ARG!
) else ( echo
"!CURRENT_ARG!"\>>"%CONFIG_PATH%/%ARGS_FILE%"
)
)
if "" neq "%LAST_COMPILER_ARG%" ( echo
"%LAST_COMPILER_ARG%">>"%CONFIG_PATH%/%ARGS_FILE%"
)
exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:build_linker_args
for /R "%SRC_PATH%" %%i in ("*.cpp") do ( rem vG*6G2 .+,bи.G*иG *+ obj.
set TEMP=%%~nxi
set TEMP=!TEMP:cpp=obj!
set CURRENT_ARG=%BUILD_PATH%/!TEMP!
rem a/3и,RX+G2 X %ARGS_FILE% +.PQ2G*-R 5и1G.+. if "" equ "!LINKER_FILE_SET_FLAG!" (
set LINKER_FILE_SET_FLAG=TRUE echo
LINKER_FILE_SET="!CURRENT_ARG!"\>>"%CONFIG_PATH%/%ARGS_FILE%" ) else if "" equ "!LAST_LINKER_ARG!" (
set LAST_LINKER_ARG=!CURRENT_ARG! ) else (
14
echo "!CURRENT_ARG!"\>>"%CONFIG_PATH%/%ARGS_FILE%"
)
)
if "" neq "%LAST_LINKER_ARG%" ( echo
"%LAST_LINKER_ARG%">>"%CONFIG_PATH%/%ARGS_FILE%"
)
exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:build_dll_debug
echo Build started...
"%CPP_BUILDER_HOME%/bin/nmake" /nologo /F "%CONFIG_PATH%/dll_debug.mak" && echo Build SUCCESSFUL && exit /b %ERRORLEVEL%
echo Build FAILED exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:build_dll_release
echo Build started...
"%CPP_BUILDER_HOME%/bin/nmake" /nologo /F "%CONFIG_PATH%/dll_release.mak" && echo Build SUCCESSFUL && exit /b %ERRORLEVEL%
echo Build FAILED exit /b %ERRORLEVEL%
rem -------------------------------------------------------
rem -------------------------------------------------------
:usage
echo "Usage: build.cmd [%DLL_DEBUG_ARG% | %DLL_RELEASE_ARG%]. Default argument is %DEFAULT_ARG%" exit /b %ERRORLEVEL%
rem -------------------------------------------------------
endlocal
1.2.5 CMake
A 0
, make Unix nmake
15
Microsoft. ; *
K . , 0
Mictosoft Visual Studio ' 0
*, i
K , e 0
Build. 4 , i 0
*
K .
0 ,
'.
1. @ e ', i 0 ' -
.
2. ? make- *.
3. &' -
e *.
A e -
: Automake, Cmake, Scons. ?
.
K Cmake, ,
, ' * , - e K .
? Cmake 0K , e K
* make-* *. z '
Microsoft Visual Studio, Nmake makefile, Xcode
Macos, Unix makefile, Watcom makefile, Eclipse Codeblocks.
8 Cmake K Cmakelists.txt
, Cmake. @ e
cmake Cmakelists.txt
' , '
i , makefile, ' , -
e (make, nmake, wmake). '
' , i , e 0
–G .
A Cmake-*.
1 cmake_minimum_required (VERSION 2.6) 2
3 set (PROJECT hello_world)
16
4
5 project (${PROJECT})
6
7 set (HEADERS
8 hello.h)
9
10 set (SOURCES
11hello.cpp
12main.cpp)
13
14 add_executable (${PROJECT} ${HEADERS} ${SOURCES})
0 .
1.e Cmake, i e *.
2.K PROJECT, K
hello_world – e .
3.& i ' . / ${2'x_2;;5u} K , ,
hello_world.
4., i
*, .
5.2 *
, PROJECT, * , -
0 HEADERS SOURCES.
< e, ' K Cmake, e -
, -
*.
' ' *,
add_executable, K
add_library. -
,
SHARED :
add_library (${PROJECT} SHARED ${HEADERS} ${SOURCES})
& 0 ' e
Cmakelists.txt :
1 include_directories (../)
2 add_subdirectory (../Vvƒ_„V„…Vgch^V/build
3bin/Vvƒ_„V„…Vgch^V)
target_link_libraries (${PROJECT} Vvƒ_„V„…Vgch^V)
17
& e , i e (
), e -
*, i 0 0.
Cmake *
build , -
0 ./bin/ 'm_P P.
< *
add_executable K, i - 0 0.
' , ' e, i ' 0 , 0 ' -:
1 cmake_minimum_required (VERSION 2.6) 2
3 set (PROJECT Vvƒ_Z†gh^c‡)
4
5 project (${PROJECT})
6
7 include_directories (../)
8 |
|
9 set (LIBRARIES |
Vvƒ_„V„…Vgch^V_1 |
10 |
|
11 |
Vvƒ_„V„…Vgch^V_2) |
12
13 foreach (LIBRARY ${LIBRARIES})
14add_subdirectory (../${LIBRARY}/build
15bin/${LIBRARY})
16endforeach ()
17 |
|
18 set (HEADERS |
../f‡ˆg…gdg‰Š‹h_Œ‡•…‹) |
19 |
|
20 set (SOURCES |
../Œ‡•…‹_w_†h‡…Vf‡ŽVh•) |
21 |
|
22 |
|
23 add_executable (${PROJECT} ${HEADERS} ${SOURCES}) 24
target_link_libraries (${PROJECT} ${LIBRARIES})
? * Cmake . 5 -
:
18
–e
;
–Cmake 0 '-
;
–Cmake e
;
–Cmake 0 '.
1.3 %. Z .
1.3.15 i
.
1.3.2> , i K
(header-*, *.h), (*.cpp)
, i i K 0 * int main() (*.cpp). & K 55&. < ' * ' , -
e, “5’K-K ”
1.3.3? make-* e -
nmake. make-* K 0 , -
, * -
nmake e , ’ *-
.
1.3.4& e ' nmake, -
, ' *, i 00
, ' e .
1.3.5> bat-*, i K
nmake , i 0 ( -1.3.5 K , i ' 0
).
1.3.6? * CMake e -
cmake. * K 0 , i
0 K 0 , K 0-
* , i K 0
0. & e ' cmake.
1.3.7& -
.
1.3.85* .
19
1.4 1$ !%$
1.4.1< .
1.4.2, i K C++.
1.4.3/ : cpp-* ( –
*: ) h-* ( *: ).
1.4.4mak-*: ' -
release- debug- .
1.4.5* .
1.4.6> -
.
1.4.7* CMakeList.txt.
1.4.8> cmake
.
1.4.9@, i ,
' ' 0
.
1.5 /^$ Z
1.5.1x @ K?
1.5.2& .
1.5.3A '
make nmake, .
1.5.4; e 0 nmake.
1.5.55 e * make-*.
1.5.6x nmake @ K?
1.5.7ƒ mamfile?
1.5.85 e * -
?
1.5.9x 0 K ?
1.5.10x i, i -
IDE?
1.5.11x K ?
1.5.12& CMake, automake, SCons.
20
1.5.135 e i *
CMake?
1.5.14x 0K CMake?
1.5.155 e 0 CMake?
1.5.16x , i
warinings debug?
1.5.17;, , ,
?
1.5.18ƒ “out-of-source”?
1.5.19x '
CMake?
1.5.20x ' -
i?