Простой проект из двух файлов.
//---------
// newfile.h
class CTest {
public:
CTest() {
}
~CTest() {
}
void Print() {
printf("test 1\n");
}
};
//---------
// main.cpp
#include "newfile.h"
int main(int argc, char** argv) {
CTest t;
t.Print();
return (EXIT_SUCCESS);
}
Компилируем и запускаем. В консоли получаем "test 1" - все правильно.
Исправляем "test 1" на "test 2" в файле newfile.h. Компилируем (изменения в файле сохраняются на диск автоматом) и запускаем. В консоли все тот же "test 1".
NetBeans не проверяет зависимости перед сборкой.
Для проекта из нескольких маленьких файлов это не критично - можно сделать ребилд всему проекту, но как быть с большими проектами?
Неужели разработчики NetBeans не тестировали его перед выпуском?
Система Linux, gcc 4.1.2
Это тут при чём? Любая адыкватная IDE? (ну или система сборки) должна отслеживать изменения в каждом файле проекта... тут видимо этого не делается... маразм... уж лучше emacs + autotools
> Любая адыкватная IDE? (ну или система сборки) должна отслеживать изменения в каждом файле проекта...
Должна, но не делает :(
> тут видимо этого не делается... маразм...
Согласен, маразм. Надеюсь это лечится. В настройках NetBeans есть "Enable dependency checking in generated makefiles (Sun Studio make and dmake only)". Естественно, что включение или выключение данной опции не влияет на рез-т.
> В 6.0 нетбинс юзает make, если make не справляется то это не проблемы netbeans, если вам хочется пофекализировать на нетбинс ищите чтото другое.
Празительно, но на той же системе Code::Blocks и KDevelop зависимости просекают корректно.
Если мне не изменяет память, то Code::Blocks использует свою реализацию dependency checker.
Какой смысл называть NetBeans IDE, если элементарную, но очень нужную функцию эта "IDE" выполнить не в состоянии.
Не нужно валить эту беду на gnu make.
Если вам нечего сказать по этой теме, то просто не отвечайте.
>Празительно, но на той же системе Code::Blocks и KDevelop зависимости просекают корректно. Если мне не изменяет память, то Code::Blocks использует свою реализацию dependency checker.
Можете свою написать или указать в каком месте кривость make повлияла на нетбинс.
> Можете свою написать или указать в каком месте кривость make повлияла на нетбинс.
Я не пытаюсь оскорбить ваши чувства по отношению к NetBeans. Меня интересует только способ решения поставленного мной вопроса. Если решения нет, то я и дальше буду пользоваться VIM и Code::Blocks.
Просто последний весьма ужасен под Mac OS X.
> Курите конфигурацию make, если она может решит вашу проблему то хорошо, иначе используйте другую систему сборки.
Из мана по make "make updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist."
Но как оно работает?
Так же нашел опцию:
-o file, --old-file=file, --assume-old=file
Do not remake the file file even if it is older than its dependencies, and do not remake anything on account of changes in file.
Essentially the file is treated as very old and its rules are ignored.
Такое ощущение, что нетбинс использует ее во всех случаях кроме полного ребилда проекта.
Оптимизация времени сборки, млин.
Как уже здесь посоветовали - используйте другую систему сборки. Я пользуюсь CMake под Eclipse, KDevelop и для ручной сборки. Думаю и в NetBeans должен встраиваться без проблем. Вообще зависимость проекта от IDE считаю моветоном, тот же CMake позволяет легко сменить один редактор на другой без каких либо усилий.
> Хотя, надо сказать, под Виндами на MS Visual Studio все живут и не дёргаются по этому поводу - она тоже это не умеет отслеживать.
MS VS в частности и даже MS вообще можно не любить, но зачем неправду-то говорить? Visual Studio (для определенности 2003) отслеживает зависимости от заголовочных файлов.
Более того, это прекрасно отслеживается и в той же Anjuta, да и вообще в любой среде, которая правильно генерит Makefile`ы :) ты так кстати и не показал, что же нетбинс пишет в Makefile, давай глянем? ;)
> Более того, это прекрасно отслеживается и в той же Anjuta, да и вообще в любой среде, которая правильно генерит Makefile`ы :) ты так кстати и не показал, что же нетбинс пишет в Makefile, давай глянем? ;)
Был на даче.
Но, сдается мне, проблема в параметре "-o" - именно он прописан как опция. И исправить / удалить его не удается.
--- Makefile ---
#
# There exist several targets which are by default empty and which can be
# used for execution of your targets. These targets are usually executed
# before and after some main targets. They are:
#
# .build-pre: called before 'build' target
# .build-post: called after 'build' target
# .clean-pre: called before 'clean' target
# .clean-post: called after 'clean' target
# .clobber-pre: called before 'clobber' target
# .clobber-post: called after 'clobber' target
# .all-pre: called before 'all' target
# .all-post: called after 'all' target
# .help-pre: called before 'help' target
# .help-post: called after 'help' target
#
# Targets beginning with '.' are not intended to be called on their own.
#
# Main targets can be executed directly, and they are:
#
# build build a specific configuration
# clean remove built files from a configuration
# clobber remove all built files
# all build all configurations
# help print help mesage
#
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
# .help-impl are implemented in nbproject/makefile-impl.mk.
#
# NOCDDL
# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
# build
build: .build-pre .build-impl .build-post
.build-pre:
# Add your pre 'build' code here...
.build-post:
# Add your post 'build' code here...
# clean
clean: .clean-pre .clean-impl .clean-post
.clean-pre:
# Add your pre 'clean' code here...
.clean-post:
# Add your post 'clean' code here...
# clobber
clobber: .clobber-pre .clobber-impl .clobber-post
.clobber-pre:
# Add your pre 'clobber' code here...
.clobber-post:
# Add your post 'clobber' code here...
# all
all: .all-pre .all-impl .all-post
.all-pre:
# Add your pre 'all' code here...
.all-post:
# Add your post 'all' code here...
# help
help: .help-pre .help-impl .help-post
.help-pre:
# Add your pre 'help' code here...
.help-post:
# Add your post 'help' code here...
# include project implementation makefile
include nbproject/Makefile-impl.mk
--------------
--- nbproject/Makefile-impl.mk ---
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a pre- and a post- target defined where you can add customization code.
#
# This makefile implements macros and targets common to all configurations.
#
# NOCDDL
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
# and .clean-reqprojects-conf unless SUB has the value 'no'
SUB_no=NO
SUBPROJECTS=${SUB_${SUB}}
BUILD_SUBPROJECTS_=.build-subprojects
BUILD_SUBPROJECTS_NO=
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
CLEAN_SUBPROJECTS_=.clean-subprojects
CLEAN_SUBPROJECTS_NO=
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
# Project Name
PROJECTNAME=test
# Active Configuration
DEFAULTCONF=Debug
CONF=${DEFAULTCONF}
# All Configurations
ALLCONFS=Debug Release
# build
.build-impl: .validate-impl
@#echo "=> Running $@... Configuration=$(CONF)"
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf
# clean
.clean-impl: .validate-impl
@#echo "=> Running $@... Configuration=$(CONF)"
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf
# clobber
.clobber-impl:
@#echo "=> Running $@..."
for CONF in ${ALLCONFS}; \
do \
${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
done
# all
.all-impl:
@#echo "=> Running $@..."
for CONF in ${ALLCONFS}; \
do \
${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \
done
# configuration validation
.validate-impl:
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
then \
echo ""; \
echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
echo "See 'make help' for details."; \
echo "Current directory: " `pwd`; \
echo ""; \
fi
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
then \
exit 1; \
fi
# help
.help-impl:
@echo "This makefile supports the following configurations:"
@echo " ${ALLCONFS}"
@echo ""
@echo "and the following targets:"
@echo " build (default target)"
@echo " clean"
@echo " clobber"
@echo " all"
@echo " help"
@echo ""
@echo "Makefile Usage:"
@echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
@echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
@echo " make [SUB=no] clobber"
@echo " make [SUB=no] all"
@echo " make help"
@echo ""
@echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
@echo " also build subprojects."
@echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
@echo " also clean subprojects."
@echo "Target 'clobber' will remove all built files from all configurations and,"
@echo " unless 'SUB=no', also from subprojects."
@echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
@echo " also build subprojects."
@echo "Target 'help' prints this message."
@echo ""
----------
# Makefile-Release.mk
#
# Gererated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.
#Makefile-Debug.mk
#
# Gererated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.
если заменить
${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
$(COMPILE.cc) -O2 -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp
на
${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp <path to newfile.h>/newfile.h
${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
$(COMPILE.cc) -O2 -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp
то я уверен всё будет работать ;)
Да, это поможет, но при добавлении в проект файлов придется каждый раз править руками. В большом и активно растущем проекте править Makefile каждый раз руками несколько не удобно.